
區(qū)塊鏈API推薦,快速開發(fā)去中心化應(yīng)用
apiKey: sk-xxxxxxxxxxxxxxxxxxxxxxx
domain: dashscope.aliyuncs.com
serviceName: dashscope
servicePort: 443
promptTemplate:
language: CH
apis:
- apiProvider:
domain: restapi.amap.com
serviceName: geo
servicePort: 80
apiKey:
in: query
name: key
value: fcxxxxxxxxxxxxxxxxxx
api: |
openapi: 3.1.0
info:
title: 高德地圖
description: 獲取 POI 的相關(guān)信息
version: v1.0.0
servers:
- url: https://restapi.amap.com
paths:
/v5/place/text:
get:
description: 根據(jù)POI名稱,獲得POI的經(jīng)緯度坐標(biāo)
operationId: get_location_coordinate
parameters:
- name: keywords
in: query
description: POI名稱,必須是中文
required: true
schema:
type: string
- name: region
in: query
description: POI所在的區(qū)域名,必須是中文
required: true
schema:
type: string
deprecated: false
/v5/place/around:
get:
description: 搜索給定坐標(biāo)附近的POI
operationId: search_nearby_pois
parameters:
- name: keywords
in: query
description: 目標(biāo)POI的關(guān)鍵字
required: true
schema:
type: string
- name: location
in: query
description: 中心點的經(jīng)度和緯度,用逗號隔開
required: true
schema:
type: string
deprecated: false
components:
schemas: {}
- apiProvider:
domain: api.seniverse.com
serviceName: seniverse
servicePort: 80
apiKey:
in: query
name: key
value: SMxxxxxxxxxxxxxx
api: |
openapi: 3.1.0
info:
title: 心知天氣
description: 獲取 天氣預(yù)辦相關(guān)信息
version: v1.0.0
servers:
- url: https://api.seniverse.com
paths:
/v3/weather/now.json:
get:
description: 獲取指定城市的天氣實況
operationId: get_weather_now
parameters:
- name: location
in: query
description: 所查詢的城市
required: true
schema:
type: string
- name: language
in: query
description: 返回天氣查詢結(jié)果所使用的語言
required: true
schema:
type: string
default: zh-Hans
enum:
- zh-Hans
- en
- ja
- name: unit
in: query
description: 表示溫度的的單位,有攝氏度和華氏度兩種
required: true
schema:
type: string
default: c
enum:
- c
- f
deprecated: false
components:
schemas: {}
插件配置分三部分,第一部分dashscope,是通義千問大模型服務(wù)的相關(guān)信息,第二部分promptTemplate,是自定義agent react模板的配置項,示例中的language是指使用中文模板,第三部分apis是外部API服務(wù)的相關(guān)配置,包含服務(wù)相關(guān)信息apiProvider以及api(tools)的OpenAPI文檔,這一部分是實現(xiàn)agent調(diào)用外部工具的關(guān)鍵,agent會通過理解OpenAPI文檔來理解參數(shù)應(yīng)該賦什么值。
示例請求一:Terminal window
curl 'http://<這里換成網(wǎng)關(guān)公網(wǎng)IP>/api/openai/v1/chat/completions' \-H 'Accept: application/json, text/event-stream' \-H 'Content-Type: application/json' \--data-raw '{"messages":[{"role":"user","content":"我想在濟南市鑫盛大廈附近喝咖啡,給我推薦幾個"}],"model":"qwen","stream":false}'
示例響應(yīng)一:
{...,"content":" 在濟南市鑫盛大廈附近,您可以選擇以下咖啡店:\n1. luckin coffee 瑞幸咖啡(鑫盛大廈店),位于新濼大街1299號鑫盛大廈2號樓大堂;\n2. 三慶齊盛廣場挪瓦咖啡(三慶·齊盛廣場店),位于新濼大街與穎秀路交叉口西南60米;\n3. luckin coffee 瑞幸咖啡(三慶·齊盛廣場店),位于穎秀路1267號;\n4. 庫迪咖啡(齊魯軟件園店),位于新濼大街三慶齊盛廣場4號樓底商;\n5. 庫迪咖啡(美蓮廣場店),位于高新區(qū)新濼大街1166號美蓮廣場L117號;以及其他一些選項。希望這些建議對您有所幫助!"...}
示例請求二:
curl 'http://<這里換成網(wǎng)關(guān)公網(wǎng)IP>/api/openai/v1/chat/completions' \-H 'Accept: application/json, text/event-stream' \-H 'Content-Type: application/json' \--data-raw '{"messages":[{"role":"user","content":"濟南市現(xiàn)在的天氣情況如何?"}],"model":"qwen","stream":false}'
示例響應(yīng)二:
{..."content":" 濟南市現(xiàn)在的天氣狀況為陰天,溫度為31℃。此信息最后更新于2024年8月9日15時12分(北京時間)。"...}
示例請求三:Terminal window
curl 'http://<這里換成網(wǎng)關(guān)公網(wǎng)IP>/api/openai/v1/chat/completions' \-H 'Accept: application/json, text/event-stream' \-H 'Content-Type: application/json' \--data-raw '{"messages":[{"role":"user","content":"濟南市現(xiàn)在的天氣情況如何?用華氏度表示,用日語回答"}],"model":"qwen","stream":false}'
示例響應(yīng)三:
{..."content":" 濟南市の現(xiàn)在の天気は雨曇りで、気溫は88°Fです。この情報は2024年8月9日15時12分(東京時間)に更新されました。"...}
AI Agent插件的實現(xiàn)是使用了ReAct(Reasoning and Action),ReAct一詞來自于論文《ReAct: Synergizing Reasoning and Acting in Language Models》,其核心思想是通過思維鏈的方式,引導(dǎo)模型將復(fù)雜問題進(jìn)行拆分,一步一步地推理(Reasoning)和行動(Action),同事還引入了觀察(Observation)環(huán)節(jié),在每次執(zhí)行(Action)之后,都會先觀察(Observation)當(dāng)前現(xiàn)狀,然后再進(jìn)行下一步的推理(Reasoning)。
ReAct,就是要讓開發(fā)者引導(dǎo)大模型進(jìn)行推理,然后根據(jù)推理結(jié)果,判斷需要采取哪個行動(調(diào)用工具),與外界環(huán)境互動。
ReAct的工作流程如下:
插件的工作流程如下:
AI Proxy插件配置在默認(rèn)階段,而AI Agent可以配置在確保比AI Agent優(yōu)先級高的階段,比如認(rèn)證階段。這樣可以保證用戶的http request可以先被AI Agent攔截到。
AI Agent的處理過程分為三個部分。
使用AI Agent需要先按上一章節(jié)的插件參數(shù)配置的格式配置好服務(wù)以及api相關(guān)參數(shù),也就是圖中第0步要做的工作。
首先,因為Agent是一個一步一步思考,多次調(diào)用工具的過程,因此是一個多輪對話場景,因此AI Agent維護(hù)了一個messageStore,用來存儲歷史對話。
整個Agent ReAct的控制核心就在于prompt模板,中文版本的模板如下:
盡你所能回答以下問題。你可以使用以下工具:{tools}請使用以下格式,其中Action字段后必須跟著Action Input字段,并且不要將Action Input替換成Input或者tool等字段,不能出現(xiàn)格式以外的字段名,每個字段在每個輪次只出現(xiàn)一次:Question: 你需要回答的輸入問題Thought: 你應(yīng)該總是思考該做什么Action: 要采取的動作,動作只能是{tools_name}中的一個 ,一定不要加入其它內(nèi)容Action Input: 行動的輸入,必須出現(xiàn)在Action后。Observation: 行動的結(jié)果...(這個Thought/Action/Action Input/Observation可以重復(fù)N次)Thought: 我現(xiàn)在知道最終答案Final Answer: 對原始輸入問題的最終答案再次重申,不要修改以上模板的字段名稱,開始吧!Question: {input}
該模板指導(dǎo)了大模型的推理過程。
在AI Agent的onHttpRequestBody階段,接收到用戶的query后,例如:我要在北京五道口附近喝咖啡,幫我推薦一下,會將query填入{input}
部分,同時將插件參數(shù)配置中的api名稱,功能以及OpenAPI文檔放在{tools}
部分,將api名稱放在{tools_name}
部分。
將該prompt模板存入到messageStore中,格式為:
role: usermsg: {prompt模板}
之后通過proxywasm.ReplaceHttpRequestBody函數(shù)用prompt模板替換掉用戶的原始query,通過ai-proxy發(fā)送給大模型。
此部分對應(yīng)圖中的1,2,3,4步驟。
大模型的返回會在AI Agent的onHttpResponseBody階段攔截到。此時首先將回復(fù)內(nèi)容存儲到messageStore中,格式為:
role: assistantmsg: {大模型的回復(fù)}
之后需要通過正則表達(dá)式來判斷大模型的返回內(nèi)容。
例如上文的例子,大模型會返回如下內(nèi)容:
Thought: 為了提供咖啡店的推薦,我首先需要獲取五道口這一地點的經(jīng)緯度坐標(biāo)。Action: get_location_coordinateAction Input: {"keywords": "五道口", "region": "北京市"}
通過正則表達(dá)式取出Action與Action Input的值,就得到了需要調(diào)用的工具名稱以及參數(shù)的值。
由于通常外部API都會提供一個認(rèn)證apiKey,只有配置了apiKey,才能使用api接口。以本例子為例,需要在url中包含key={apiKey}
的參數(shù),所以我在apiProvider中對apiKey做了設(shè)計。包含name和value兩個字段,name表示實際服務(wù)商要求的apiKey的名稱,例如本例中的key,value是具體的apiKey值。
程序還會根據(jù)OpenAPI文檔拼接處url以及查看method是什么,從而發(fā)送對應(yīng)的http請求,例如本例子是要發(fā)送:
GET https://restapi.amap.com/v5/place/text?key=xxxxxx&keywords=五道口®ion=北京市
該API的回復(fù)為:
{"status":0,"message":"成功","result":{"location":{"lng":116.352978,"lat":39.982849},"precise":1,"confidence":100,"comprehension":100}}
將該回復(fù)拼接到Observation后面,作為新的query,在存儲到messageStore后,將整個歷史對話發(fā)送給大模型。此時由于處在插件的onHttpResponseBody階段,無法再通過ai-proxy訪問大模型,因此需要自己去調(diào)用dashscope client訪問大模型。
大模型會返回如下內(nèi)容:
Thought: 現(xiàn)在我得到了五道口的經(jīng)緯度坐標(biāo),接下來我可以使用這些坐標(biāo)來搜索附近的咖啡店。Action: search_nearby_poisAction Input: {"keywords": "咖啡", "longitude": "116.352978", "latitude": "39.982849"}
程序通過正則得到Action與Action Input后,會重復(fù)剛才的過程,組裝新的url,向高德地圖發(fā)請求,然后把結(jié)果存messageStore后給到大模型。整個過程是一個不斷遞歸調(diào)用的過程。
大模型會再次返回:
Thought: 我現(xiàn)在知道最終答案Final Answer: 在北京市五道口附近有幾家咖啡店可以選擇,包括:- 星巴克五道口店- Costa Coffee五道口店- 漫咖啡五道口店您可以根據(jù)個人喜好選擇前往。
這一次,程序通過可以檢測到回復(fù)中包含了Final Answer,這說明大模型已經(jīng)得到了最終答案,無需再次調(diào)用工具了。因此檢測到Final Answer就是結(jié)束遞歸調(diào)用的條件,此時就可以將Final Answer的答案通過proxywasm.ReplaceHttpResponseBody函數(shù)替換掉response body返回給用戶了。
該部分對應(yīng)圖中的5,6,7,8步驟。
本文主要介紹了AI Agent的背景,概念,探討了AI Agent網(wǎng)關(guān)插件的使用方法,效果以及實現(xiàn)原理。希望對你有幫助!
插件的實現(xiàn)已經(jīng)提交PR給Higress開源社區(qū),可以到這里查看完整的代碼實現(xiàn):https://github.com/alibaba/higress/pull/1192
原文鏈接:https://higress.cn/blog/higress-gvr7dx_awbbpb_im44tpldqyt8c97d/