You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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对多轮对话的消息序列有严格要求:必须严格交替用户消息和模型消息,不能出现连续的同角色消息。当前代码存在两处不符合要求的地方:

  1. 初始聊天历史不规范:初始chat_history只包含一条AIMessage,没有对应的前置用户消息,对话起始为模型消息,违反交替规则。
  2. 历史感知检索器的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:12:08