如何在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
相关产品推荐
相关产品推荐

