惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
F
Fortinet All Blogs
云风的 BLOG
云风的 BLOG
MyScale Blog
MyScale Blog
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
腾讯CDC
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
B
Blog RSS Feed
I
InfoQ
N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
H
Help Net Security
L
LangChain Blog
M
MIT News - Artificial intelligence
Y
Y Combinator Blog
aimingoo的专栏
aimingoo的专栏

慕雪的寒舍

【Linux】腾讯云服务器被攻击后,我是怎么排查挖矿木马的 【Agent】Multica使用心得 【AI】叙界S3备份需求,多Agent赛马 【Nginx】使用OpenResty Lua拦截Artalk广告昵称 【AI】给Codex加上rm防误删Hook 【AI】渐进式披露能省Token,但要管住Agent Loop 【Mac】修改Mac的hostname,告别局域网IP乱入 【随笔】招商银行visa金卡申请和绑定海外谷歌账户支付 【工具】用AI随手写博客 【测开】adb shell am start 启动跳链时 & 符号被截断的解决方法 【Appium】安装 xcuitest 驱动时 npm install 报错的解决方法 【2026】新年快乐! 【Mac】解决MacBook WiFi玄学问题“连上WiFI但是没网络”的折腾经历 【AI】智谱AutoGLM部署教程:AutoDL云服务器+本地PhoneAgent配置 【Agent.10】OpenAI接口输出格式约束(response_format) 【Agent.09】LangChain里面使用MCP工具 【Hexo】简单记录如何在服务器上部署hexo-friend-article 【ConfyUI】在MacBook上用ConfyUI部署阿里Z-Image最新开源模型 【AI】AI老是喜欢写总结文档,咋办? 【Agent.08】LangChain的第一个Demo:从零开始构建Agent 【Mac】MacBookPro无法连接第2个外接显示器问题解决 【Mac】为Mac配置基本开发环境 【Agent.07】什么是Agent?从Chat到ReAct的AI进化之路 【Agent.05】OpenAI接口Function Calling工具调用详解 【MCP】无敌了,chrome-devtools-mcp杀死浏览器AI自动化的比赛! 【随笔】本地部署AI的现状和AI本地部署的价值
【Agent.06】使用openai sdk实现多轮对话
慕雪年华 · 2025-10-25 · via 慕雪的寒舍

距离上次更新本文已经过去了 198 天,文章部分内容可能已经过时,请注意甄别。

欢迎阅读慕雪撰写的AI Agent专栏,本专栏目录如下

  1. 【MCP】详细了解MCP协议:和function call的区别何在?如何使用MCP?
  2. 【AI】AI对26届及今后计算机校招的影响
  3. 【Agent.01】AI Agent智能体开发专题引言
  4. 【Agent.02】市面上常见的大模型有哪些?
  5. 【Agent.03】带你学会写一个基础的Prompt
  6. 【Agent.04】AI时代的hello world:调用OpenAI接口,与大模型交互
  7. 【Agent.05】OpenAI接口Function Calling工具调用详解
  8. 【Agent.06】使用openai sdk实现多轮对话
  9. 【Agent.07】什么是Agent?从Chat到ReAct的AI进化之路
  10. 【Agent.08】LangChain的第一个Demo:从零开始构建Agent
  11. 【Agent.09】LangChain里面使用MCP工具
  12. 【Agent.10】OpenAI接口输出格式约束(response_format)

本专栏所有代码都会归档至 musnows/agent-blog 开源仓库。

本文介绍了如何使用OpenAI Python SDK实现多轮对话和Function Calling功能,包括SDK安装、多轮对话维护和函数调用的完整示例。

1. 引言

在上一篇文章中,我们使用requests库直接调用OpenAI API,实现了基础的AI交互功能。虽然这种方式能够帮助我们理解API的工作原理,但在实际开发中,直接使用HTTP请求会显得有些"原始"。

OpenAI官方提供了Python SDK,能够让我们更方便的实现这些功能。其本质上也是封装了requests库和aiohttp库提供的网络请求能力,将其从我们网络请求原始获取到的json字段,变成了response对象的成员变量。

本文将简单示例如何使用OpenAI Python SDK的使用方式,以及我们如何进行多轮对话的messages维护示例,都很简单,看看就会了。

