LangChain中language占位符未生效,回复始终为英文问题求助
问题原因分析与解决方案
核心问题与原因
- System Prompt指令不够明确:原prompt仅要求"用{language}回答",若用户输入为英文,模型可能默认沿用英文回复,需要更强制的指令约束。
- 手动重复维护会话历史:你既通过
session_history.add_message(human_message)手动添加用户消息,又在invoke调用中传入messages=[human_message],导致会话历史出现重复消息,干扰模型对指令的理解。 - 历史管理逻辑冗余:
RunnableWithMessageHistory本身会自动处理会话历史的添加与合并,手动操作属于重复劳动,还可能引发逻辑冲突。
修正后的代码
# Securely input the OpenAI API key api_key = os.getenv("OPENAI_API_KEY") # Initialize the ChatOpenAI model with the API key model = ChatOpenAI(model="gpt-3.5-turbo", api_key=api_key, verbose=True) # 将prompt和链初始化移到函数外,避免重复创建 prompt = ChatPromptTemplate.from_messages( [ ("system", "You are a helpful assistant. Strictly answer all questions in {language}, no matter what language the user uses."), MessagesPlaceholder(variable_name="history"), ] ) chain = prompt | model def invoke_model(session_id: str, message: str): with_message_history = RunnableWithMessageHistory( chain, get_session_history, input_messages_key="new_message", history_messages_key="history" ) config = {"configurable": {"session_id": session_id}} # 仅传入新消息和language参数,让RunnableWithMessageHistory自动管理历史 response = with_message_history.invoke( {"new_message": HumanMessage(content=message), "language": "Spanish"}, config=config ) return response.content
关键调整说明
- 强化指令约束:修改system prompt,明确要求模型"无论用户使用什么语言,都严格用指定语言回复",消除模型的歧义空间。
- 规范历史管理:通过
input_messages_key指定新消息的参数名,history_messages_key关联prompt中的历史占位符,让RunnableWithMessageHistory自动完成消息添加与历史合并,彻底移除手动维护历史的代码。 - 优化资源利用:将prompt和链的初始化移到函数外,避免每次调用都重复创建,提升运行效率。
额外验证建议
如果修改后仍不生效,可以:
- 借助
verbose=True查看实际发送给模型的prompt内容,确认{language}是否被正确替换为目标语言。 - 测试时使用明确的多语言输入,比如用中文提问,验证模型是否按指定语言回复。
内容的提问来源于stack exchange,提问作者airsoftFreak
相关产品推荐
相关产品推荐

