DeepSeek+Dify之四Agent引用知識庫案例
文章目錄
- 背景
- 整體流程
- 測試數據
- 用到的節點
- 開始
- HTTP請求
- LLM
- 參數提取器
- 代碼執行
- 結束
- 實現步驟
- 1、新建工作流
- 2、開始節點
- 3、Http請求節點
- 4、LLM節點(大模型檢索)
- 5、參數提取器節點(提取大模型檢索后數據)
- 6、代碼執行節點(數據json化)
- 7、結束節點
- 測試
- 發布
- 導出
背景
可通過API,針對用戶輸入的請求數據,借助工作流以及 Deepseek 大模型的檢索與重排序功能,提升召回數據的質量。
整體流程
測試數據
用到的節點
開始
功能:定義一個 workflow 流程啟動的初始參數
HTTP請求
功能:允許通過 HTTP 協議發送服務器請求
LLM
功能:通過上傳的excel格式的文檔,通過deepseek大模型的檢索和重排序,提升召回文檔數據的質量
參數提取器
功能:利用 LLM 從自然語言內推理提取出結構化參數,用于后置的工具調用或 HTTP 請求。
代碼執行
功能:執行一段 Python 或 NodeJS 代碼實現自定義邏輯
結束
功能:定義一個 workflow 流程的結束和結果類型
實現步驟
1、新建工作流
下面就是從開始節點開始添加節點了
2、開始節點
添加一個變量,用于接收用戶輸入的請求
3、Http請求節點
API請求示例,看自己的API
瀏覽器中按F12快捷鍵,找到下面的位置,找到請求數據的記錄,復制cURL,我這是內網的地址
拷貝cURL到http請求節點參數中
點擊保存,很多參數自動填充了
修改address變量為開始節點的輸入參數,參數都是api的,根據自己的需求修改
4、LLM節點(大模型檢索)
下面設置參數
(1)大模型如果已經設置系統默認模型,可以不用修改模型了
(2)上下文就是上一節點的Http請求結果
(3)system提示詞根據需求來,目前的需求是對用戶輸入的請求數據,通過deepseek大模型的檢索和重排序,提升Http召回數據的質量,核心是說清楚需求,以及輸出格式
完整的提示詞
你是一個強大的地址匹配助手。你的任務是接收一個非標地址(字符串類型),存儲在變量 {{#1743564833545.input#}}中,以及一個來自 API 返回的 JSON 對象(對象類型,包含一個名為 body的數組),存儲在變量 {{#context#}} 中,結構如下:
{"body": [{"mc": "大嶝","address": "福建省廈門市翔安區大嶝街道田墘社區田墘北里22號","queryIdentifying": "模糊匹配2"},// 可能存在多個類似對象]
}
### 任務詳細描述
1. 在 {{#context#}} 的 `body` 列表中的每個 JSON 對象里查找 `address` 或 `mc` 字段。這些字段可能包含與非標地址相關的信息。
2. **匹配邏輯**:判斷每個 JSON 對象中的 `address` 或 `mc` 字段與輸入的 {{#1743564833545.input#}} 的匹配程度。匹配程度的判斷可以基于地址的相似性、包含關系等。例如,如果非標地址是“朝陽區朝陽公園”,而某個 JSON 對象的 `address` 字段是“北京市朝陽區朝陽公園路”,則認為這是一個較高的匹配度。
3. **置信度計算**:計算匹配的置信度值,范圍為0到1。0表示完全不匹配,1表示完全匹配。置信度的計算可以基于地址字符串的相似度(例如,如果兩個字符串完全相同,則置信度為1;如果只有部分相同,則根據相同部分的比例計算置信度)。
4. 找出與輸入的非標地址最匹配的 JSON 對象。如果有多個 JSON 對象的匹配度相同且最高,則選擇第一個出現的對象。
5. **輸出格式**:- `nonaddress`: {{#1743564833545.input#}}- `address`: 匹配到的 JSON 對象中的 `address` 字段值(如果存在)- `mc`: 匹配到的 JSON 對象中的 `mc` 字段值(如果存在)- `confidence`: 匹配的置信度值,范圍為0到1,保留兩位小數。- `queryIdentifying`: "大模型匹配"### 示例
#### 輸入
```json
{"nonaddress": "北京市朝陽區朝陽公園","context": {"body": [{"address": "北京市海淀區中關村","mc": "中關村科技園區","queryIdentifying": "模糊匹配2"},{"address": "北京市朝陽區朝陽公園路","mc": "朝陽公園","queryIdentifying": "模糊匹配2"}]}
}
#### 輸出
```json
{"nonaddress": "北京市朝陽區朝陽公園","address": "北京市朝陽區朝陽公園路","mc": "朝陽公園","confidence": 0.90,"queryIdentifying": "大模型匹配"
}## 限制
- 不處理非地址文本(如“請打電話聯系我”)
- 地址要素不全時保留有效部分
- 若文本無地址信息,返回`{"error": "未檢測到有效地址"}`
- 不要捏造數據,只能從{{#context#}}中找出匹配的數據
5、參數提取器節點(提取大模型檢索后數據)
下面設置參數
(1)大模型如果已經設置系統默認模型,可以不用修改模型了
(2)上下文就是上一節點的大模型檢索結果
(3)提取參數根據需求添加
(4)system提示詞內容主要就是提取大模型的數據,因為它是string格式的,需要從string中提取需要的結構化數據
完整的提示詞
提取{{#1744090176627.text#}}中```json\n{\n \"nonaddress\": \"廈門市公安局\",\n \"address\": \"福建省廈門市思明區中華街道霞溪社區新華路45-1號\",\n \"mc\": \"廈門市公安局\",\n \"confidence\": 1.0,\n \"queryIdentifying\": \"大模型匹配\"\n}\n```格式內容,該 JSON 應包含以下字段信息
'''json
{- `nonaddress`: JSON 數據中‘nonaddress’字段的值- `address`: JSON 數據中‘address’字段的值- `mc`: JSON 數據中‘mc’字段的值- `confidence`: JSON 數據中‘confidence’字段的值,是浮點類型- `queryIdentifying`: JSON 數據中‘queryIdentifying’字段的值
}
6、代碼執行節點(數據json化)
主要是為了將上一步的幾個字段統一輸出
參數設置:
(1)輸入變量
上一級的幾個參數
(2)python3
根據需求修改腳本
def main(nonaddress: str, address: str, mc: str, confidence: str, queryIdentifying: str) -> dict:try:aa={}aa["nonaddress"] = nonaddressaa["address"] = addressaa["mc"] = mcaa["confidence"] = confidenceaa["queryIdentifying"] = queryIdentifyingreturn {"result": aa}except (KeyError, IndexError, json.JSONDecodeError):return {"result": None}
7、結束節點
輸出變量就是上一級的輸出結果
測試
直接運行,輸入數據測試
結果
查看每個節點的過程數據
發布
發布測試
結果
導出
可以將整個工作流的配置導出