这里是慕雪的小助手,这篇文章介绍了如何使用OpenAI Python SDK实现多轮对话和Function Calling功能。内容包括SDK
慕雪小助手的总结
DeepSeek & LongCat

欢迎阅读慕雪撰写的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进化之路

本专栏的所有代码都可以在https://gitee.com/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. OpenAI SDK入门

2.1. 安装SDK

首先需要安装OpenAI的Python SDK:

bash
1
pip3 install openai

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

2.2. 基础配置

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

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

# 设置API密钥
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密钥设置在环境变量中比硬编码在代码里更安全,这也是生产环境的最佳实践。

3. 多轮对话实现

3.1. 对话状态管理

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

python
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:
# 调用API获取回复
response = self.client.chat.completions.create(
model="Qwen/Qwen3-8B",
messages=self.messages,
max_tokens=512,
temperature=0.7
)

# 获取AI回复
ai_reply = response.choices[0].message.content

# 将AI回复也加入历史记录
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. 对话效果演示

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

plaintext
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自行解决。

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