2.1
什么是
Assistant API?
Assistants API
是一种接口,它允许开发者通过少量的代码来创建和定制个性化的AI
助手。你可以使用它来处理文本、图片和语音数据,使其能在特定场景下更加智能地与用户交互
#
角色
你是一个专业的咨询小助手,能够精准透彻地理解用户的问题,并从庞大的知识库中精准检索相关信息,进而为用户生成详尽准确的答案。
##
技能
###
技能
1:
理解问题
1.
仔细剖析用户提出的问题,精准提取其中的关键信息。如主题领域、具体需求、情境背景等。
###
技能
2:
知识库检索
1.
依据关键信息,在知识库中进行全面检索,查找相关的资料和解决方案。
###
技能
3:
搜索引擎查询
1.
若根据关键信息,在知识库中未找到高度相关的知识。则借助搜索引擎进行检索。
###
技能
4:
回答生成
1.
以检索到的信息为基础,为用户打造准确且简洁明了的回答。
##
限制
:
1.
只回答与成人学习、职业发展、生活资讯等相关的问题,对无关话题不予理会。
2.
尽量运用清晰简洁的语言回应用户的问题。
3.
在整个回答过程中,始终将用户的需求置于核心位置。
环境配置
ASSIST_GROUP_ID=******
ASSIST_BASE_URL=https://api.minimax.chat/v1/
ASSIST_API_KEY=********
AASSIST_MODEL=abab6.5s-chat
初始化
import os
import requests # 导入requests库,用于发送HTTP请求
from dotenv import load_dotenv
import json # 导入json库,用于处理JSON数据
import time # 导入time库,用于处理时间相关功能
load_dotenv()
GroupId = os.getenv("ASSIST_GROUP_ID")
API_KEY = os.getenv("ASSIST_API_KEY")
BASE_URL = os.getenv("ASSIST_BASE_URL")
GPT_MODEL = os.getenv("ASSIST_MODEL")
# 用于上传时的身份校验
headers = {
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'
}
# 同样检索的时候身份校验。
headers_retrieval = {
'Authorization': f'Bearer {API_KEY}',
'authority': 'api.minimax.chat',
}
上传知识库文件
知识库内容如下
类别:智能手机
成本价:1000元/件
售价:1200元/件
类别:平板电脑
成本价:800元/件
售价:1000元/件
类别:耳机
成本价:50元/件
售价:80元/件
类别:笔记本电脑
成本价:3000元/件
售价:3500元/件
类别:智能手表
成本价:200元/件
售价:250元/件
类别:无线充电器
成本价:40元/件
售价:60元/件
类别:摄像头
成本价:150元/件
售价:200元/件
类别:游戏手柄
成本价:120元/件
售价:150元/件
类别:路由器
成本价:70元/件
售价:100元/件
类别:键盘鼠标套装
成本价:100元/件
售价:130元/件
# create_file 函数的目的是将一个文件上传到Minimax API
def create_file():
# 定义文件上传的 API 的 URL 地址。
# GroupId 是用于指定文件上传目标组的查询参数。
url = f"{BASE_URL}files/upload?GroupId={GroupId}"
# 定义要发送的数据。'purpose' 字段用于说明上传文件的目的,这里是用于助手功能。
data = {
'purpose': 'assistants'
}
# 打开要上传的文件,使用二进制模式 ('rb') 读取文件内容。'file' 字段用于指定上传的文件。
files = {
'file': open(r'assist_db.txt', 'rb')
}
# 发送 POST 请求到 API 端点,包含 headers、data 和 files。
# headers_retrieval 是定义请求头,data 包含上传文件的目的,files 包含实际要上传的文件。
response = requests.post(url, headers=headers_retrieval, data=data, files=files)
# 将 API 响应的 JSON 数据解析并返回。response.json() 方法将响应内容转换为 JSON 格式。
return response.json()
创建助手
def create_assistant(file_id):
# 构建 API 请求的 URL,使用 GroupId 作为查询参数
url = f"{BASE_URL}assistants/create?GroupId={GroupId}"
# 准备请求的负载数据,将数据转换为 JSON 格式的字符串
payload = json.dumps({
"model": GPT_MODEL, # 指定要使用的模型版本
"name": "电商促销活动计算", # 助手的名称
"description": "电商价格分析,致力于计算商品价格数据。", # 对助手的描述,说明其功能和用途
"instructions": "擅长电商价格分析,专注于商品价格数据的计算,以准确统计各类商品的营收与成本,进而计算出总利润。", # 助手的设定或指令,说明助手的工作原理和目标
"file_ids": [ # 列表包含了与助手相关的文件 ID
str(file_id) # 将传入的文件 ID转换为字符串形式
],
"tools": [ # 列表包含助手使用的工具
{"type": "retrieval"} # 使用'retrieval' 工具,可能用于从文件中检索数据
]
})
# 发送 POST 请求到 API,创建助手
response = requests.post(url, headers=headers, data=payload)
# 返回 API 的响应,解析为 JSON 格式
return response.json()
创建线程
# 创建线程的函数
def create_thread():
# 构造请求的 URL,包含 GroupId 参数
url = f"{BASE_URL}threads/create?GroupId={GroupId}"
# 发送 POST 请求以创建一个新线程
response = requests.post(url, headers=headers)
# 返回响应的 JSON 数据
return response.json()
往指定线程中添加消息的函数
def add_message_to_thread(thread_id):
# 构造请求的 URL,包含 GroupId 参数
url = f"{BASE_URL}threads/messages/add?GroupId={GroupId}"
# 构造要发送的消息数据
payload = json.dumps({
"thread_id": thread_id, # 指定要向哪个线程添加消息
"role": "user", # 消息发送者的角色,这里是 'user'
"content": "我卖出了5台智能手机、3个平板电脑、10副耳机、2台笔记本电脑、8只智能手表、15个无线充电器、4个摄像头、6个游戏手柄、10个路由器和20套键盘鼠标套装,请计算总成本和总收入,并给出具体的计算过程。",
# 消息内容
})
# 发送 POST 请求以向指定线程添加消息
response = requests.post(url, headers=headers, data=payload)
# 返回响应的 JSON 数据
return response.json()
运行助手
def run_thread_with_assistant(thread_id, assistant_id):
time.sleep(20)
# 这里可以选择添加延时(time.sleep(20))以等待助手的创建和初始化完成。注释掉的代码是为了处理助手创建后可能需要的时间,
# 用于助手的数据向量化和存储。在实际应用中,可以通过检索助手状态来判断助手是否已成功创建。
# 定义API请求的URL。这个URL用于向指定的线程中运行指定的助手。
url = f"{BASE_URL}threads/run/create?GroupId={GroupId}"
# 定义请求的负载数据。这个数据包含了要运行的线程ID和助手ID。
payload = json.dumps({
"thread_id": thread_id, # 线程的唯一标识符。助手将在这个线程中运行。
"assistant_id": assistant_id # 助手的唯一标识符。指定了要运行的助手。
})
# 发送POST请求到API,传递请求头和负载数据。
response = requests.post(url, headers=headers, data=payload)
# 返回API的响应结果,以JSON格式返回。
return response.json()
查看运行状态
def check_thread_run_status(threadId, runId):
# 定义请求的URL,构造获取线程运行状态的API端点。
# 这里URL包括了`GroupId`作为查询参数,表示请求的是特定群组中的运行状态。
url = f"{BASE_URL}threads/run/retrieve?GroupId={GroupId}"
# 创建请求的负载数据,包含线程ID和运行ID。
# 这些数据将用于API请求中,以指定要查询的线程和运行状态。
payload = json.dumps({
"thread_id": str(threadId), # 线程ID,指定要查询的线程
"run_id": str(runId) # 运行ID,指定要查询的具体运行
})
# 初始化`completed`变量为`False`,表示任务尚未完成。
completed = False
# 使用循环不断检查任务的运行状态,直到任务完成。
while not completed:
# 发送GET请求到指定的URL,附带请求头和负载数据。
response = requests.request("GET", url, headers=headers, data=payload)
# 检查响应状态码是否为200,表示请求成功。
if response.status_code == 200:
# 将API响应的内容转换为JSON格式。
response_data = response.json()
# 从响应数据中提取`status`字段,获取任务的当前状态。
status = response_data.get('status', '')
# 打印当前任务状态。
print(f"Status: {status}")
# 检查任务状态是否为`completed`,如果是,标记为完成。
if status == 'completed':
completed = True
print("Process completed,exiting loop.")
else:
# 如果状态不是`completed`,等待两秒后重新请求。
time.sleep(2)
else:
# 如果请求失败,打印错误信息,并退出循环。
print(f"Error: {response.status_code}")
break
# 返回任务是否完成的状态。
return completed
获取线程数据
def get_thread_messages(thread_id):
# 定义要请求的URL,使用线程ID来构造URL,以便获取该线程的消息列表
url = f"{BASE_URL}threads/messages/list?GroupId={GroupId}"
# 创建请求的负载数据,包含线程ID
payload = json.dumps({
"thread_id": thread_id # 包含要查询消息的线程ID
})
# 发送GET请求到指定的URL,附带请求头和负载数据
response = requests.get(url, headers=headers, data=payload)
# 将响应内容转换为JSON格式并返回
return response.json()
最后调用
# 上传文档
file_response = create_file()
# print(f'file_response--》{file_response}')
file_id = file_response.get('file', {}).get('file_id')
print("file_id:",file_id)
# 创建助手
assistant_response = create_assistant(file_id)
# print(f'assistant_response-->{assistant_response}')
assistant_id = assistant_response.get('id', '')
print("assistant_id:",assistant_id)
# 创建线程
thread_response = create_thread()
thread_id = thread_response.get('id', '')
print("thread_id:",thread_id)
# 往线程里添加信息
add_message_to_thread(thread_id) # 不保存返回值
# 使用助手处理该线程
run_response = run_thread_with_assistant(thread_id, assistant_id)
print("run_response", run_response)
run_id = run_response.get('id', '') # 假设run_response是正确的JSON响应,并包含run_id
print("run_id:", run_id)
# 检查助手处理状态
if check_thread_run_status(thread_id, run_id):
# 获取线程中助手处理出的新信息
thread_messages_response = get_thread_messages(thread_id)
print(type(thread_messages_response))
print(thread_messages_response["data"][1]["content"][0]["text"])