什么是 Assistants API
顾名思义就是助手 API, 你可以在 OpenAI 官网添加一个智能体,这个智能体就是 assistant,如何想集成这个 assistant 到你的应用中就是通过 Assistants API。本质上就是接口调用。
Assistants API 的特点
- 创建和管理 assistant,每个 assistant 有独立的配置
- 支持无限长的多轮对话,对话历史保存在 OpenAI 的服务器上
- 通过自有向量数据库支持基于文件的 RAG
- 支持 Code Interpreter
- 在沙箱里编写并运行 Python 代码
- 自我修正代码
- 可传文件给 Code Interpreter
- 支持 Function Calling
- 支持在线调试的 Playground
即将具备的能力:
- 支持 DALL·E
- 支持图片消息
- 支持自定义调整 RAG 的配置项
收费:
- 按 token 收费。无论多轮对话,还是 RAG,所有都按实际消耗的 token 收费
- 如果对话历史过多超过大模型上下文窗口,会自动放弃最老的对话消息
- 文件按数据大小和存放时长收费。1 GB 向量存储 一天收费 0.10 美元
- Code interpreter 跑一次 $0.03
接下来直接进入正题,先介绍 AssistantsAPI,然后通多实例展示
安装 openai
pip install openai
创建一个 Assistant
可以在代码用创建
from dotenv import load_dotenv, find_dotenv
from openai import OpenAI
load_dotenv(find_dotenv())
client = OpenAI()
assistant = client.beta.assistants.create(
name="Food Assistant",
instructions="你是美食家,擅长美食,擅长美食的问答,你负责回答与美食相关的问题。",
model="gpt-4o"
)
也可以到官网去手动创建:https://platform.openai.com/playground?mode=assistant
对话历史 Thread
注意,这里的 thread 不是我们程序员理解的那个线程的概念,这里是报错对话历史的工具
- Threads 里保存的是对话历史,即 messages
- 一个 assistant 可以有多个 thread
- 一个 thread 可以有无限条 message
- 一个用户与 assistant 的多轮对话历史可以维护在一个 thread 里
创建方式:
# 创建 thread
thread = client.beta.threads.create()
我们写一个函数用来打印生成的对象里面到底有些什么属性
import json
def show_json(obj):
"""把任意对象用排版美观的 JSON 格式打印出来"""
print(json.dumps(
json.loads(obj.model_dump_json()),
indent=4,
ensure_ascii=False
))
接下来打印一下这个 thread
show_json(thread)
输出:
{
"id": "thread_UmmMZHrQy6QHpguE4YoKUlia",
"created_at": 1718886745,
"metadata": {},
"object": "thread",
"tool_resources": {
"code_interpreter": null,
"file_search": null
}
}
给对话历史加上标记
前面说了,thread 是用来保存对话历史的,那么不同的用户应该会有不同的对话历史,如何给 thread 做好标记呢?答案就是 metadata
thread = client.beta.threads.create(
metadata={"fullname": "IT民工老包", "username": "bj"}
)
show_json(thread)
输出:
{
"id": "thread_ZO9PbLBA4sHJdsseshprusi",
"created_at": 1718896823,
"metadata": {
"fullname": "IT民工老包",
"username": "bj"
},
"object": "thread",
"tool_resources": {
"code_interpreter": null,
"file_search": null
}
}
thread.id 可以保存到数据库
thread.id 是可以保存到应用数据库中,当用户发起下一次的对话时,可以通过 thread.id 获取到原先创建的 thread 对象:
thread = client.beta.threads.retrieve(thread.id)
show_json(thread)
输出:
{
"id": "thread_ZO9PbLBA4sHJdsseshprusi",
"created_at": 1718896823,
"metadata": {
"fullname": "IT民工老包",
"username": "bj"
},
"object": "thread",
"tool_resources": {
"code_interpreter": null,
"file_search": null
}
}
其他的方法:
threads.modify()修改 thread 的metadata和tool_resourcesthreads.retrieve()获取 threadthreads.delete()删除 thread。
用户消息添加
thread 是消息历史,我们可以往 thread 添加用户消息来实现对话,就跟在 ChatGPT 输入框中输入消息一样,只是现在我们是通过代码实现
message = client.beta.threads.messages.create(
thread_id=thread.id,


8712

被折叠的 条评论
为什么被折叠?



