Python中使用OpenAI实现AI问答:流式返回、记忆存储与工具调用详解

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": ""})  # 占位,后续可追加内容
    # (注意:实际中应从流中收集完整内容再添加)

⚠️ 注意:在真实项目中,建议使用 asyncasyncio 来处理流式数据,并将完整响应拼接后存入 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 开发实战技巧!

相关推荐
2301_764441332 小时前
python实现罗斯勒吸引子(Rössler Attractor)
开发语言·数据结构·python·算法·信息可视化
曲幽2 小时前
FastAPI数据库实战:从SQLAlchemy原理到高效连接管理,告别性能瓶颈
python·sqlite·flask·fastapi·web·sqlalchemy·db
dagouaofei2 小时前
2026 年工作计划 PPT 制作,AI 自动生成是否真的省时
python·powerpoint
袁袁袁袁满2 小时前
Python使用uuid生成唯一密钥uid详细教程
开发语言·python·uuid·唯一密钥uid
佑白雪乐2 小时前
<Python基础第2集>速通list+tuple+string+序列+set+dict容器
windows·python·list
qq_336313933 小时前
java基础-IO流(随机点名器)
java·开发语言·python
liu****3 小时前
深度学习简介
人工智能·python·深度学习·python基础
无垠的广袤3 小时前
【工业树莓派 CM0 NANO 单板计算机】基于舵机和人脸识别的智能门禁系统
linux·python·opencv·yolo·ai·树莓派