基于LangChain+Streamlit+Gemini Pro的网站聊天多轮请求错误排查
问题解决:Gemini Pro多轮对话格式错误
问题场景
使用LangChain、Streamlit结合Gemini Pro搭建网站对话聊天功能,存储聊天记录并传入模型时触发以下错误:
langchain_google_genai.chat_models.ChatGoogleGenerativeAIError: Invalid argument provided to Gemini: 400 Please ensure that multiturn requests alternate between user and model.
错误原因
Gemini对多轮对话的消息序列有严格要求:必须严格交替用户消息和模型消息,不能出现连续的同角色消息。当前代码存在两处不符合要求的地方:
- 初始聊天历史不规范:初始
chat_history只包含一条AIMessage,没有对应的前置用户消息,对话起始为模型消息,违反交替规则。 - 历史感知检索器的Prompt结构错误:在
get_context_retriver_chain函数的Prompt中,连续添加了两条用户角色的消息,导致生成的对话序列出现连续用户消息。
修复方案
1. 修正初始聊天历史
将初始聊天历史调整为合理的交替序列,确保对话从用户消息起始:
if "chat_history" not in st.session_state: st.session_state.chat_history = [ HumanMessage(content="你好!"), AIMessage(content="你好,我是机器人,有什么可以帮你的?") ]
2. 修复历史感知检索器的Prompt结构
合并连续的用户消息,避免同角色消息连续出现:
def get_context_retriver_chain(retriver): llm = ChatGoogleGenerativeAI(model="gemini-pro", temperature=0.7, top_p=0.85) prompt = ChatPromptTemplate.from_messages([ MessagesPlaceholder(variable_name="chat_history"), ("user", "{input}\n\n根据上面的对话,生成一个搜索查询词,用于查找和对话相关的信息") ]) retriever_chain = create_history_aware_retriever(llm, retriver, prompt) return retriever_chain
3. 优化聊天记录更新逻辑
确保每次用户输入后,先添加用户消息到历史,再添加模型回复,严格保持交替顺序:
if user_query is not None and user_query != "": # 先添加用户消息 st.session_state.chat_history.append(HumanMessage(content=user_query)) # 获取模型回复 response = get_response(user_query) # 再添加模型消息 st.session_state.chat_history.append(AIMessage(content=response))
完整修改后的关键代码片段
# 修正初始聊天历史 if "chat_history" not in st.session_state: st.session_state.chat_history = [ HumanMessage(content="你好!"), AIMessage(content="你好,我是机器人,有什么可以帮你的?") ] # 修复历史感知检索器的Prompt def get_context_retriver_chain(retriver): llm = ChatGoogleGenerativeAI(model="gemini-pro", temperature=0.7, top_p=0.85) prompt = ChatPromptTemplate.from_messages([ MessagesPlaceholder(variable_name="chat_history"), ("user", "{input}\n\n根据上面的对话,生成一个搜索查询词,用于查找和对话相关的信息") ]) retriever_chain = create_history_aware_retriever(llm, retriver, prompt) return retriever_chain # 优化聊天记录更新 if user_query is not None and user_query != "": st.session_state.chat_history.append(HumanMessage(content=user_query)) response = get_response(user_query) st.session_state.chat_history.append(AIMessage(content=response))
内容的提问来源于stack exchange,提问作者shahil
相关产品推荐
相关产品推荐

