Parlant:一款優(yōu)雅可控的Agent框架

AI智能體(Agent)開(kāi)發(fā)框架與平臺(tái)可謂百家爭(zhēng)鳴,各有所長(zhǎng)。但一個(gè)不爭(zhēng)的事實(shí)是,大部分在底層設(shè)計(jì)上是趨同的。不過(guò)今天我們將要體驗(yàn)的這款開(kāi)源免費(fèi)框架 - Parlant,或許會(huì)顛覆你的傳統(tǒng)認(rèn)知:

一款旨在最大程度消除LLM帶來(lái)的不確定性,以幫助你“馴服”智能體的框架。

Build compliant AI chat agents, in minutes.
The production-ready engine for Al chat agents that generate aligned responses and follow instructions-even as you scale complexity.

接下來(lái)讓我們一起走進(jìn)這款獨(dú)特的框架:

  • 企業(yè)應(yīng)用Agent的最大“攔路虎”
  • 構(gòu)建對(duì)話式Agent:主流框架的方法
  • 構(gòu)建對(duì)話式Agent:Parlant的方法
  • 深度實(shí)踐:迭代構(gòu)建一個(gè)模擬10086客服助手
  • 總結(jié)、及與LangGraph對(duì)比

這不一定是你見(jiàn)過(guò)最強(qiáng)大的,但很可能是最特別的、甚至“有趣”的Agent框架。

01 企業(yè)應(yīng)用Agent的最大"攔路虎 "

很多人都認(rèn)識(shí)到:盡管大模型(LLM)有著強(qiáng)大的自然語(yǔ)言理解與處理能力,但它的不確定性是限制它在面向客戶與關(guān)鍵業(yè)務(wù)的企業(yè)場(chǎng)景中得以廣泛應(yīng)用的最大障礙 。傳統(tǒng)的Agent通常依賴于大量這樣的復(fù)雜LLM提示:

prompt="
你是一名智能客服助手,目標(biāo)是高效、準(zhǔn)確地幫助客戶解決問(wèn)題。  
你具備以下能力: 
...
### 工作方式(比如ReAct思考模式):
...
### 確保遵循如下業(yè)務(wù)規(guī)則和輸出要求:
...
### 可用的工具列表:
... 

"

遺憾的是,LLM無(wú)法確保絕對(duì)的指令遵循:有時(shí)候會(huì)產(chǎn)生偏差或遺忘,有時(shí)候會(huì)“幻覺(jué)”,特別是在一些長(zhǎng)任務(wù)或者長(zhǎng)對(duì)話場(chǎng)景中,隨著上下文的“膨脹”,它的輸出更加“不可預(yù)測(cè)”,并可能直接導(dǎo)致Agent工作的失敗。

為了優(yōu)化這個(gè)問(wèn)題,這些方法已經(jīng)被不斷嘗試:

  • 流程層面:Workflow/狀態(tài)機(jī) (約束智能體流程)、HITL(人類檢查)
  • 節(jié)點(diǎn)層面:規(guī)則輔助(減少LLM依賴)、樣本(讓LLM參考)
  • 輸出層面:結(jié)構(gòu)化輸出(提高LLM輸出的一致性)
  • 模型層面:微調(diào)(適應(yīng)特定領(lǐng)域)、R4G (給LLM補(bǔ)充知識(shí))

它們?cè)诤艽蟪潭茸孉gent行為更可控,但情況仍然復(fù)雜:

  • 增加提示樣本:樣本只代表少數(shù),覆蓋率有限
  • 微調(diào):限定在特定領(lǐng)域,換了環(huán)境可能會(huì)更差
  • RAG:給模型增加了知識(shí),但無(wú)法其思考方式
  • 結(jié)構(gòu)化輸出:形式可控,但內(nèi)容可能是“幻覺(jué)”
  • 工作流:靈活性低,且節(jié)點(diǎn)可能仍然依賴LLM

所以,如何讓Agent不偏離預(yù)期行為,提高行為的一致性和確定性,一直是各種開(kāi)發(fā)框架與應(yīng)用的努力方向(甚至也是Gen-AI的最大“黑點(diǎn)”)。

02 構(gòu)建對(duì)話式Agent: 主流框架的方法

