在8线小城的革委会办公室里,黑8和革委会主任的对话再次展开。
黑8:主任,您知道吗?除了OpenAI API,现在还有一项新的技术叫做Assistants API,它可以帮助我们更好地进行对话和沟通。
主任:Assistants API?听起来很神奇,它有什么特别之处吗?
黑8:是的,主任。Assistants API不仅可以生成自然流畅的文本,还能理解对话中的语境和情境,从而更加智能地回应用户的需求。它可以模拟人类对话,进行智能问答、提供建议和解决问题,为我们的工作和生活带来更多便利。
主任:这听起来确实很有用。你能举个例子吗?
黑8:当然,主任。比如,我们可以使用Assistants API来帮助进行会议记录和总结,自动生成会议纪要并提供关键信息的摘要。此外,它还可以用于客户服务,快速回答客户的问题和解决他们的疑虑,提升服务效率和用户体验。
主任:这真是太棒了!我们可以尝试将Assistants API应用到革委会的工作中,提高工作效率和质量。
黑8:是的,主任。Assistants API的应用潜力巨大,只要我们善于发挥,就能为我们的工作和使命注入新的活力和动力。
主任:谢谢你的分享,黑8。你对新技术的探索和应用态度令人钦佩,继续努力,为革委会的事业做出更多贡献。
黑8:谢谢主任的支持和鼓励,我会继续努力的。
两人在办公室里的对话结束了,但是他们对新技术的探索和应用之路才刚刚开始。通过使用Assistants API,他们将探索更多的可能性,为革委会的使命注入新的活力和动力,带领团队走向更加美好的未来。
1 Assistants API 的主要能力
已有能力:
- 创建和管理Assistant,每个assistant有独立的配置
- 支持无限长的多轮对话,对话历史保存在OpenAI的服务器上
- 支持Code Interpreter
- 在沙箱里编写并运行Python代码
- 自我修正代码
- 可传文件给Code Interpreter
- 支持文件RAG
- 支持Function Calling
2 创建一个Assistants
可以到OpenAI Playground在线创建
3 访问Assistants
3.1 管理Thread
Threads:
- Threads 里保存所有历史对话(Messages)
- 一个Assistants可以有多个thread
- 每一个thread可以有无限条message
- 一个用户与assistant的多轮对话历史可以维护在一个thread
import json
def show_json(obj):
"""把任意对象用排版美观的 JSON 格式打印出来"""
print(json.dumps(
json.loads(obj.model_dump_json()),
indent=4,
ensure_ascii=False
))
from openai import OpenAI
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
# 初始化 OpenAI 服务
client = OpenAI() # openai >= 1.3.0 起,OPENAI_API_KEY 和 OPENAI_BASE_URL 会被默认使用
# 创建 thread
thread = client.beta.threads.create()
show_json(thread)
可以根据需要,自定义 metadata
,比如创建 thread 时,把 thread 归属的用户信息存入
thread = client.beta.threads.create(
metadata={
"fullname": "挑大梁", "username": "jacob"}
)
show_json(thread)
Thread ID 如果保存下来,是可以在下次运行时继续对话的。
从 thread ID 获取 thread 对象的代码:
thread = client.beta.threads.retrieve(thread.id)
show_json(thread)
对metadata的操作还有:
threads.update()
修改 threadsthreads.delete()
删除 threads
3.2 Threads中添加Messages
Messages的内容可以是:
- 文本、文件、图片
- 文本可以带参考引用
- metadata
message = client.beta.threads.messages.create(
thread_id=thread.id, # message 必须归属于一个 thread
role="user", # 取值是 user 或者 assistant。但 assistant 消息会被自动加入,我们一般不需要自己构造
content="你都能做什么?",
)
show_json(message)
对消息的操作函数还有:
threads.messages.retrieve()
获取 messagethreads.messages.update()
更新 message 的metadata
threads.messages.list()
列出给定 thread 下的所有 messages
3.2 执行Run
- 用 run 把 assistant 和 thread 关联,进行对话
- 一个 prompt 就是一次 run
# assistant id 从 https://platform.openai.com/assistants 获取。你需要在自己的 OpenAI 创建一个
assistant_id = "asst_rsWrZquXB5jJsmURwaZRqoD5"
run = client.beta.threads.runs.create(
assistant_id=assistant_id,
thread_id=thread.id,
)
show_json(run)
Run 是个异步调用,意味着它不等大模型处理完,就返回。我们通过 run.status
了解大模型的工作进展情况,来判断下一步该干什么。
import time
def wait_on_run(run, thread):
"""等待 run 结束,返回 run 对象,和成功的结果"""
while run.status == "queued" or run.status == "in_progress":
"""还未中止"""
run = client.beta.threads.runs.retrieve(
thread_id=thread.id,
run_id=run.id)
print("status: " + run.status)
# 打印调用工具的 step 详情
if