如何在Azure OpenAI Chat Completion中实现最近3轮对话历史功能?
Azure OpenAI Chat Completion 对话上下文实现方案
Azure OpenAI Chat Completion本身没有内置的会话内存机制,需要自行维护对话历史来实现上下文感知。以下是针对你的需求(保留最近3轮对话)的具体实现方案:
核心思路
- 维护对话历史列表:保存用户与助手的交互消息,每条消息包含
role(user/assistant)和content字段。 - 控制历史长度:仅保留最近3轮完整交互(即3组用户提问+助手回答,共6条消息),避免上下文过长导致token浪费或性能问题。
- 构造请求消息:每次调用API时,将系统提示、历史对话、当前用户提问组合成完整的消息列表传给模型。
修改后的代码实现
from openai import AzureOpenAI # 全局初始化Azure OpenAI客户端(避免每次调用函数重复创建) client = AzureOpenAI( api_key="xxxx", azure_deployment="xxxxx", azure_endpoint="xxxxx", api_version="xxxx" ) # 维护对话历史,最多保存3轮交互(6条消息:3个user + 3个assistant) conversation_history = [] def bot_response(query): global conversation_history # 构造当前用户消息 user_msg = {"role": "user", "content": query} # 组合完整的消息列表:系统提示 + 历史对话 + 当前用户消息 messages = [ { "role": "system", "content": ("Instructions:\n" "do stuff\n" ) } ] + conversation_history + [user_msg] # 调用Azure OpenAI Chat Completion API chat_completion = client.chat.completions.create( messages=messages, model="gpt-4", response_format={"type": "json_object"} ) assistant_response = chat_completion.choices[0].message.content # 构造助手消息并添加到历史 assistant_msg = {"role": "assistant", "content": assistant_response} conversation_history.extend([user_msg, assistant_msg]) # 保留最近3轮交互(最多6条消息),超出则删除最早的一轮 if len(conversation_history) > 6: conversation_history = conversation_history[2:] return assistant_response
说明
- 客户端初始化:将
AzureOpenAI客户端放在函数外部全局初始化,避免每次调用bot_response时重复创建连接,提升效率。 - 历史维护:每次交互后将用户消息和助手消息加入历史,当历史长度超过6时,移除最前面的两条消息(最早的一轮对话),确保始终保留最近3轮。
- 消息构造:API请求的
messages参数包含系统提示、历史对话和当前提问,模型会基于这些上下文生成响应。
如果需要更灵活的历史管理(比如按token数限制而非轮数),可以额外计算每条消息的token占用,再截断历史,但按轮数限制是最直接的实现方式。
内容的提问来源于stack exchange,提问作者user3476463
相关产品推荐
相关产品推荐