假如我們需要構(gòu)建一個(gè)典型的對(duì)話式Agent(如智能客服),典型的方法有:

借助增強(qiáng)型LLM的Agent

借助提示工程(參考第一節(jié)的例子)、函數(shù)調(diào)用(Function Calling)與外部工具(RAG管道、企業(yè)API)構(gòu)建的ReAct范式的Agent:

這種方法的最大問(wèn)題是過(guò)度依賴于Prompt與LLM的理解、遵循與推理能力,隨著上下文的增大,發(fā)生偏移和幻覺(jué)的概率越大,而且你需要在每次推理中把所有希望LLM遵循的原則告訴它。如果我們把Agent比作是一個(gè)數(shù)字員工,那么這種方法就是:

給員工一本厚厚的手冊(cè),讓他去服務(wù)客戶,偶爾犯錯(cuò)是難免的。

基于工作流定義的Agent

借助如LangGraph、AutoGen等框架定義的流程式Agent,按照預(yù)定義的過(guò)程與客戶交互(ReActAgent也可以看做是工作流的特例)。


這種Agent的缺點(diǎn)是比較僵化(雖然在局部仍然會(huì)體現(xiàn)LLM的智能),特別是AI對(duì)話式場(chǎng)景下,很難預(yù)測(cè)客戶的交互行為時(shí),容易陷入"不知所措”或者人工”智障“的狀態(tài),它更適合復(fù)雜任務(wù)型的Agent。用上面的比喻來(lái)說(shuō),這種方式是:

給員工制定嚴(yán)格的行動(dòng)步驟,但客戶如果”不走尋常路“,就容易出錯(cuò)。

那么Parlant是如何做的呢?

03 構(gòu)建對(duì)話式Agent: Parlant的方法

Parlant專注于對(duì)話式Agent的場(chǎng)景,并設(shè)計(jì)了一種獨(dú)特的控制Agent與用戶之間交互的新方法,被稱之為ABM(Agent Behavior Model,用戶行為建模)。

簡(jiǎn)單的說(shuō),就是給Agent指定一套完整的、結(jié)構(gòu)化的、自然語(yǔ)言描述的業(yè)務(wù)準(zhǔn)則,包括Agent的目標(biāo)、行動(dòng)指南(Guideline)、對(duì)話流程(Journey)、標(biāo)準(zhǔn)化回復(fù)(Canned Response)、詞匯表(Glossary)等,并通過(guò)框架來(lái)強(qiáng)制這些準(zhǔn)則的應(yīng)用與執(zhí)行。

以一個(gè)典型的行動(dòng)指南(Guildeline)為例:

await agent.create_guideline(     
    condition="客戶詢問(wèn)話費(fèi)余額",     
    action="使用query_balance工具查詢并告知客戶當(dāng)前余額",     
    tools=[query_balance]     
)

注意,你無(wú)需編排工作流,也無(wú)需用提示詞讓LLM識(shí)別客戶意圖,你需要做的只是很自然的設(shè)定這個(gè)準(zhǔn)則,Parlant會(huì)確保這個(gè)準(zhǔn)則被執(zhí)行。

那么Parlant是如何最大可能的確保準(zhǔn)則被遵循的呢?盡管內(nèi)部過(guò)程較復(fù)雜,并且依賴于一種ARQ(注意推理查詢)的創(chuàng)新提示技術(shù),但可以總結(jié)成兩點(diǎn):

  1. Parlant引擎會(huì)動(dòng)態(tài)根據(jù)上下文來(lái)評(píng)估與加載本次交互相關(guān)的規(guī)則,并基于這些規(guī)則來(lái)執(zhí)行操作與合成回復(fù)。
  2. 在Agent輸出回復(fù)給客戶之前對(duì)其進(jìn)行監(jiān)督,以最大程度的確保Agent正確遵循了必要的準(zhǔn)則后給予放行。

用之前的比喻來(lái)說(shuō),Parlant的方式就是:

在員工服務(wù)客戶的過(guò)程中,有權(quán)威會(huì)根據(jù)情景持續(xù)指導(dǎo)你并監(jiān)督執(zhí)行。

