Python中使用OpenAI实现AI问答:流式返回、记忆存储与工具调用详解
在现代人工智能应用开发中,OpenAI 提供的强大 API 为开发者构建智能对话系统提供了极大的便利。本文将详细介绍如何使用 Python 结合 OpenAI 的 API,实现一个完整的 AI 问答系统,涵盖以下几个核心功能:
- 流式返回(Streaming Response):实时逐字输出回答,提升用户体验。
- 记忆存储(Memory Management):通过上下文管理保持对话历史,使 AI 能够理解连续对话。
- 工具类调用(Tool Calling):让 AI 可以调用外部工具,如计算、查询等,增强其实际应用能力。
1. 环境准备
首先,确保你已安装 openai 库:
bash
pip install openai
并设置你的 OpenAI API 密钥(可在 OpenAI 官网 获取):
python
import os
os.environ["OPENAI_API_KEY"] = "your-api-key-here"
2. 流式返回(Streaming Response)
流式返回是 OpenAI API 支持的一项重要特性,它允许我们实时接收模型生成的文本,而不是等待整个响应完成。这在聊天应用中特别有用,能模拟"打字机"效果,提升交互体验。
代码示例:流式输出回答
python
import openai
# 使用流式调用
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "请告诉我今天的天气如何?"}
],
stream=True # 启用流式返回
)
print("AI 回答:")
for chunk in response:
if chunk.choices[0].delta.get("content") is not None:
print(chunk.choices[0].delta.content, end="", flush=True)
print() # 换行结束
流式返回的结果是什么样子?
当你运行上述代码时,你会看到类似以下的输出效果(逐字显示):
AI 回答:今天天气晴朗,气温在20度左右,适合外出活动。
实际上,输出是逐字出现的,例如:
AI 回答:今...
AI 回答:今天...
AI 回答:今天天气...
AI 回答:今天天气晴朗...
...(持续逐字输出)
这种效果可以让你的用户界面更自然,仿佛 AI 正在「思考并打字」。
3. 记忆存储(对话上下文管理)
为了让 AI 能记住之前的对话内容,我们需要在每次请求中携带历史消息。这可以通过维护一个消息列表来实现。
示例:保持对话记忆
python
messages = [
{"role": "system", "content": "你是一个有帮助的助手。"}
]
while True:
user_input = input("你:")
if user_input.lower() == "quit":
break
messages.append({"role": "user", "content": user_input})
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages,
stream=True
)
print("AI:")
for chunk in response:
if chunk.choices[0].delta.get("content") is not None:
print(chunk.choices[0].delta.content, end="", flush=True)
print()
# 将 AI 的回复加入历史记录
messages.append({"role": "assistant", "content": ""}) # 占位,后续可追加内容
# (注意:实际中应从流中收集完整内容再添加)
⚠️ 注意:在真实项目中,建议使用
async和asyncio来处理流式数据,并将完整响应拼接后存入messages列表。
4. 工具类调用(Tool Calling)
OpenAI 支持通过 tools 参数让模型主动调用外部工具。例如,我们可以定义一个工具用于计算两个数的和。
定义工具并调用
python
tools = [
{
"type": "function",
"function": {
"name": "add_numbers",
"description": "计算两个数字的和",
"parameters": {
"type": "object",
"properties": {
"a": {"type": "number", "description": "第一个数字"},
"b": {"type": "number", "description": "第二个数字"}
},
"required": ["a", "b"]
}
}
}
]
# 发起带有工具调用的请求
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=[{"role": "user", "content": "计算 5 加 7 的结果。"}],
tools=tools,
tool_choice="auto" # 自动选择工具调用
)
# 检查是否调用了工具
if response.choices[0].finish_reason == "tool_calls":
tool_call = response.choices[0].message.tool_calls[0]
function_name = tool_call.function.name
arguments = tool_call.function.arguments
print(f"调用工具:{function_name}({arguments})")
# 手动执行计算(此处简化为直接返回)
result = eval(f"{function_name}({arguments['a']}, {arguments['b']})")
print(f"结果:{result}")
else:
print("未调用工具,直接回答:", response.choices[0].message.content)
✅ 这种方式可用于集成计算器、数据库查询、日历操作等真实工具,极大扩展 AI 的实用能力。
总结
通过本教程,你已经掌握了使用 Python 实现一个高级 AI 问答系统的四大关键技术:
| 功能 | 说明 |
|---|---|
| 流式返回 | 实现"打字机"效果,提升交互感 |
| 记忆存储 | 保持对话上下文,支持多轮对话 |
| 工具调用 | 让 AI 调用外部能力,增强实用性 |
| 完整流程 | 从输入到输出,全流程整合 |
这些技术组合起来,可以构建出真正可用的智能客服、个人助理或知识问答系统。
📌 提示 :生产环境中建议使用 async 异步处理、缓存机制、错误重试和限流策略,确保系统稳定可靠。
欢迎关注我的 CSDN 博客,获取更多 AI 开发实战技巧!