2.1. 安装SDK

首先需要安装OpenAI的Python SDK:

1
pip3 install openai

安装完成后,我们就可以使用OpenAI提供的客户端类来调用API了。

2.2. 基础配置

使用SDK之前,需要先配置API密钥。推荐使用环境变量的方式:

1
2
3
4
5
6
7
8
9
10
11
import os
from openai import OpenAI


os.environ["OPENAI_API_KEY"] = "your_api_key_here"


client = OpenAI(
api_key=os.environ.get("OPENAI_API_KEY"),
base_url="https://api.siliconflow.cn/v1"
)

注意:把API密钥设置在环境变量中比硬编码在代码里更安全,这也是生产环境的最佳实践。

问:什么是环境变量?

  • 环境变量是操作系统中用于存储系统或应用程序运行所需关键路径及配置信息的系统级变量。它的核心功能是为系统和用户提供统一的路径引用方式,简化程序调用过程。
  • 简单来说,环境变量就你设置到系统某个地方的变量,可以被整个系统的任何程序获取。使用环境变量获取一些信息,可以避免把API_TOKEN这种重要的数据硬编码到程序里面去,导致泄露。
  • 同时使用环境变量也方便我们后续修改配置,如果API_TOKEN是在程序里面写死的,那可能修改一个变量需要找到所有修改点,很麻烦!

3. 多轮对话实现

3.1. 对话状态管理

多轮对话的核心在于维护对话历史。我们需要在每次请求时,将之前的对话内容一起发送给AI模型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import os
from openai import OpenAI

class ChatBot:
def __init__(self, api_key):
self.client = OpenAI(
api_key=api_key,
base_url="https://api.siliconflow.cn/v1"
)
self.messages = [
{"role": "system", "content": "你是一个有帮助的AI助手。"}
]

def chat(self, user_input):
"""发送用户消息并获取AI回复"""

self.messages.append({"role": "user", "content": user_input})

try:

response = self.client.chat.completions.create(
model="Qwen/Qwen3-8B",
messages=self.messages,
max_tokens=512,
temperature=0.7
)


ai_reply = response.choices[0].message.content


self.messages.append({"role": "assistant", "content": ai_reply})

return ai_reply

except Exception as e:
return f"出错了: {str(e)}"

def get_history(self):
"""获取对话历史"""
return self.messages


if __name__ == "__main__":
API_KEY = "your_api_key_here"
bot = ChatBot(API_KEY)

print("AI助手已启动,输入'退出'结束对话")

while True:
user_input = input("你: ")
if user_input.lower() == '退出':
break

ai_reply = bot.chat(user_input)
print(f"AI: {ai_reply}")

3.2. 对话效果演示

运行上面的代码,我们可以实现如下对话:

1
2
3
4
5
6
7
8
9
10
❯ uv run 03.multi.round.chat/multi_round_chat.py
AI助手已启动,输入'退出'结束对话,输入'清空'清空对话历史
==================================================
你: 你好,我叫小明
AI: 你好,小明!很高兴认识你~有什么我可以帮你的吗?(•̀ᴗ•́)و
------------------------------
你: 我叫什么名字?
AI: 你的名字是小明呀!刚才你自己告诉我的,是不是想测试我有没有记住呢?(✧ω✧) 需要我帮你做什么事情吗?
------------------------------
你:

可以看到,AI能够记住我们之前提到的名字"小明",这就是通过维护messages列表实现的。

4. 总结

OpenAI SDK用起来确实比直接requests调用舒服多了,代码更简洁,也不用自己处理各种HTTP细节。多轮对话的实现原理也很简单,就是把对话历史保存起来,每次请求都带上,作为对话的记忆。

这里也展现了LLM“无状态”的特性,我们把相同的messages数组传递给任何模型,只要不超过目标模型的上下文Token数量,模型就能“记住”我们对话的内容,根据对话历史,为我们生成回答。

不过,在实际的Agent开发中,多轮对话并不常使用,绝大部分Agent框架只需要提供入口prompt,后续的所有流程都是Agent自行解决。

但这不代表多轮对话就不用掌握了,还是得了解了解如何维护多轮对话的状态的。