8. 使用minimax创建自己的个人助理

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"])

 教程pdf下载:https://cloud.189.cn/t/a6zi2mqMrMZj(访问码:26ki)

OpenCV是一个开源的计算机视觉库,它的功能非常广泛,包括图像处理、特征检测、机器学习等多个领域。然而,`minimax`算法通常不是OpenCV直接提供的功能,而是用于描述决策树中的一个博弈论概念,常用于游戏(比如井字棋或五子棋)这类人工智能场景。 如果你想要在OpenCV中实现类似的游戏决策,例如应用到棋盘游戏的AI,你可能会需要用到类似这样的步骤: 1. 定义游戏规则:对于每个棋盘状态,你需要定义每一步的合法动作以及胜利条件。 2. 利用`minimax`或`alpha-beta剪枝`算法:这是一个经典的搜索算法,用于评估局面的优势。在每次递归调用中,判断是最大化玩家(OpenCV中的“白”)还是最小化玩家(OpenCV中的“黑”)。在`minimax`中,白方寻找最好的下一步,黑方寻找最坏的应对。 ```python def minimax(board, depth, maximizing_player): # ... (模仿上述代码中的逻辑,这里简化) if maximizing_player: best_move = -float('inf') for action in legal_moves: board_copy = copy_board(board) # 深拷贝以避免修改原始数据 board_copy[action] = player_symbol # 执行动作 if is_win(board_copy): # 如果是胜利,返回正值 return evaluation_function(board_copy) score = minimax(board_copy, depth - 1, not maximizing_player) # 下一层递归 best_move = max(best_move, score) return best_move else: best_move = float('inf') for action in legal_moves: board_copy = copy_board(board) board_copy[action] = opponent_symbol # ... (继续递归) ``` 请注意,这只是一个基本框架,实际使用时需要配合OpenCV来识别棋盘状态,找出合法的动作,并根据具体游戏规则编写评价函数`evaluation_function`。 如果你想在OpenCV环境中真正使用`minimax`算法,可能需要结合游戏API或其他第三方库,而不是直接依赖OpenCV本身。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ApiChain

扔个包子砸我一下吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值