大模型Assistant API簡述

一、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 工作流

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)系如下:


Assistant各組件與頁面對應(yīng)關(guān)系

四吹泡、運(yùn)行機(jī)制

Assistant API 采用線程(Thread)機(jī)制確保消息的有序執(zhí)行骤星,以此維護(hù)對話的時序連貫性。具體流程如下:

  1. 創(chuàng)建消息實(shí)例:用戶通過Message.create()方法創(chuàng)建消息實(shí)例爆哑,該消息歸屬于特定的線程洞难。這一步驟是初始化消息的基礎(chǔ),確保每條消息都能正確關(guān)聯(lián)到上下文環(huán)境揭朝。

  2. 啟動 Assistant 運(yùn)行環(huán)境:利用Run.create()函數(shù)來初始化 Assistant 的執(zhí)行環(huán)境队贱。這為消息的處理提供了必要的運(yùn)行時配置。

  3. 等待輸出結(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();
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爬虱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腾它,更是在濱河造成了極大的恐慌跑筝,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞒滴,死亡現(xiàn)場離奇詭異曲梗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逛腿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門稀并,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人单默,你說我怎么就攤上這事碘举。” “怎么了搁廓?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵引颈,是天一觀的道長。 經(jīng)常有香客問我境蜕,道長蝙场,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任粱年,我火速辦了婚禮售滤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘台诗。我一直安慰自己完箩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布拉队。 她就那樣靜靜地躺著弊知,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粱快。 梳的紋絲不亂的頭發(fā)上秩彤,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天叔扼,我揣著相機(jī)與錄音,去河邊找鬼漫雷。 笑死瓜富,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的珊拼。 我是一名探鬼主播食呻,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼澎现!你這毒婦竟也來了仅胞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤剑辫,失蹤者是張志新(化名)和其女友劉穎干旧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妹蔽,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椎眯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胳岂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片编整。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乳丰,靈堂內(nèi)的尸體忽然破棺而出掌测,到底是詐尸還是另有隱情,我是刑警寧澤产园,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布汞斧,位于F島的核電站,受9級特大地震影響什燕,放射性物質(zhì)發(fā)生泄漏粘勒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一屎即、第九天 我趴在偏房一處隱蔽的房頂上張望庙睡。 院中可真熱鬧,春花似錦技俐、人聲如沸乘陪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饺谬,卻和暖如春捂刺,著一層夾襖步出監(jiān)牢的瞬間谣拣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工族展, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留森缠,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓仪缸,卻偏偏與公主長得像贵涵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恰画,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容