對(duì)比主流框架的方法,Parlant方法的好處是:

  • 降低LLM的認(rèn)知負(fù)擔(dān)(每次只加載相關(guān)準(zhǔn)則)
  • 非常適合處理邊緣場(chǎng)景(添加針對(duì)性準(zhǔn)則)
  • 可以為每一次Agent行為提供可解釋性(畢竟有”權(quán)威“盯著)

下面我們用實(shí)例來(lái)認(rèn)識(shí)Parlant中的核心模塊。

04 實(shí)戰(zhàn):構(gòu)建一個(gè)模擬的10086客服助手

在這個(gè)案例中,我們一步步的借助Parlant來(lái)創(chuàng)建一個(gè)模擬10086客服的Agent,你將可以深入認(rèn)識(shí)與體會(huì)ABM建模是如何幫助創(chuàng)建一個(gè)易于理解、更可控的企業(yè)級(jí)對(duì)話式Agent。

【步驟1:準(zhǔn)備工作】

安裝Parlant的開(kāi)發(fā)SDK(Python3.10以上):

pip install parlant

例子中使用了OpenAI接口,因此你至少需要設(shè)置環(huán)境變量OPENAI_API_KEY。(如果是借助第三方API平臺(tái),需要設(shè)置OPENAI_BASE_URL,但默認(rèn)Parlant SDK中不支持傳入OPENAI_BASE_URL,方法請(qǐng)參考本文源碼中的說(shuō)明)。

【步驟2:創(chuàng)建智能體(Agent)】

Parlant的Agent是一個(gè)定制化的 AI 角色,代表你的“服務(wù)員工”。你可以使用 SDK 創(chuàng)建并配置多個(gè) Agent,每個(gè) Agent 有獨(dú)立的身份、背景和行為特征;每個(gè) Agent 都可以擁有自己的行為模型和對(duì)話歷史,相互隔離。

通過(guò)幾行代碼創(chuàng)建一個(gè)Agent:

async def main() -> None:     
    async with p.Server(     
        nlp_service=p.NLPServices.openai     
    ) as server:     
        agent = await server.create_agent(     
            name="10086客服小助手",     
            description="專業(yè)友好的電信運(yùn)營(yíng)商客戶服務(wù)代表,提供話費(fèi)查詢、套餐變更等服務(wù)。")         
    
if __name__ == "__main__":     
    import asyncio     
    asyncio.run(main())

Parlant的Agent特點(diǎn)是運(yùn)行即服務(wù):會(huì)自動(dòng)啟動(dòng)一個(gè)Agent Server,你可以通過(guò)API與Server中的多個(gè)Agent對(duì)話。Parlant提供了一個(gè)測(cè)試的前端UI,訪問(wèn)http://localhost:8800,就可以體驗(yàn)這個(gè)原始版Agent:

user:Hello,你會(huì)做什么呢?
10086客服小助手:你好! 我可以幫助你查詢?cè)捹M(fèi)、變更套餐, 或者解答其他與電信服務(wù)相關(guān)的問(wèn)題。請(qǐng)問(wèn)你需要什么幫助呢?

【步驟3:添加簡(jiǎn)單的指南(guideline)】

指南(guideline,也叫準(zhǔn)則),是 Parlant 建模的核心單元。每條準(zhǔn)則由“何時(shí)觸發(fā)” (condition) 和“做什么” (action) 兩部分組成 ,用簡(jiǎn)單自然語(yǔ)言編寫。

現(xiàn)在來(lái)給Agent添加簡(jiǎn)單的兩條準(zhǔn)則:

await agent.create_guideline(     
    condition="客戶進(jìn)行日常閑聊",     
    action="友好回應(yīng),但適當(dāng)引導(dǎo)到業(yè)務(wù)服務(wù)話題。"     
)  
await agent.create_guideline(     
    condition="當(dāng)客戶明確表達(dá)出對(duì)服務(wù)不滿意或有投訴、轉(zhuǎn)網(wǎng)的意圖",     
    action="首先表示歉意,并表示將會(huì)讓客戶經(jīng)理聯(lián)系客戶,了解客戶需求并提供幫助。"     
)

看下測(cè)試效果:

