OpenAI Assistants API 完整指南:从零构建带记忆的 AI 助手
不用自己管状态,官方 API 帮你实现持久对话和文件分析
OpenAI Assistants API 完整指南:从零构建带记忆的 AI 助手
不用自己管状态,官方 API 帮你实现持久对话和文件分析
OpenAI Assistants API 内置线程管理、文件搜索和代码执行,相比原始 Chat Completions API 大幅降低了有状态 AI 应用的开发复杂度。本文从原理到实战,带你从零构建一个能「记住你」的 AI 助手。
OpenAI Assistants API 完整指南
Assistants API 解决了什么问题?
用普通 Chat Completions API 构建对话 AI 时,开发者需要自己:
Assistants API 把这些全包了。
核心概念
Assistant(助手)
├── 配置项:系统指令、工具权限、模型选择
└── 可以跨 Thread 复用Thread(线程)= 一次完整的对话
├── 自动管理历史消息
└── 超出上下文长度时自动截断旧消息
Message(消息)= Thread 中的一条消息
└── 支持文本、图片、文件
Run(运行)= 让 Assistant 处理 Thread 的一次执行
└── 状态:queued → in_progress → completed
快速开始
python
from openai import OpenAIclient = OpenAI()
第一步:创建 Assistant(只需创建一次,保存 ID 复用)
assistant = client.beta.assistants.create(
name="个人助手",
instructions="""你是一个专业的个人助手。
- 记住用户提到的个人信息和偏好
- 回答简洁,避免废话
- 遇到需要计算的问题,使用 code_interpreter 工具
""",
tools=[{"type": "code_interpreter"}, {"type": "file_search"}],
model="gpt-4o",
)
print(f"Assistant ID: {assistant.id}") # 保存这个ID!
完整对话流程
python
每个用户一个 Thread(保存 thread_id 到数据库)
thread = client.beta.threads.create()
print(f"Thread ID: {thread.id}")用户发消息
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="我叫张三,在北京工作,帮我分析一下北京AI创业公司的趋势"
)运行 Assistant
run = client.beta.threads.runs.create_and_poll(
thread_id=thread.id,
assistant_id=assistant.id, # 你保存的 Assistant ID
)获取回复
if run.status == "completed":
messages = client.beta.threads.messages.list(thread_id=thread.id)
print(messages.data[0].content[0].text.value)
文件分析能力
python
上传文件
with open("financial_report.pdf", "rb") as f:
file = client.files.create(file=f, purpose="assistants")创建带文件的消息
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="帮我总结这份财报的关键数字",
attachments=[
{"file_id": file.id, "tools": [{"type": "file_search"}]}
]
)
代码执行(Code Interpreter)
Assistants API 内置 Python 沙箱,AI 可以直接运行代码:
python
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="帮我分析一下这份 CSV 的数据分布,并生成图表"
)
AI 会自动写 Python 代码、运行、返回图表
持久化:把对话存起来
对于生产应用,需要把 Thread ID 和用户绑定:
python
import sqlite3def get_or_create_thread(user_id: str) -> str:
"""为每个用户维护一个持久 Thread"""
conn = sqlite3.connect("threads.db")
cursor = conn.cursor()
cursor.execute("SELECT thread_id FROM users WHERE user_id = ?", (user_id,))
result = cursor.fetchone()
if result:
return result[0]
# 新用户,创建 Thread
thread = client.beta.threads.create()
cursor.execute(
"INSERT INTO users (user_id, thread_id) VALUES (?, ?)",
(user_id, thread.id)
)
conn.commit()
return thread.id
费用说明
建议:测试阶段关闭 File Search 节省费用,仅在需要时开启。
什么时候用 Assistants API vs Chat API?
常见问题
Q:Thread 的消息会一直保存吗? A:默认保存 60 天,之后自动删除。
Q:可以给 Assistant 设置记忆上限吗? A:不能直接设置,但可以在系统提示词中要求 AI「总结并丢弃超过 N 轮的对话」。
Q:Assistants API 支持流式输出吗?
A:支持,使用 stream=True 参数。
相关工具