一、Assistant概念
Assistant慌洪,常被稱作“智能體”或 Agent距贷,是一款集成了大語言模型及多種工具的 AI 應(yīng)用党涕。它不僅能回答您的問題,還可以調(diào)用知識庫逝变、查詢數(shù)據(jù)庫/Excel基茵、執(zhí)行代碼、生成圖像骨田、聯(lián)網(wǎng)搜索耿导,甚至調(diào)用您的業(yè)務(wù)API接口或本地函數(shù)。
Assistant 支持對話交互管理态贤,能夠保存歷史消息記錄舱呻,如果您想完善問題,也可以修改后再次請求回答悠汽。
二箱吕、運(yùn)行機(jī)制
Assistant 接受用戶輸入,并由內(nèi)置的大語言模型判斷是否需要調(diào)用工具柿冲。
如果需要調(diào)用工具茬高,大語言模型會選擇合適的工具,工具返回結(jié)果和用戶內(nèi)容合并后再次輸入到大語言模型假抄,由大語言模型生成內(nèi)容并輸出怎栽。
如果無需調(diào)用工具,大語言模型將直接生成內(nèi)容并輸出宿饱。
Assistant API
Assistant API 是一套用于構(gòu)建 Assistant 的開發(fā)工具熏瞄,旨在簡化 Assistant 的創(chuàng)建與管理,幫助您方便地管理對話消息谬以,以及調(diào)用工具强饮。
三、核心組件
Assistant API 包含四個核心組件:
Assistant API 對象 | 功能 |
---|---|
智能體(Assistant) | 功能強(qiáng)大的 AI 對話助手为黎,結(jié)合了大語言模型和多種高級工具邮丰。 |
線程(Thread) | 用戶和智能體之間的會話線程,用于管理歷史會話記錄铭乾。 |
消息(Message) | 用戶發(fā)送的消息剪廉,以及智能體回復(fù)的消息,以列表的形式保存在線程中炕檩。 |
運(yùn)行(Run) | 將線程中存儲的上下文信息輸入到智能體妈经,以完成一次運(yùn)行。 |
您可以使用 Assistant API 創(chuàng)建一個智能體應(yīng)用的 Assistant。Assistant API 的主要組件與智能體應(yīng)用控制臺界面的大致對應(yīng)關(guān)系如下:
四吹泡、運(yùn)行機(jī)制
Assistant API 采用線程(Thread)機(jī)制確保消息的有序執(zhí)行骤星,以此維護(hù)對話的時序連貫性。具體流程如下:
創(chuàng)建消息實(shí)例:用戶通過Message.create()方法創(chuàng)建消息實(shí)例爆哑,該消息歸屬于特定的線程洞难。這一步驟是初始化消息的基礎(chǔ),確保每條消息都能正確關(guān)聯(lián)到上下文環(huán)境揭朝。
啟動 Assistant 運(yùn)行環(huán)境:利用Run.create()函數(shù)來初始化 Assistant 的執(zhí)行環(huán)境队贱。這為消息的處理提供了必要的運(yùn)行時配置。
等待輸出結(jié)果:調(diào)用wait()函數(shù)等待 Assistant 完成處理并返回結(jié)果潭袱。這一環(huán)節(jié)保證了程序在獲取響應(yīng)前保持同步柱嫌,避免了數(shù)據(jù)亂序的風(fēng)險。
Assistant API 內(nèi)部實(shí)現(xiàn)了一個基于 Thread 的順序消息隊(duì)列屯换,該隊(duì)列自動依據(jù)消息的創(chuàng)建時間進(jìn)行排序编丘。這意味著 Assistant 將嚴(yán)格按照消息的時間順序來接收和處理輸入,從而產(chǎn)生與之對應(yīng)的響應(yīng)彤悔。
Assistant API 支持連續(xù)消息的無縫整合嘉抓,不論是連續(xù)的用戶查詢還是智能體的連續(xù)反饋,都能在對話流程中平滑過渡晕窑。這種設(shè)計(jì)不僅增強(qiáng)了對話的自然流暢度抑片,還顯著提高了多輪交互的效率和體驗(yàn)。
完整的示例代碼——Python:
import dashscope
from http import HTTPStatus
import json
def check_status(component, operation):
if component.status_code == HTTPStatus.OK:
print(f"{operation} 成功杨赤。")
return True
else:
print(f"{operation} 失敗敞斋。狀態(tài)碼:{component.status_code},錯誤碼:{component.code}疾牲,錯誤信息:{component.message}")
return False
# 1. 創(chuàng)建繪畫助手
painting_assistant = dashscope.Assistants.create(
model='qwen-max',
name='Art Maestro',
description='用于繪畫和藝術(shù)知識的AI助手',
instructions='''提供繪畫技巧渺尘、藝術(shù)史和創(chuàng)意指導(dǎo)的信息。
使用工具進(jìn)行研究和生成圖像说敏。''',
tools=[
{'type': 'quark_search', 'description': '用于研究藝術(shù)主題'},
{'type': 'text_to_image', 'description': '用于創(chuàng)建視覺示例'}
]
)
if not check_status(painting_assistant, "助手創(chuàng)建"):
exit()
# 2. 創(chuàng)建一個新線程
thread = dashscope.Threads.create()
if not check_status(thread, "線程創(chuàng)建"):
exit()
# 3. 向線程發(fā)送消息
message = dashscope.Messages.create(thread.id, content='請幫我畫一幅布偶貓的畫。')
if not check_status(message, "消息創(chuàng)建"):
exit()
# 4. 在線程上運(yùn)行助手
run = dashscope.Runs.create(thread.id, assistant_id=painting_assistant.id)
if not check_status(run, "運(yùn)行創(chuàng)建"):
exit()
# 5. 等待運(yùn)行完成
print("等待助手處理請求...")
run = dashscope.Runs.wait(run.id, thread_id=thread.id)
if check_status(run, "運(yùn)行完成"):
print(f"運(yùn)行完成丢郊,狀態(tài):{run.status}")
else:
print("運(yùn)行未完成盔沫。")
exit()
# 6. 檢索并顯示助手的響應(yīng)
messages = dashscope.Messages.list(thread.id)
if check_status(messages, "消息檢索"):
if messages.data:
# 顯示最后一條消息的內(nèi)容(助手的響應(yīng))
last_message = messages.data[0]
print("\n助手的回應(yīng):")
print(json.dumps(last_message, ensure_ascii=False, default=lambda o: o.__dict__, sort_keys=True, indent=4))
else:
print("在線程中未找到消息。")
else:
print("未能檢索到助手的響應(yīng)枫匾。")
# 提示: 這段代碼創(chuàng)建了一個繪畫助手架诞,開始了一段關(guān)于如何繪制布偶貓的對話,
# 并展示了助手的回答干茉。
完整的示例代碼——Java:
package com.example;
import java.util.Arrays;
import com.alibaba.dashscope.assistants.Assistant;
import com.alibaba.dashscope.assistants.AssistantParam;
import com.alibaba.dashscope.assistants.Assistants;
import com.alibaba.dashscope.common.GeneralListParam;
import com.alibaba.dashscope.common.ListResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.InvalidateParameter;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.threads.AssistantThread;
import com.alibaba.dashscope.threads.ThreadParam;
import com.alibaba.dashscope.threads.Threads;
import com.alibaba.dashscope.threads.messages.Messages;
import com.alibaba.dashscope.threads.messages.TextMessageParam;
import com.alibaba.dashscope.threads.messages.ThreadMessage;
import com.alibaba.dashscope.threads.runs.Run;
import com.alibaba.dashscope.threads.runs.RunParam;
import com.alibaba.dashscope.threads.runs.Runs;
import com.alibaba.dashscope.tools.T2Image.Text2Image;
import com.alibaba.dashscope.tools.search.ToolQuarkSearch;
public class PaintingAssistant {
private static boolean checkStatus(Object response, String operation) {
if (response != null) {
System.out.println(operation + " 成功谴忧。");
return true;
} else {
System.out.println(operation + " 失敗。");
return false;
}
}
public static void main(String[] args) {
try {
// 1. 創(chuàng)建繪畫助手
Assistants assistants = new Assistants();
AssistantParam assistantParam = AssistantParam.builder()
.model("qwen-max")
.name("Art Maestro")
.description("用于繪畫和藝術(shù)知識的AI助手")
.instructions("提供繪畫技巧、藝術(shù)史和創(chuàng)意指導(dǎo)的信息沾谓。使用工具進(jìn)行研究和生成圖像委造。")
.tools(Arrays.asList(ToolQuarkSearch.builder().build(),Text2Image.builder().build()))
.build();
Assistant paintingAssistant = assistants.create(assistantParam);
if (!checkStatus(paintingAssistant, "助手創(chuàng)建")) {
System.exit(1);
}
// 2. 創(chuàng)建一個新線程
Threads threads = new Threads();
AssistantThread thread = threads.create(ThreadParam.builder().build());
if (!checkStatus(thread, "線程創(chuàng)建")) {
System.exit(1);
}
// 3. 向線程發(fā)送消息
Messages messages = new Messages();
ThreadMessage message = messages.create(thread.getId(),
TextMessageParam.builder()
.role("user")
.content("請幫我畫一幅布偶貓的畫。")
.build());
if (!checkStatus(message, "消息創(chuàng)建")) {
System.exit(1);
}
// 4. 在線程上運(yùn)行助手
Runs runs = new Runs();
RunParam runParam = RunParam.builder().assistantId(paintingAssistant.getId()).build();
Run run = runs.create(thread.getId(), runParam);
if (!checkStatus(run, "運(yùn)行創(chuàng)建")) {
System.exit(1);
}
// 5. 等待運(yùn)行完成
System.out.println("等待助手處理請求...");
while (true) {
if (run.getStatus().equals(Run.Status.COMPLETED) ||
run.getStatus().equals(Run.Status.FAILED) ||
run.getStatus().equals(Run.Status.CANCELLED) ||
run.getStatus().equals(Run.Status.REQUIRES_ACTION) ||
run.getStatus().equals(Run.Status.EXPIRED)) {
break;
}
Thread.sleep(1000);
run = runs.retrieve(thread.getId(), run.getId());
}
if (checkStatus(run, "運(yùn)行完成")) {
System.out.println("運(yùn)行完成均驶,狀態(tài):" + run.getStatus());
} else {
System.out.println("運(yùn)行未完成昏兆。");
System.exit(1);
}
// 6. 檢索并顯示助手的響應(yīng)
ListResult<ThreadMessage> messagesList = messages.list(thread.getId(), GeneralListParam.builder().build());
if (checkStatus(messagesList, "消息檢索")) {
if (!messagesList.getData().isEmpty()) {
// 顯示最后一條消息(助手的響應(yīng))
ThreadMessage lastMessage = messagesList.getData().get(0);
System.out.println("\n助手的回應(yīng):");
System.out.println(lastMessage.getContent());
} else {
System.out.println("在線程中未找到消息。");
}
} else {
System.out.println("未能檢索到助手的響應(yīng)妇穴。");
}
} catch (ApiException | NoApiKeyException | InputRequiredException | InvalidateParameter | InterruptedException e) {
e.printStackTrace();
}
}
}