user:你好,我想注銷我的電話號(hào)碼。
10086客服小助手:你好! 很抱歉聽(tīng)到您想注銷電話號(hào)碼。我們可以安排客戶經(jīng)理與您聯(lián)系,了解您的需求并提供幫助。請(qǐng)問(wèn)您方便提供聯(lián)系方式嗎?

可以看到,Agent完美的遵循了服務(wù)準(zhǔn)則。

Parlant 會(huì)動(dòng)態(tài)篩選當(dāng)前情景下最相關(guān)的準(zhǔn)則,并強(qiáng)制遵循,從而保證 Agent 行為始終符合業(yè)務(wù)預(yù)期(如果準(zhǔn)則之前存在沖突或者依賴關(guān)系,Parlant支持定義準(zhǔn)則間的關(guān)系)。

【步驟4:添加帶工具(Tools)的指南】

現(xiàn)在我們來(lái)讓小助手具有“查詢?cè)捹M(fèi)”的能力,這就需要用到工具(Tool)這個(gè)模塊。Parlant中通過(guò)@p.tool這個(gè)裝飾器定義工具:

@p.tool
async def query_balance(context: p.ToolContext, phone_number: str) -> p.ToolResult:  
    #....省略模擬的API調(diào)用...  
    result = f"您的話費(fèi)余額為{info['balance']:.2f}元,下次繳費(fèi)日期:{info['due_date']}"     
    return p.ToolResult(result)

現(xiàn)在來(lái)添加一條需要”使用工具“的業(yè)務(wù)準(zhǔn)則:

await agent.create_guideline(     
    condition="僅當(dāng)客戶明確要求查詢自己的話費(fèi)余額",     
    action="使用query_balance工具查詢并告知客戶當(dāng)前余額",     
    tools=[query_balance]     
)

在準(zhǔn)則中關(guān)聯(lián)工具后,只有當(dāng)規(guī)則觸發(fā)時(shí),Agent 才會(huì)調(diào)用相應(yīng)工具并將結(jié)果用于生成回答 。這種設(shè)計(jì)讓工具調(diào)用變得可控且上下文敏感,避免了模型“盲目調(diào)用”的問(wèn)題。

測(cè)試新業(yè)務(wù)準(zhǔn)則的執(zhí)行:

user:你好,我想查詢下我的話費(fèi)還剩多少?
10086客服小助手:你好! 請(qǐng)?zhí)峁┠氖謾C(jī)號(hào)碼,以便我為您查詢?cè)捹M(fèi)余額。
user:號(hào)碼是13812345678
10086客服小助手:好的,讓我為您查詢一下。 您的話費(fèi)余額為85.60元,下次充值日期為2024-12-15。

【步驟5:注冊(cè)客戶(Customer)并獲取信息】

上面的測(cè)試中可以看到Agent會(huì)要求輸入電話號(hào)碼以查詢?cè)捹M(fèi),但是在實(shí)際場(chǎng)景中,客戶在登錄后就已經(jīng)可以獲得其信息(比如手機(jī)號(hào)碼),并且應(yīng)該在后續(xù)的對(duì)話上下文中自動(dòng)帶入。在Parlant中,你可以通過(guò)Customer這個(gè)模塊來(lái)完成:

在完成登錄后,創(chuàng)建一個(gè)客戶(實(shí)際應(yīng)用中通常是客戶端來(lái)創(chuàng)建):

customer = await server.create_customer(name="user",metadata={"phone_number": "13812345678"})

然后你就可以在工具中直接通過(guò)上下文獲得電話號(hào)碼,而無(wú)需客戶提供:

...  
server = p.ToolContextAccessor(context).server  
if customer := await server.find_customer(id=context.customer_id):     
    phone_number = customer.metadata.get("phone_number")

現(xiàn)在你會(huì)發(fā)現(xiàn)AI可以直接調(diào)用工具幫你查詢?cè)捹M(fèi),而無(wú)需提供號(hào)碼。

【步驟6:實(shí)現(xiàn)多步驟復(fù)雜交互(Journey)】

