明天你会感谢今天奋力拼搏的你。
ヾ(o◕∀◕)ノヾ
Assistants API是2023年11月由ChatGPT在提供的一个工具,初衷是为了降低开发者的门槛。
能快速用Assistants API快速搭建一个原型应用。
目前Assistants API还处于测试阶段,功能可能会更新。
官方文档(需要科学上网才能查看):
Assistants API的主要能力:
国产模型也提供了类似Assistants API的功能:
助手是创建的 AI 模型的配置实例,定义了它的能力和行为,如下是助手操作的代码示例:
from openai import OpenAI
client = OpenAI()
# 创建助手
assistant = client.beta.assistants.create(
name="数据分析助手",
description="帮助用户进行数据分析的AI助手",
model="gpt-4-turbo-preview",
instructions="你是一个专业的数据分析师,帮助用户处理数据相关问题",
tools=[
{"type": "code_interpreter"}, # 代码解释器
{"type": "retrieval"}, # 检索功能
],
file_ids=["file-abc123"] # 可选:关联文件
)
# 获取助手信息
assistant_info = client.beta.assistants.retrieve(assistant.id)
# 修改助手
updated_assistant = client.beta.assistants.update(
assistant.id,
name="高级数据分析助手",
instructions="新的指令..."
)
对话线程用于维护用户与助手之间的对话历史。注意不是电脑进程线程的概念。
# 创建新线程
thread = client.beta.threads.create()
# 获取线程信息
thread_info = client.beta.threads.retrieve(thread.id)
# 删除线程
client.beta.threads.delete(thread.id)
消息是用户和助手中的具体交互内容,存在线程中,每个线程都有独立的Message。
# 创建用户消息
message = client.beta.threads.messages.create(
thread_id=thread.id, # message 必须归属于一个 thread
role="user", # 取值是 user 或者 assistant。但 assistant 消息会被自动加入,我们一般不需要自己构造
content="请分析这个CSV文件中的销售数据趋势",
file_ids=["file-xyz789"] # 可选:附加文件
)
# 获取线程中的所有消息
messages = client.beta.threads.messages.list(thread.id)
# 获取特定消息
message = client.beta.threads.messages.retrieve(
thread_id=thread.id,
message_id=message.id
)
用 run 把 assistant 和 thread 关联,进行对话。
# 创建运行
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id,
instructions="请特别注意异常数据" # 可选:额外指令
)
# 检查运行状态
run_status = client.beta.threads.runs.retrieve(
thread_id=thread.id,
run_id=run.id
)
# 等待运行完成的完整示例
import time
def wait_for_run_completion(thread_id, run_id):
while True:
run = client.beta.threads.runs.retrieve(
thread_id=thread_id,
run_id=run_id
)
if run.status == "completed":
return run
elif run.status == "failed":
raise Exception("运行失败")
time.sleep(1)
完整对话流程示例:
def have_conversation():
# 1. 创建助手
assistant = client.beta.assistants.create(
name="数据助手",
model="gpt-4-turbo-preview",
instructions="你是数据分析专家",
tools=[{"type": "code_interpreter"}]
)
# 2. 创建对话线程
thread = client.beta.threads.create()
# 3. 发送消息
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="我需要分析一组数据"
)
# 4. 运行助手
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id
)
# 5. 等待响应
run = wait_for_run_completion(thread.id, run.id)
# 6. 获取助手的回复
messages = client.beta.threads.messages.list(thread.id)
return messages.data[0].content
Run 的底层是个异步调用,意味着它不等大模型处理完,就返回。我们通过 run.status 了解大模型的工作进展情况,来判断下一步该干什么。
下面是状态之间的转移关系图:
1、创建回调函数
创建一个class继承openai的AssistantEventHandler类,重写其中的方法:
from typing_extensions import override
from openai import AssistantEventHandler
class EventHandler(AssistantEventHandler):
@override
def on_text_created(self, text) -> None:
"""响应输出创建事件"""
print(f"\nassistant > ", end="", flush=True)
@override
def on_text_delta(self, delta, snapshot):
"""响应输出生成的流片段"""
print(delta.value, end="", flush=True)
2、运行run
# 添加新一轮的 user message
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="你说什么?",
)
# 使用 stream 接口并传入 EventHandler
with client.beta.threads.runs.stream(
thread_id=thread.id,
assistant_id=assistant_id,
event_handler=EventHandler(),
) as stream:
stream.until_done()
其实可以多个Assistant公用一个thraed,以达到后续的Assistant可以看到之前的对话内容,这样可以达到多个Assistant之间上下文的连续性。
注意事项:
code_interpreter 是 Assistants API 的一个强大工具,允许 AI 助手:执行 Python 代码;处理数据分析;创建可视化;处理文件。其特别适合进行数据分析、科学计算和可视化任务。
注意事项:代码执行在沙箱环境中,有执行时间限制、内存使用限制、CPU时间限制、文件大小限制、python模块限制。
Assistants API 判断是否使用 code_interpreter 主要基于以下几个方面:
1. 显式配置
# 创建助手时明确指定使用 code_interpreter
assistant = client.beta.assistants.create(
name="编程助手",
model="gpt-4-turbo-preview",
tools=[{"type": "code_interpreter"}] # 显式启用
)
2、内容识别
内容包含关键字:如数学计算、数据处理相关词语、编程语言关键字,可视化相关术语。
3、代码块识别
# 消息中包含代码块
message = """
请执行以下代码:
python
import numpy as np
x = np.array([1, 2, 3])
print(x.mean())
"""
4、除了上面这些还会根据任务类型、上下文分析等手段来判断是否调用code_interpreter.
数据分析示例:
# 数据分析助手示例
def create_data_analysis_assistant():
assistant = client.beta.assistants.create(
name="数据分析助手",
instructions="""
你是一个数据分析专家,可以:
1. 读取和处理各种格式的数据文件
2. 进行统计分析
3. 创建数据可视化
4. 生成分析报告
""",
model="gpt-4-turbo-preview",
tools=[{"type": "code_interpreter"}]
)
return assistant
def analyze_data_file(file_path: str):
# 上传文件
file = client.files.create(
file=open(file_path, "rb"),
purpose="assistants"
)
thread = client.beta.threads.create()
# 发送分析请求
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="请分析这个数据文件,生成基本统计信息和可视化图表",
file_ids=[file.id]
)
数学计算示例:
math_question = """
请计算以下数学问题:
1. 求解方程: x^2 + 2x - 3 = 0
2. 计算积分: ∫(x^2 + 1)dx, 从0到1
"""
数据可视化示例:
visualization_request = """
使用以下数据创建一个散点图:
x = [1, 2, 3, 4, 5]
y = [2, 4, 5, 4, 5]
添加标题和轴标签
"""
文件处理示例:
file_processing = """
1. 读取CSV文件
2. 清理缺失值
3. 计算基本统计量
4. 生成摘要报告
"""
function call的机制在Assistants API中也能使用。
示例:
from openai import OpenAI
from typing import Dict, List, Optional
# 定义函数
def get_weather(location: str, unit: str = "celsius") -> Dict:
"""模拟天气查询功能"""
# 实际实现中会调用天气 API
return {
"location": location,
"temperature": 25,
"unit": unit,
"condition": "sunny"
}
# 函数描述
functions = [
{
"name": "get_weather",
"description": "获取指定位置的天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位"
}
},
"required": ["location"]
}
}
]
# 创建助手
client = OpenAI()
assistant = client.beta.assistants.create(
name="天气助手",
instructions="你是一个帮助查询天气的助手",
model="gpt-4-turbo-preview",
tools=[{
"type": "function",
"function": functions[0]
}]
)
通过代码创建 Vector Store:
vector_store = client.beta.vector_stores.create(
name="MyVectorStore"
)
通过代码上传文件到 OpenAI 的存储空间:
file = client.files.create(
file=open("agiclass_intro.pdf", "rb"),
purpose="assistants"
)
通过代码将文件添加到 Vector Store:
vector_store_file = client.beta.vector_stores.files.create(
vector_store_id=vector_store.id,
file_id=file.id
)
批量上传文件到 Vector Store:
files = ['file1.pdf','file2.pdf']
file_batch = client.beta.vector_stores.file_batches.upload_and_poll(
vector_store_id=vector_store.id,
files=[open(filename, "rb") for filename in files]
)
具体文档参考(需要科学上网):
Vector store 和 vector store file 也有对应的 list, retrieve, 和 delete 等操作(官方API:https://platform.openai.com/docs/api-reference/files):
在Assistants API中RAG 实际被当作一种 tool:
assistant = client.beta.assistants.create(
instructions="你是个问答机器人,你根据给定的知识回答用户问题。",
model="gpt-4o",
tools=[{"type": "file_search"}],
)
还需要指定检索源:
assistant = client.beta.assistants.update(
assistant_id=assistant.id,
tool_resources={"file_search": {"vector_store_ids": [vector_store.id]}},
)
官方文档(需要科学上网):https://platform.openai.com/docs/assistants/tools/file-search/how-it-works
内容截取:
The file_search tool implements several retrieval best practices out of the box to help you extract the right data from your files and augment the model’s responses. The file_search tool:
• Rewrites user queries to optimize them for search. (面向检索的 Query 改写)
• Breaks down complex user queries into multiple searches it can run in parallel.(复杂 Query 拆成多个,并行执行)
• Runs both keyword and semantic searches across both assistant and thread vector stores.(关键字与向量混合检索)
• Reranks search results to pick the most relevant ones before generating the final response.(检索后排序)
其默认的一些配置也可以作为自己开发RAG功能的参考:
适合使用 Assistants API 的场景:
适合使用原生 API 的场景:
适合使用国产或开源大模型的场景:
内容引自孙志岗老师的AI 大模型系列课程:https://agiclass.ai/
全部评论