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

相关推荐
花月C8 小时前
AI驱动的竞品分析多Agent协作系统设计理论
人工智能·python·ai·agent·ai编程
abcy0712138 小时前
python InsecureClient 上传下载查看删除实例
python·hdfs
MATLAB代码顾问8 小时前
Python NumPy数值计算核心指南
开发语言·python·numpy
FBI HackerHarry浩8 小时前
修改Pycharm2023.2.5连接数据库创建的SQL文件保存的默认位置
python·pycharm
老徐聊GEO8 小时前
AI搜索获客:亲测有效的实践案例分享
大数据·人工智能·python
HKkuaidou8 小时前
基于深度学习的药用草本植物识别系统
pytorch·python·深度学习·resnet
AINative软件工程8 小时前
LLM 应用的 Canary 发布工程实践:模型升级不停服的灰度切流、回滚与流量染色
openai
码云骑士9 小时前
05-Python字典底层原理-Hash表与有序性的真相
开发语言·python·哈希算法
Cloud_Shy6189 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 44 - 47)
开发语言·人工智能·经验分享·笔记·python
mxlwd1689 小时前
movielen 100k lr模型训练过程
开发语言·python·机器学习