Journey(旅程)是Parlant中相對(duì)復(fù)雜的模塊,你可以理解成是Parlant的工作流。它用于定義Agent復(fù)雜流程的對(duì)話走向,通常對(duì)應(yīng)到業(yè)務(wù)場(chǎng)景中一些多步驟的引導(dǎo)與交互過(guò)程,比如行程預(yù)定、業(yè)務(wù)變更等。

一個(gè) Journey 包含標(biāo)題、觸發(fā)條件和狀態(tài)轉(zhuǎn)換圖(狀態(tài)與條件/動(dòng)作的有向圖)。Parlant 允許Agent靈活地按照旅程的狀態(tài)圖進(jìn)行對(duì)話,但也可以跳過(guò)、中途返回或提前進(jìn)入某些狀態(tài),從而在保證收集必要信息的同時(shí),提升用戶體驗(yàn) 。

我們用Journey來(lái)實(shí)現(xiàn)“話費(fèi)套餐變更”這個(gè)功能。這個(gè)對(duì)話“旅程”如下:

【圖片標(biāo)記:此處應(yīng)有套餐變更流程示意圖,包含開(kāi)始、客戶要求變更套餐、查詢可用套餐query_available_plans、展示套餐列表詢問(wèn)客戶選擇、客戶選擇套餐、確認(rèn)是否變更、客戶決定(是/否)、執(zhí)行套餐變更c(diǎn)hange_plan、告知變更結(jié)果、結(jié)束等節(jié)點(diǎn)及流向】

將其轉(zhuǎn)換成Parlant的SDK實(shí)現(xiàn)。首先創(chuàng)建兩個(gè)模擬工具,分別用來(lái)查詢可用套餐與執(zhí)行變更套餐:

@p.tool
async def query_available_plans(context: p.ToolContext) -> p.ToolResult:...

@p.tool
async def change_plan(context: p.ToolContext, new_plan_id: PlanID) -> p.ToolResult:...

接著來(lái)定義這個(gè)旅程:

async def create_plan_change_journey(agent: p.Agent) -> p.Journey:     
    """創(chuàng)建套餐變更旅程"""     
    journey = await agent.create_journey(     
        title="話費(fèi)套餐變更",     
        description="幫客戶找到合適的話費(fèi)套餐并完成變更",     
        conditions=["僅當(dāng)客戶明確表示需要變更話費(fèi)套餐"],     
    )     
    t0 = await journey.initial_state.transition_to(tool_state=query_available_plans)     
    t1 = await t0.target.transition_to(chat_state="列出可以變更的套餐,然后詢問(wèn)客戶需要變更到哪個(gè)套餐")     
    t2 = await t1.target.transition_to(chat_state="詢問(wèn)客戶是否確認(rèn)本次變更",condition="客戶選擇變更到某一個(gè)新的業(yè)務(wù)套餐")     
    t31 = await t2.target.transition_to(tool_state=change_plan,condition="客戶確認(rèn)變更套餐",tool_instruction="new_plan_id參數(shù)值從可用的套餐中提取")     
    await t2.target.transition_to(state=t0.target,condition="客戶表示還需要再考慮一下")     
    t4 = await t31.target.transition_to(chat_state="根據(jù)變更的結(jié)果告知客戶變更成功或者失敗",condition="套餐變更結(jié)束")     
    await t4.target.transition_to(state=p.END_JOURNEY)     
    await journey.create_guideline(     
        condition="客戶明確表示需要深入了解某個(gè)套餐的詳細(xì)信息",     
        action="查詢某個(gè)套餐的詳細(xì)信息并告知客戶,plan_id從客戶對(duì)話中提取",     
        tools=[get_plan_details],     
    )     
    return journey

這個(gè)定義方式并不難理解,就是用代碼來(lái)描述:在什么條件下,從A狀態(tài)跳轉(zhuǎn)到B狀態(tài),狀態(tài)可以是對(duì)話狀態(tài)(chat_state)或工具狀態(tài)(tool_state)。

另外,一個(gè)Journey也可以定義屬于它的準(zhǔn)則(Guideline)。比如這里針對(duì)客戶可能在任何時(shí)候提出想”深入了解某個(gè)套餐“而添加了一條準(zhǔn)則。

現(xiàn)在測(cè)試這個(gè)Journey的基本流程:

