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 开发实战技巧!

相关推荐
gwf21619 分钟前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
爱吃提升33 分钟前
python 分布式爬虫、爬虫合规与综合实战项目
分布式·爬虫·python
审小匠OpenCPAi34 分钟前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
元Y亨H2 小时前
Pandas 解析 Excel 导致的内存溢出(MemoryError)
python·excel
金銀銅鐵2 小时前
[Python] 用 turtle 来绘制瑞典国旗
python
Albert Edison2 小时前
【GUI 自动化测试】Pywinauto 常见操作
自动化测试·python·pywinauto
海兰2 小时前
【高速缓存】RedisVL为文本生成嵌入向量实践指南
人工智能·python·机器学习
2601_955760073 小时前
如何用 Claude Opus 5 API 批量扩展长尾关键词和文章选题
前端·python·搜索引擎
艾斯特_3 小时前
从模型调用到可用聊天应用:会话状态与消息协议
python·ai·aigc
Marst Code3 小时前
Python 3.9 已停止维护!从 3.9 到 3.14 全版本深度对比,生产环境该选哪个?
开发语言·python