
使用 Gradio、LLaMA 和 OLLAMA 建立文字冒險遊戲
自 GPT-2 以來,開發者一直使用大型語言模型(LLM)來開發文字遊戲,但設定起來很困難。有了 Gradio、LLaMA 3 和 OLLAMA,在你自己的電腦上免費本地運行文字遊戲變得超級簡單。
在冒險開始之前,你可以了解更多關於 Gradio、LLaMA 和 ollama 的背景: 使用 Ollama 運行您自己的 ChatGPT 和 Copilot
就像上面的部落格文章一樣,將使用 ollama API,建議使用 llama3
模型。假設你已經拉取了模型:def generate_chat_response(prompt, history = None, model= 'llama3:instruct'):
if model is None:
model = shared.selected_model
messages = []
if history:
for u, a in history:
messages.append({"role": "user", "content": u})
messages.append({"role": "assistant", "content": a})
messages.append({"role": "user", "content": prompt})
data = {"model": model, "stream": False, "messages": messages}
response = requests.post(
config.ollama_url + "chat",
headers={"Content-Type": "application/json", "Connection": "close"},
data=json.dumps(data),
)
if response.status_code == 200:
bot_message = json.loads(response.text)["message"]["content"]
return bot_message
else:
print("Error: generate response:", response.status_code, response.text)
遊戲介面

遊戲介面不太直觀,但在這篇部落格文章中應該很容易解釋:
import gradio as gr
# Game Interface
with gr.Blocks() as demo:
textbox = gr.Textbox(elem_id="input_box", lines=3, min_width=800)
chatbot = gr.Chatbot(show_copy_button=True, layout="panel")
submit_btn = gr.Button(value="Submit")
with gr.Blocks():
nem_game = gr.ClearButton(value='New Game', components = [chatbot])
chat_interface = gr.ChatInterface(
fn=take_action,
textbox=textbox,
chatbot=chatbot,
submit_btn=submit_btn,
retry_btn=None,
undo_btn=None,
)
nem_game.click(fn=start_new_game, output=chat_interface.chatbot_state)
if __name__ == "__main__":
demo.launch()
除了使用 Gradio 設定遊戲介面外,當按下「New Game」按鈕時,關於遊戲背景和規則的指令會發送給 LLM。一個非常好的遊戲指令範例可以在 https://github.com/fladdict/llm_games 找到。將 <to be inserted> 替換為提示詞:
game_prompt = """
<to be inserted>
"""
game_instruction = ""
def start_new_game():
global game_instruction
response = generate_chat_response(prompt=game_prompt)
game_instruction = response
# clean up chat history
return []
game_instruction 的副本被保存以供稍後使用。
以下是按下「New Game」按鈕時 LLM 回應的範例:
玩家現在可以按照指示開始玩遊戲,並輸入他們的行動。
然而,Gradio 中的聊天機器人組件不知道遊戲提示詞和指令。這是因為我們在開始新遊戲時跳過使用聊天機器人與 LLM 通訊。為了解決這個問題,take_action 函數幫助將提示詞和指令放在歷史記錄的開頭,然後將它們傳遞給 LLM:
def take_action(prompt, history = None, model = None):
global game_instruction
global game_prompt
starting = [(game_prompt, game_instruction)]
if len(history) > 0:
starting.extend(history)
return generate_chat_response(prompt, history=starting)
讓我們開始冒險吧!
我的冒險
以下是我在撰寫時的冒險:

遊戲開始崩潰。它不再回應故事進度,而是回應多項選擇,與之前的回應不同。這是因為聊天歷史已經達到 8k 個 token,這是模型一次可以處理的最大 token 數量。我們如何解決這個問題?我們可以使用支援更多上下文的不同模型嗎?還是我們應該總結故事進度,然後將其傳遞給模型?這是你真正的冒險了!


留言
請接受「功能性」Cookie 類別以查看和發表留言。
留言載入失敗。您可以重試,或前往 GitHub 查看討論。
在 GitHub 上查看