10086客服小助手:
PLAN004-青春套餐38元: 通話200分鐘, 流量8GB, 短信50條
PLAN005-優(yōu)享套餐188元:通話無(wú)限,流量無(wú)限, 短信無(wú)限
請(qǐng)問(wèn)您想變更到哪個(gè)套餐呢?

user:
變更到188元這個(gè)套餐

10086客服小助手:
好的,讓我為您處理一下。
請(qǐng)您確認(rèn)一下,您想要變更到的套餐是188元的優(yōu)享套餐嗎?

但是,Parlant的Journey與其他工作流不一樣的是:

它不是一種嚴(yán)格遵循的固定流程,只是一種指導(dǎo)性的框架流程。Parlant框架會(huì)在每次交互時(shí)智能的來(lái)判斷應(yīng)該激活的流程狀態(tài),即使你并沒(méi)有定義這樣的“跳轉(zhuǎn)”。這給Agent賦予了極大的自適應(yīng)能力。

比如我在這個(gè)”旅程“中“反復(fù)橫跳”:

user:
算了,還是不變了吧

10086客服小助手:
明白了,稍等一下。 很抱歉讓您感到不滿意。我會(huì)讓客戶經(jīng)理聯(lián)系您,了解您的需求并提供幫助。請(qǐng)您稍等一下。

user:算了還是幫我做個(gè)變更吧,換個(gè)套餐

10086客服小助手:
明白了,請(qǐng)稍等。 很抱歉讓您感到不滿。請(qǐng)您告訴我想要更改到哪個(gè)套餐?

user:變更到188元那個(gè)套餐

10086客服小助手:
很抱歉讓您感到不滿意。您選擇的套餐是188元的優(yōu)享套餐, 具體信息 如下:
·月費(fèi):188元
·通話:無(wú)限制
·流量:無(wú)限制
·短信:無(wú)限制
·特殊服務(wù):免費(fèi)接聽(tīng), VIP客戶服務(wù), 全國(guó)通用, 5G網(wǎng)絡(luò), 免費(fèi)熱點(diǎn), 國(guó)際漫游優(yōu)待 ·超出資費(fèi):無(wú)超出資費(fèi)使用
請(qǐng)問(wèn)您確認(rèn)要變更到這個(gè)套餐嗎?

你會(huì)發(fā)現(xiàn)這里的互動(dòng)并沒(méi)有嚴(yán)格遵循流程走向。但這才是真實(shí)的應(yīng)用場(chǎng)景:你無(wú)法預(yù)測(cè)客戶真實(shí)的交互行為。

【步驟7:利用變量減少工具調(diào)用(Variable)】

在很多低代碼平臺(tái)中也存在變量(Variable) 的概念:用來(lái)標(biāo)識(shí)一條在上下文中經(jīng)常會(huì)用到的特定信息,并且可以按需更改和刷新。

在測(cè)試上面的例子時(shí)我發(fā)現(xiàn)Agent經(jīng)常會(huì)通過(guò)query_available_plans來(lái)獲取可用的套餐信息,于是決定把這個(gè)信息放到變量里,并設(shè)定每小時(shí)刷新一次:

# 添加變量     
available_plans = await agent.create_variable(     
    name="可用話費(fèi)套餐",     
    description="客戶可以選擇的套餐列表",     
    tool=query_available_plans,     
    freshness_rules='0 * * * *'     
)

這里指定通過(guò)Tool來(lái)刷新available_plans這個(gè)變量,并且刷新規(guī)則用freshness_rules來(lái)指定(遵循crontab表達(dá)式)。

變量會(huì)由框架動(dòng)態(tài)評(píng)估是否帶入到每次對(duì)話的上下文,以及是否需要刷新。 默認(rèn)情況下(不指定freshness_rules),變量會(huì)在每次交互時(shí)自動(dòng)刷新。

現(xiàn)在測(cè)試Agent并觀察后臺(tái),你會(huì)發(fā)現(xiàn)Agent只會(huì)在第一次需要時(shí)調(diào)用工具初始化這個(gè)變量,而后續(xù)的交互會(huì)自動(dòng)帶入該信息。

【步驟8:設(shè)定標(biāo)準(zhǔn)化回復(fù)(Canned Response)】

