AI文本冒险游戏自动补全玩家输入及LLMChain语法问题
解决AI文本冒险游戏的两类问题:AI交互异常与LLMChain弃用替代
一、LLMChain未识别(已废弃)的替代方案
LangChain v0.1版本后,LLMChain已被标记为废弃,官方推荐使用Runnable接口或轻量化链构建方式,以下是两种可行替代方案:
- 方案1:使用
create_chain工具函数
从langchain.chains导入create_chain,结合PromptTemplate与LLM实例构建链,示例代码:from langchain_core.prompts import PromptTemplate from langchain_openai import OpenAI from langchain.chains import create_chain prompt = PromptTemplate.from_template("你是文本冒险游戏的GM,描述当前场景:{scene},等待玩家输入行动指令。") llm = OpenAI(temperature=0.7) chain = create_chain(prompt, llm) - 方案2:直接使用Runnable组合
借助LangChain的Runnable接口,通过|运算符直接组合Prompt与LLM,写法更简洁:
调用链的方式与原LLMChain一致,使用from langchain_core.prompts import PromptTemplate from langchain_openai import OpenAI prompt = PromptTemplate.from_template("你是文本冒险游戏的GM,描述当前场景:{scene},等待玩家输入行动指令。") llm = OpenAI(temperature=0.7) chain = prompt | llmchain.invoke({"scene": "幽暗的森林入口"})即可。
二、AI自动补全玩家输入、交互后停止响应的解决思路
1. 优化Prompt,明确角色边界
AI越界生成玩家输入的核心原因是Prompt未清晰划分GM(AI)与玩家的职责,需在Prompt中明确:
- AI仅负责生成场景描述、剧情反馈,绝对不能替玩家输入行动指令
- 每次响应结尾必须固定提示玩家输入,比如以
"请输入你的行动:"结尾
示例Prompt:
prompt = PromptTemplate.from_template(""" 你是文本冒险游戏的GM,仅负责推进剧情、描述场景或反馈玩家行动,绝对不能模拟玩家输入任何内容。 当前剧情上下文:{history} 请根据上文生成场景描述或行动反馈,结尾必须提示玩家输入,格式为: [场景/反馈内容] 请输入你的行动: """)
2. 设置停止令牌(Stop Tokens)
在LLM实例初始化时设置stop参数,让AI生成到指定内容时自动停止,避免越界输出。比如约定提示玩家输入的语句为固定结尾,可设置:
llm = OpenAI(temperature=0.7, stop=["请输入你的行动:"])
3. 上下文长度管理
交互几次后AI停止响应,大概率是累积的上下文超出LLM的上下文窗口限制,可通过两种方式处理:
- 截断旧上下文:仅保留最近N轮的交互记录,比如只保留最近3轮的GM与玩家对话
- 上下文摘要压缩:对早期剧情进行摘要,减少总token占用
示例截断代码:
# history为存储交互记录的列表,每轮包含GM和玩家的内容 history.append({"role": "gm", "content": "幽暗的森林入口,你看到一只灰狼..."}) history.append({"role": "player", "content": "我拔出剑攻击灰狼"}) # 保留最近3轮(6条记录) if len(history) > 6: history = history[-6:]
4. 调整LLM参数
- 降低
temperature参数:设置为0.5-0.7,减少AI的发散性,降低越界生成概率 - 增加
max_tokens参数:确保AI有足够token生成完整的场景描述,避免中途截断
内容的提问来源于stack exchange,提问作者BakhtiarHossain
相关产品推荐
相关产品推荐

