AI Agent 產品推薦方案:從需求分析到落地開發
AI Agent 產品推薦方案:從需求分析到落地開發
一、企業業務痛點
您的企業是否曾面臨這樣的困境?
企業產品品類繁多,單個產品的參數常達數十上百個,類型各異(部分為數字類型,部分為文字類型),且參數重要性存在差異(例如發電機的 "輸出功率" 權重遠高于 "占地面積")。
客戶下單渠道分散(個人微信、企微外部用戶、郵件、Excel 文件等),需求描述完整性不一 ------ 部分描述詳盡,部分僅為簡潔表述。此時,員工需基于對全量產品的深度理解,從多渠道需求中篩選匹配度最高的產品推薦給客戶,操作難度極大。
二、傳統解決方案的局限
在大模型技術普及前,這類問題通常依賴經驗豐富的員工手動處理:員工需投入大量時間響應多渠道需求,提供的推薦僅基于個人判斷,無法確保綜合考量企業所有產品及各參數權重,推薦結果的客觀性與全面性難以保障。
2025 年作為 AI Agent 元年,我們可通過開發專屬 AI Agent 解決這一場景,實現產品推薦的自動化與精準化。
三、AI Agent 范式選擇
如同學生寫作需區分議論文、說明文、記敘文的 "套路",AI Agent 開發也存在可遵循的標準范式(隨技術迭代持續擴充)。以下重點介紹兩類核心范式,并匹配業務場景選擇最優方案。
RAG范式
適用場景:需查詢多份非結構化材料(如行業專業文獻、企業只讀規章、產品說明書),或解答 SOP(標準作業流程)、FAQ(常見問題)類知識問題,且匹配需求為 "非嚴格匹配" 時,優先選擇 RAG 范式。
核心流程:
- 后臺處理:① 錄入知識文本 → ② 文本預處理(切片、擴增) → ③ 特征提煉與向量轉換 → ④ 向量庫存儲;
- 前臺交互:① 選擇知識領域并提問 → ② 提問內容特征提煉與向量轉換 → ③ 向量庫檢索相關知識并排序 → ④ 關聯知識傳入大語言模型生成答案 → ⑤ 前端結構化呈現結果。
意圖識別范式
適用場景:業務需通過自然語言觸發系統操作,或需將模糊需求轉換為系統操作參數,且操作可枚舉、高頻場景覆蓋率高(多數用戶需求可明確歸類)時,適用意圖識別范式。
核心流程:
① 對用戶輸入進行意圖識別,關聯外部數據庫 / 知識庫匹配特定 API;
② 調用大語言模型填充參數(需與外部數據庫 / 知識庫通信);
③ 權限控制下執行查詢(含業務數據處理);
④ 后續業務邏輯處理;
⑤ 輸出用戶分析結論。
場景匹配結論
結合 "產品參數推薦" 場景特性,無需完整意圖識別環節,僅需提取產品參數即可實現需求,因此簡化后的意圖識別范式為最優選擇。
四、AI Agent 逐步開發流程
第0步:學習葡萄城市場的向量計算插件和對象與集合操作工具插件
葡萄城市場是葡萄城官方的生態聚集平臺,其中活字格開發實驗室店鋪里面有兩個插件是我們需要使用到的。


向量計算插件
向量歸一化、哈達瑪積(逐元素乘法)、歐幾里得距離、余弦相似度、向量縮放(標量乘法)。
我們當下需要用到的是哈達瑪積和余弦相似度。
哈達瑪積(Hadamard product)
對于兩個維度相等的向量A=[ai]和B=[bi],向量[ai*bi]為A和B的哈達瑪積。
我們以這個向量計算插件舉個例子

結果是

余弦相似度
描述的是兩個向量的方向接近程度,取值范圍是-1到1,-1表示完全相反,1表示完全相同,0表示互相沒有關系。越接近1表示,方向越接近。
同樣的,我們用向量計算插件舉例子

顯然,這兩個向量是大小相等,方向相同的,那么計算出來的余弦相似度是多少呢?


這兩個向量是互相垂直的,它們的余弦相似度是多少呢?