在企業(yè)服務(wù)場(chǎng)景下,有一些標(biāo)準(zhǔn)的“話術(shù)”,以體現(xiàn)服務(wù)的標(biāo)準(zhǔn)化和一致性。盡管Parlant已經(jīng)盡量讓Agent更加受控,但在回復(fù)消息上依賴于LLM仍然存在較大的不確定性,此時(shí)你可以借助標(biāo)準(zhǔn)化回復(fù)這個(gè)模塊。當(dāng)觸發(fā)相應(yīng)條件時(shí)直接調(diào)用,從而 消除幻覺(jué),并確保輸出的統(tǒng)一 。

注意Parlant的標(biāo)準(zhǔn)化回復(fù)的特點(diǎn):

  • 基于模板定義,可以包含如變量、工具響應(yīng)中的動(dòng)態(tài)字段
  • 非簡(jiǎn)單復(fù)制使用,而是會(huì)動(dòng)態(tài)選擇合適的模板,并智能合成消息

我們讓Agent在"閑聊”這個(gè)準(zhǔn)則下使用預(yù)設(shè)回復(fù)模板:

#歡迎
welcome = await agent.create_canned_response(  
   template="你好!{{std.customer.name}}, 很高興為您服務(wù)。請(qǐng)問(wèn)有什么可以幫您?")
...
await agent.create_guideline(     
    condition="客戶進(jìn)行日常閑聊",     
    action="友好回應(yīng),但適當(dāng)引導(dǎo)到業(yè)務(wù)服務(wù)話題。",    
    canned_responses=[welcome]
)

看下測(cè)試效果(Parlant的交互默認(rèn)會(huì)有一個(gè)前導(dǎo)響應(yīng),也可以設(shè)定):

user:
你好啊

10086客服小助手:
你好! 很高興為您服務(wù)。請(qǐng)問(wèn)有什么可以幫您?

【步驟9:添加特定術(shù)語(yǔ)(Glossary)】

詞匯表,顧名思義它就相當(dāng)于一個(gè)Agent可以參考的“字典”。 通常用來(lái)定義你的領(lǐng)域特定術(shù)語(yǔ),用來(lái)幫助Agent理解其含義;也可以用回答一些固定的問(wèn)題。

比如在上面的情境中,如果客戶要求變更到“至尊套餐”,那么你就需要讓Agent知道至尊套餐是代表哪一個(gè)話費(fèi)套餐。

讓我們添加兩個(gè)術(shù)語(yǔ):

# 術(shù)語(yǔ)
await agent.create_term(     
    name="營(yíng)業(yè)時(shí)間",     
    description="營(yíng)業(yè)時(shí)間是周一至周五,上午9點(diǎn)到下午6點(diǎn)。",
)
await agent.create_term(     
    name="至尊套餐",     
    description="至尊套餐是最高級(jí)別的188元套餐",
)

看看測(cè)試效果:

user:
幫我變更到至尊套餐

10086客服小助手:
好的,讓我為您處理一下。 請(qǐng)確認(rèn)您要變更到至尊套餐, 套餐費(fèi)用為188元, 包含無(wú)限通話和無(wú)限流量。

您確認(rèn)嗎?

【步驟10:將Agent集成到前端】

在Agent構(gòu)建完成并且測(cè)試通過(guò)后,你可能需要將Agent集成到你的前端應(yīng)用中,讓客戶可以通過(guò)UI與你的Agent交互。這有兩種方式:

  1. 借助Parlant提供的REST API;
  2. 借助官方提供的parlant-chat-react插件 (需要React JS框架),它提供了一個(gè)完整的對(duì)話界面,簡(jiǎn)單配置即可連接到你的Agent。最簡(jiǎn)單的例子如下:
import React from 'react';
import ParlantChatbox from 'parlant-chat-react';

function App() {  
  return (     
    <div>     
      <h1>My Application</h1>     
      <ParlantChatbox     
        server="http://localhost:8800"    
        agentId="your-agent-id"     
      </div>  
  );
}

export default App;

05 總結(jié)、及與LangGraph的對(duì)比

以上通過(guò)迭代的方式完成了一個(gè)簡(jiǎn)單的對(duì)話式AI助手。

