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

如何在Python中让Gemini API利用对话历史/上下文推理?

解决Gemini API未利用对话历史的问题

问题分析

你当前代码的核心问题是没有正确处理流式响应的返回结果,且对异步聊天接口的使用流程有误。另外,使用streamGenerateContent时,需要通过构造多轮对话的contents参数传递历史,而非单独的history参数。

修正方案一:修复异步聊天接口的使用

调整代码中处理响应的逻辑,正确遍历流式返回内容,同时确保对话历史构造正确:

import asyncio
import google.genai as genai

async def call_gemini(user_api_key=None, environment_gemini_api_key=None, model="gemini-2.0-flash", query="What is x+y?", context=None):
    # 初始化客户端
    if user_api_key is not None:
        client = genai.Client(api_key=user_api_key)
    else:
        client = genai.Client(api_key=environment_gemini_api_key)

    history = []
    developer_input = ''.join(line.content for line in context if line.role == "developer")
    if not developer_input:
        developer_input = ""
        
    # 构造对话历史
    for line in context:
        if line.role == "user":
            history.append(genai.types.Content(
                role="user",
                parts=[genai.types.Part(text=line.message)],
            ))
        elif line.role == "ai":
            history.append(genai.types.Content(
                role="model",
                parts=[genai.types.Part(text=line.message)],
            ))

    # 创建异步聊天实例
    chat = client.aio.chats.create(
        model=model,
        config=genai.types.GenerateContentConfig(
            system_instruction=developer_input
        ),
        history=history
    )

    # 发送消息并处理流式响应
    response = chat.send_message_stream(message=query)
    async for chunk in response:
        if chunk.text:
            print(chunk.text)
    
    # 若需查看包含新回复的完整对话历史,可启用以下代码
    # full_history = await chat.get_history()
    # for content in full_history:
    #     print(f"{content.role}: {content.parts[0].text}")

# 示例调用
if __name__ == "__main__":
    # 模拟context结构
    class ContextLine:
        def __init__(self, role, message, content=""):
            self.role = role
            self.message = message
            self.content = content

    context = [
        ContextLine(role="user", message="Given that x is equal to 5."),
        ContextLine(role="user", message="And that y is equal to 6.")
    ]
    asyncio.run(call_gemini(context=context))

关键修正点:

  • 使用async for遍历send_message_stream返回的流式响应块,获取模型实时回复
  • 若要查看包含新回复的完整对话历史,需调用异步方法await chat.get_history()

修正方案二:使用generate_content_stream接口传递历史

该接口无单独history参数,需将历史对话和当前查询拼接成contents列表,按对话顺序传入:

import google.genai as genai

def call_gemini_stream(user_api_key=None, environment_gemini_api_key=None, model="gemini-2.0-flash", query="What is x+y?", context=None):
    # 初始化客户端
    if user_api_key is not None:
        client = genai.Client(api_key=user_api_key)
    else:
        client = genai.Client(api_key=environment_gemini_api_key)

    developer_input = ''.join(line.content for line in context if line.role == "developer")
    if not developer_input:
        developer_input = ""
        
    # 构造完整对话序列:历史消息 + 当前查询
    contents = []
    for line in context:
        if line.role == "user":
            contents.append(genai.types.Content(
                role="user",
                parts=[genai.types.Part(text=line.message)],
            ))
        elif line.role == "ai":
            contents.append(genai.types.Content(
                role="model",
                parts=[genai.types.Part(text=line.message)],
            ))
    # 添加当前查询
    contents.append(genai.types.Content(
        role="user",
        parts=[genai.types.Part(text=query)],
    ))

    # 调用流式生成接口
    response = client.generate_content_stream(
        model=model,
        contents=contents,
        system_instruction=developer_input
    )

    # 处理流式响应
    for chunk in response:
        if chunk.text:
            print(chunk.text)

# 示例调用
if __name__ == "__main__":
    class ContextLine:
        def __init__(self, role, message, content=""):
            self.role = role
            self.message = message
            self.content = content

    context = [
        ContextLine(role="user", message="Given that x is equal to 5."),
        ContextLine(role="user", message="And that y is equal to 6.")
    ]
    call_gemini_stream(context=context)

关键说明:

  • generate_content_stream通过contents参数接收多轮对话,列表元素按对话顺序排列,角色需正确设置为user或model
  • 当前查询作为最后一条user角色的内容加入列表

内容的提问来源于stack exchange,提问作者Zeezan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:48:15