這兩個向量互相相反,那么相似度是多少呢?

對象與集合操作工具
是用來處理數組、對象和字典等數據結構的。我們這個場景主要用的是數組操作、數組排序和在數組中查詢

數組操作


我們來看下distinct、select和slice等。
Distinct

其中引用到的上下文變量arr是["1","2","3","1","2","333",""],處理完成后的array是["1","2","3","333",""],注意我的""是空串,不是空值,因此是沒有去除的。
Select

其中引用到的上下文變量數據表數據為
[
{
"ID": 1,
"文本": "AB",
"整數": 1,
"小數": 1.5,
"日期": 44927.75,
"是_否": 0
},
{
"ID": 2,
"文本": "BC",
"整數": 2,
"小數": 2.5,
"日期": 44927.99998842592,
"是_否": 1
},
{
"ID": 3,
"文本": "CD",
"整數": 3,
"小數": 3.5,
"日期": 44928,
"是_否": 0
},
{
"ID": 4,
"文本": "DE",
"整數": 4,
"小數": 4.5,
"日期": 44929,
"是_否": 1
},
{
"ID": 5,
"文本": "EF",
"整數": 5,
"小數": 5.5,
"日期": 44929,
"是_否": 0
},
{
"ID": 6,
"文本": "EF",
"整數": 6,
"小數": 6.5,
"日期": 45022,
"是_否": 1
}
經過select操作,抽取ID數組為[1,2,3,4,5,6]。
Slice

test3為 [{"ping":"pong"},"2A","2B"],slice后數組為["2A"]
數組排序

排序前數組為
[
{
"ID": 6,
"文本": "EF",
"整數": 6,
"小數": 6.5,
"日期": 45022,
"是_否": 1
},
{
"ID": 5,
"文本": "EF",
"整數": 5,
"小數": 5.5,
"日期": 44929,
"是_否": 0
},
{
"ID": 4,
"文本": "DE",
"整數": 4,
"小數": 4.5,
"日期": 44929,
"是_否": 1
},
{
"ID": 3,
"文本": "CD",
"整數": 3,
"小數": 3.5,
"日期": 44928,
"是_否": 0
},
{
"ID": 2,
"文本": "BC",
"整數": 2,
"小數": 2.5,
"日期": 44927.99998842592,
"是_否": 1
},
{
"ID": 1,
"文本": "AB",
"整數": 1,
"小數": 1.5,
"日期": 44927.75,
"是_否": 0
}
]
排序后數組為
[
{
"ID": 1,
"文本": "AB",
"整數": 1,
"小數": 1.5,
"日期": 44927.75,
"是_否": 0
},
{
"ID": 2,
"文本": "BC",
"整數": 2,
"小數": 2.5,
"日期": 44927.99998842592,
"是_否": 1
},
{
"ID": 3,
"文本": "CD",
"整數": 3,
"小數": 3.5,
"日期": 44928,
"是_否": 0
},
{
"ID": 4,
"文本": "DE",
"整數": 4,
"小數": 4.5,
"日期": 44929,
"是_否": 1
},
{
"ID": 6,
"文本": "EF",
"整數": 6,
"小數": 6.5,
"日期": 45022,
"是_否": 1
},
{
"ID": 5,
"文本": "EF",
"整數": 5,
"小數": 5.5,
"日期": 44929,
"是_否": 0
}
]
在數組中查詢
支持where、first和last三個操作。
Where

數組為
[
{
"ID": 1,
"文本": "AB",
"整數": 1,
"小數": 1.5,
"日期": 44927.75,
"是_否": 0
},
{
"ID": 2,
"文本": "BC",
"整數": 2,
"小數": 2.5,
"日期": 44927.99998842592,
"是_否": 1
},
{
"ID": 3,
"文本": "CD",
"整數": 3,
"小數": 3.5,
"日期": 44928,
"是_否": 0
},
{
"ID": 4,
"文本": "DE",
"整數": 4,
"小數": 4.5,
"日期": 44929,
"是_否": 1
},
{
"ID": 5,
"文本": "EF",
"整數": 5,
"小數": 5.5,
"日期": 44929,
"是_否": 0
},
{
"ID": 6,
"文本": "EF",
"整數": 6,
"小數": 6.5,
"日期": 45022,
"是_否": 1
}
]
經過查詢,多個查詢條件組合為[{"ID":1,"文本":"AB","整數":1,"小數":1.5,"日期":44927.75,"是_否":0}]
First

經過查詢,第一個{"ID":1,"文本":"AB","整數":1,"小數":1.5,"日期":44927.75,"是_否":0}
Last

經過查詢,最后一個{"ID":5,"文本":"EF","整數":5,"小數":5.5,"日期":44929.0,"是_否":0}
第1步:了解prompt在線管理
在AI Agent中,prompt是一個很關鍵的環節。在活字格自帶的AI對話單元格、AI助手命令中,prompt是可以手動寫入的,比較便捷。

但是這帶來了一個比較麻煩的問題,就是如果應用已經發布,現在需要修改prompt,那么開發者需要打開設計器改動prompt,然后重新發布應用,比較繁瑣而且容易出現發布失敗。
因此更好的實踐是把prompt存儲到數據庫,加入版本管理,并且給提示詞編輯配置一個前端頁面。如此,屆時只需在前端頁面里面改動即可生效,高效且相對安全。
一般提示詞模塊ER圖如下
暫時無法在飛書文檔外展示此內容
操作層面,必須熟練掌握兩個工具:設置變量命令和SUBSTITUTE公式。設置變量命令可以用于頁面的命令和服務端命令,詳見https://www.grapecity.com.cn/solutions/huozige/help/docs/command/setparametercommandinclientcommand
SUBSTITUE公式用法和excel保持一致,可以用于頁面的單元格、命令和服務端命令。
前端頁面部分,一般是根據項目需求,利用頁面引擎進行定制,下圖是AI篩選簡歷的樣式

第2步:定義全局變量
在AI Agent中,經常會用到一個關鍵值,最接近的數量,習慣上我們命名為TopK,這個值在各種地方頻繁使用,如果我們都是直接寫3或者5這種固定值的話,那么后期如果要更改起來很容易遺漏而且工作量不小。
因此,活字格提供了全局變量功能,可以為項目進行設置。

這是一個示例

第3步:進行數據庫設計
由于前面已經分析了prompt底層表結構,我們此處僅僅展示業務數據表的ER圖
暫時無法在飛書文檔外展示此內容
第4步:開發重置同一值
我們需要開發一個服務端命令把數據庫里面每個產品的每個參數根據其維度的上下限進行歸一化處理,即映射到-1到1區間內,方便后續的距離運算。
在此之前,需要開發一個私有的服務端命令normalize,來進行給定維度ID和值后,進行歸一化。顯然normalize私有服務端命令的入參有兩個:維度ID和值,出參是一個:同一值。
內部邏輯為:
- 根據維度ID查詢量程上限和下限
- 利用excel公式進行同一化
=2*(LN(1+MIN(MAX(值,量程下限),量程上限)-量程下限)/LN(1+(量程上限-量程下限)))-1
- 返回同一值給調用方
接下來,我們需要開發重置同一值服務端命令,入參和出參都不需要。
內部邏輯為:
- 查詢所有的產品規格參數,類型為對象數組,對象里面三個屬性:ID、原始值、維度ID
- 遍歷產品規格參數數組,把對象的維度ID和原始值傳遞給上面開發的私有的服務端命令normalize,拿到對應的同一值,緊接著根據對象的ID屬性把產品規格參數表的同一值字段更新為剛剛返回的同一值
這樣子,我們只需要調用下重置同一值服務端命令即可完成數據庫里面各個產品的各個參數同一化了。
第5步:開發AI查詢業務
(一)開發embedding私有服務端命令
我們需要對用戶輸入的查詢條件進行同一化處理,并且由于我們的各個維度都是有權重的,因此需要按照各自的權重生成一個蒙版向量來體現權重區別。
入參為查詢條件數組,出參有兩個:查詢向量和規格模板向量。
內部邏輯為:
- 將查詢條件數組JSON反序列化為數組
- 創建兩個數組queryEmbedding和filedMask,用來承載后面返回的查詢向量和規格模板向量
- 查出來數據庫里所有的維度信息

- 遍歷維度信息數組,逐一進行如下處理
- 尋找查詢條件數組中,和當前維度ID一致的第一個條件
- 若找不到或者找到了但是條件的值為空
- 把數字0從尾部推入queryEmbedding和filedMask數組
- 否則
- 調用重置同一值私有服務端命令,傳入當前維度ID和查詢條件的值,拿到同一化后的結果
- 將該條件值的同一化結果從尾部推入queryEmbedding數組
- 將當前維度的權重從尾部推入filedMask數組
- 返回queryEmbedding數組即查詢向量和filedMask數組即規格蒙版向量給調用方
(二)開發query私有服務端命令
我們需要根據查詢向量、規格蒙版向量和TopK,來為用戶查詢匹配的產品信息。
內部邏輯為:
- 創建result數組
- 從數據庫中找到所有產品的規格參數,還記得嗎,我們提前把同一值都填寫進去了
- 在產品規格參數中,以產品規格ID為基準,進行數組distinct操作,記為產品規格ID數組
- 計算入參查詢向量和規格蒙版向量的哈達瑪積,即查詢規格向量
- 遍歷產品規格ID數組
- 在產品規格參數數組中,查找當前產品的所有參數,顯然這也是數組
- 從上一步對象數組中,提取同一值為產品特征向量
- 計算產品特征向量和規格蒙版向量的哈達瑪積,即產品規格向量
- 計算查詢規格向量和產品規格向量的余弦相似度
- 從數據庫中查詢當前產品的規格信息對象
- 為規格信息對象增加一個屬性,類型為float,名為相似度,值為之前計算好的余弦相似度
- 將規格信息對象從尾部推入result數組
- 以相似度降序規則對result數組排序
- 取排序后的前TopK個為新的數組top
- 返回top為和用戶查詢匹配的產品信息
(三)開發表單查詢服務端命令
這個服務端命令用來根據參數數組生成產品清單。
內部邏輯為
- 調用私有的embedding服務端命令,傳入參數數組,拿到查詢向量和規格蒙版向量
- 調用私有的query服務端命令,傳入查詢向量、規格蒙版向量和TopK,拿到匹配的產品
- 返回匹配的產品為產品清單
(四)開發AI查詢服務端命令
入參為用戶輸入,出參為產品清單和查詢條件參數。
內部邏輯為
- 查詢數據庫中所有的維度信息
- 將維度信息數組JSON化,為AI調用提示詞變量引入做準備
- 從提示詞表中找到場景場景為參數提取的提示詞模板
- 替換提示詞模板中的text變量為用戶輸入,spec為維度信息JSON
- 調用AI助手命令,把替換完畢的提示詞給到用戶輸入,并嘗試提取AI返回的信息JSON,示例如下
[
{"id": 1, "value": 200},
{"id": 2, "value": null},
{"id": 3, "value": null},
{"id": 4, "value": 77},
{"id": 6, "value": null}
]
- 對返回的JSON進行反序列化,形成數組query
- 調用表單查詢服務端命令,入參即查詢條件JSON,拿到返回的產品清單
- 創建查詢條件數組
- 遍歷query
- 如果當前query對象中的value屬性不為空
- 在維度信息數組中查找第一個和當前query對象的ID屬性一致的維度信息
- 創建對象q,屬性有三個:維度、單位和值。其中維度和單位及上一步找到的維度信息中對應的值,值即當前query對象的value
- 從尾部把q對象推入查詢條件數組
- 返回產品清單和查詢條件數組
第6步:前后端聯調
在頁面側,我們需要AI調用服務端命令來完成前后端聯調。具體過程如下:
- 開啟加載動畫
- 調用AI查詢服務端命令,傳入頁面上用戶的輸入,獲取返回碼、返回信息、產品清單和查詢條件參數
- 結束加載動畫
- 判斷返回碼是否為0,不為0直接提示出錯
- 序列化查詢條件參數和產品清單為JSON
- 將兩個JSON分別導入到頁面的EL表格內
效果展示

浙公網安備 33010602011771號