在整個(gè)過(guò)程中,我們切身體驗(yàn)到的Parlant的一些獨(dú)特之處:

  • 聲明式的自然語(yǔ)言規(guī)則定義,并通過(guò)創(chuàng)新機(jī)制來(lái)確保與監(jiān)督執(zhí)行
  • 能夠高度靈活的適應(yīng)真實(shí)的客戶對(duì)話場(chǎng)景(非死板的流程遵循)
  • 高度模塊化設(shè)計(jì),ABM的每個(gè)模塊都功能清晰,簡(jiǎn)潔易用
  • 針對(duì)高標(biāo)準(zhǔn)與合規(guī)要求的企業(yè)級(jí)設(shè)計(jì)。如規(guī)則遵循、標(biāo)準(zhǔn)化回復(fù)等

而一些目前的不足主要在于:

  • 內(nèi)部對(duì)規(guī)則執(zhí)行的過(guò)程較復(fù)雜,Tokens成本略高
  • 畢竟還要依賴LLM,還是存在推理失誤現(xiàn)象(如調(diào)用多余工具)
  • 不需要直接設(shè)計(jì)Prompt,但自然語(yǔ)言的描述還是需要優(yōu)化調(diào)試
  • 當(dāng)出現(xiàn)內(nèi)部推理不精確時(shí),可能導(dǎo)致反復(fù)嘗試,響應(yīng)較慢

整體來(lái)說(shuō),Parlant引入了“行為建?!边@一令人眼前一亮的全新范式,為智能體(主要是對(duì)話性Agent)的構(gòu)建注入了企業(yè)級(jí)應(yīng)用更需要的可控性與可解釋性,并采用了一種完全不同于其他Agent框架的”優(yōu)雅“方式,把Agent開(kāi)發(fā)從繁瑣的“提示詞”+“工作流微調(diào)”中解放出來(lái),用一種更輕松的方式來(lái)定義Agent行為,同時(shí)又不失強(qiáng)大與靈活,非常值得持續(xù)關(guān)注。

最后簡(jiǎn)單對(duì)比下Parlant與LangGraph的定位:

維度 Parlant LangGraph
定位 專注于單一客戶交互代理,保證行為一致性和業(yè)務(wù)規(guī)則合規(guī)性 面向通用復(fù)雜工作流與多智能體系統(tǒng),強(qiáng)調(diào)長(zhǎng)時(shí)、可擴(kuò)展編排
適合場(chǎng)景 客服、金融合規(guī)、需要透明可審計(jì)的對(duì)話型應(yīng)用 研發(fā)任務(wù)分解、審批流、數(shù)據(jù)處理、多Agent協(xié)同、復(fù)雜業(yè)務(wù)自動(dòng)化
設(shè)計(jì)理念 行為建模(Guidelines+Journeys),聲明式規(guī)則驅(qū)動(dòng) 狀態(tài)化編排(Graph+Engine),開(kāi)發(fā)者自定義節(jié)點(diǎn)與狀態(tài)流
流程編排 內(nèi)置Journey狀態(tài)機(jī),支持跳過(guò)/回溯,日志記錄事件流 圖結(jié)構(gòu),支持條件邊、循環(huán)、檢查點(diǎn)、耐久執(zhí)行和時(shí)間旅行
可解釋性 Guideline規(guī)則觸發(fā)機(jī)制,減少LLM隨機(jī)性;Session日志可追溯 檢查點(diǎn)+Replay+Time Travel,支持流程回放與分支試驗(yàn),調(diào)試能力強(qiáng)
社區(qū)活躍度 GitHub~10.6k stars,文檔詳盡,聚焦對(duì)話場(chǎng)景,規(guī)模中等 GitHub ~18k stars,LangChain生態(tài)一部分,大廠案例多,更新活躍度高

Parlant適合構(gòu)建高度可控、透明、合規(guī)的對(duì)話智能體(客服、金融、政務(wù)服務(wù)等);LangGraph更適合需要復(fù)雜工作流、多Agent協(xié)同、長(zhǎng)時(shí)執(zhí)行的任務(wù)場(chǎng)景。

本文源代碼:https://github.com/dequal/parlant-demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容