大模型開發框架LangChain之構建知識庫

1.前言

為了避免 llm正確的廢話和幻覺,知識庫可以說是現在開發 agent的必備了。同時,作為 rag中的 r,知識庫召回的成功率會極大的影響 llm的最終回復效果。一般,會把知識庫召回的內容作為背景知識給到 llm,并在 prompt中明確告訴它優先使用知識庫召回的內容回答用戶問題,甚至要求必須基于知識庫回答也是可以的。

環境信息如下:

? python-3.13、langchain-0.3.26

2.知識庫設計

這里設計一個輕量級知識庫,基于 csv格式的數據,可用于小型項目,維護成本極低。樣例如下:

報錯信息,原因分析,修復建議
"java.sql.SQLException: EXECUTION FAILED: Task DDL error HiveException: [Error 20604] Can not create table: create table busi.dwd_cd_eksiq_024323331015027700004_20250720_de083461-142e-4768-38si-bd7046532ca9 failed","Hive相關服務負載過高","排除服務故障后可嘗試重做任務"
"The ownership on the staging directory file:/tmp/hadoop/mapred/staging/KS_MACHINE1666781422/.staging is not as expected. It is owned by hctr. The directory must be owned by the submitter KS_MACHINE or KS_MACHINE@LAKEHOUSE.IK","權限信息錯誤或者kinit沒有正確連接","優先聯系管理員確認權限問題"
"org.apache.hadoop.hive.ql.metadata.HiveException: Invalid Value ""1"" for decimal(3,3) column when inserting. Column to inserting: name","字段和字段內容不匹配導致無法寫入","decimal字段小數點位數不能超過保留位數"

這是一個運維場景,記錄了任務報錯的日志原因分析修復建議。日常維護可以使用 excel進行管理,然后導出成 csv即可,非常的方便快捷。

對于一線的運維來說只是簡單記錄日常工作,而且能反過來提高自己的工作效率,故一般都不會排斥。

3.加載知識庫

首先,讀取和解析 csv需要用到 langchain_community的 CSVLoader。如下:

loader = CSVLoader(file_path="task-records.csv",encoding="utf-8",metadata_columns=["原因分析", "修復建議"],content_columns=["報錯信息"],
)
docs = loader.load()

這里的重點是:content_columns,內容列,知識庫召回時會基于此列的內容,使用 embedding模型進行向量化的時候也是用這一列。

metadata_columns是元數據列,不會參與召回,可用于豐富召回結果。比如 補充數據來源、原因分析和修復建議。

其次,需要對文本進行分塊,如下:

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
all_splits = text_splitter.split_documents(docs)

chunk_size分塊大小為 1000個字符,chunk_overlap設置為0表示片段無重疊,這兩個參數會影響召回成功率,需要根據知識庫和業務調用實際情況修改。比如 業務調用時多用關鍵詞,則需要把 chunk_size調小;反之,如果用的是句子段落,則需要把chunk_size調大。

4.修改Embedding客戶端

這里選取的 embedding模型是 BAAI-bge-small-zh-v1.5離線版,維度是 1024,使用 docker進行部署,適合無法聯網的環境,比如 內網、局域網。如果使用的是 langchain支持廠商的 embedding模型,可以跳過本步驟。

為了適配此離線 embedding模型,故基于 langchain-openai embedding客戶端進行改造,修改內容如下:

// 修改 _get_len_safe_embeddings函數
// 把下面的內容去掉
for i in _iter:response = self.client.create(input=tokens[i : i + _chunk_size], **client_kwargs)if not isinstance(response, dict):response = response.model_dump()batched_embeddings.extend(r["embedding"] for r in response["data"])

這個函數主要影響的是知識庫分段后的向量化過程,很重要。

其他的 離線 embedding模型可以參考此方式進行修改,不一定適用所有的模型。

5.知識庫召回

知識庫是需要存儲的,這里選用極致輕量化的方案:內存存儲,對應的代價就是每次程序重啟或知識庫更新時需要全量初始化,比較耗時。

首先,進行知識庫向量化:

embeddings = BAAIEmbeddings(base_url="http://127.0.0.1:9997/v1",  # 遠程embedding服務地址api_key="no-key",model="BAAI-bge-small-zh-v1.5",
)vector_store = InMemoryVectorStore(embeddings)
vector_store.add_documents(documents=all_splits)

BAAIEmbeddings這個類是基于 openai進行改造后的,add_documents時會調用 embedding模型進行知識庫分片的向量化,并將結果存儲在內存中。

至此,知識庫已經完全準備好了,可以進行召回測試了,如下:

retrieved_docs = vector_store.similarity_search_with_score(query="/tmp/hadoop/mapred/staging/KS_MACHINE1666781422/.staging is not as expected",k=1,
)
print(retrieved_docs)

這里 k能夠控制最終召回的數據條數,在召回成功率低的情況下可以調大。

知識庫召回效果如下

[(Document(id=‘d06c773b-fd98-4de9-b939-ce2d3e513a11’, metadata={‘source’: ‘task-records.csv’, ‘row’: 2, ‘原因分析’: ‘權限信息錯誤或者kinit沒有正確連接’, ‘修復建議’: ‘優先聯系管理員確認權限問題’}, page_content=‘報錯信息: The ownership on the staging directory file:/tmp/hadoop/mapred/staging/KS_MACHINE1666781422/.staging is not as expected. It is owned by hctr. The directory must be owned by the submitter KS_MACHINE or KS_MACHINE@LAKEHOUSE.IK’), 0.8914968315763799)]

可以看到 langchain準確的找出了知識庫中與問題最匹配的數據,并且可以在元數據中看到是來自task-records.csv、原因分析和修復方式,以及文本相似度。這些信息在實際項目中都是需要進行展示的,增加可信度和便于溯源。

6.總結

本文描述了如何使用 langchain構建一個輕量級的知識庫,步驟如下:

  1. 設計csv格式的知識庫
  2. 加載csv文件
  3. 文本分片
  4. 文本向量化與存儲
  5. 文本召回

其實基于其他的存儲,比如 pg、es,步驟類似,其次知識庫的工程化不能忽視,否則會極大的影響召回成功率。

在實際項目中,召回數據通常會有很多條,一般生產環境會默認允許召回 20條、30條甚至更多,故還可以增加 rerank模型進行重排,進一步增加知識庫檢索準確率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91785.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91785.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91785.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NPM打包時,報reason: getaddrinfo ENOTFOUND registry.nlark.com

先說解決方法:將 package-lock.json 文件中的 registry.nlark.com 改為 registry.npmmirror.com現象:npm ERR! code ENOTFOUND npm ERR! syscall getaddrinfo npm ERR! errno ENOTFOUND npm ERR! network request to https://registry.nlark.com/url-too…

python內置庫os與sys的區別是什么?分別能實現什么功能?

Python 的 os 和 sys 是兩個功能截然不同但都非常重要的內置庫,它們分別服務于不同的交互場景:前者專注于與操作系統交互,后者專注于與 Python 解釋器本身交互。以下是詳細解析: 一、os 庫:操作系統交互接口 os 庫&…

【云計算】云主機的親和性策略(一):快樂旅行團

《云主機的親和性策略》系列,共包含以下文章: 1?? 云主機的親和性策略(一):快樂旅行團2?? 云主機的親和性策略(二):集群節點組3?? 云主機的親和性策略(三&#xf…

USRP捕獲手機/路由器數據傳輸信號波形(下)

目錄: USRP捕獲手機/路由器數據傳輸信號波形(上) USRP捕獲手機/路由器數據傳輸信號波形(中) USRP捕獲手機/路由器數據傳輸信號波形(下) 四、路由器MIMO-OFDM系統 本文深入分析采集手機與路由…

位運算在權限授權中的應用及Vue3實踐

在現代前端應用中,權限管理是一個至關重要的功能模塊。隨著應用復雜度的提示功能,權限細粒度越來越精細,如何高效地管理和判斷權限成為前端開發的一大挑戰。位運算作為一種高效的運算方式,在權限管理領域有著獨特的優勢。本文將詳…

面試實戰,問題二十二,Java JDK 17 有哪些新特性,怎么回答

Java JDK 17 新特性面試回答指南 作為一名Java開發者,了解JDK 17的新特性是面試中的關鍵點。JDK 17(Java SE 17)于2021年9月發布,是一個長期支持(LTS)版本,引入了多項改進以提升開發效率、安全性…

【MySQL安全】什么是SQL注入,怎么避免這種攻擊:前端防護、后端orm框架、數據庫白名單

基本概念SQL注入是OWASP Top 10安全風險之一,它利用了應用程序對用戶輸入數據的不當處理。當應用程序直接將用戶輸入拼接到SQL查詢中而沒有進行適當的過濾或轉義時,就可能發生SQL注入攻擊。攻擊原理假設有一個登錄表單的SQL查詢:SELECT * FRO…

pyqt5顯示任務欄菜單并隱藏主窗口,環境pyqt5+vscode

環境 pyqt5vscode 環境搭建見 https://blog.csdn.net/huiaifen/article/details/125175261 新建一個QMainWindow 1 在VSCode的資源管理器中,右鍵選擇 PYQT:New Form,打開Qt Designer2 在打開的窗口中選 “Main Window”,然后選“創建”3 直接…

SpringBoot項目數據脫敏(自定義注解)

文章目錄前言一.配置1.脫敏類型枚舉:DesensitizeType2.注解:Desensitize3.序列化類:DesensitizeJsonSerializer4.工具類:DesensitizeUtil二、測試:DesensitizeTest三、效果展示總結前言 在互聯網應用中,用戶…

PSO-TCN-BiLSTM-MATT粒子群優化算法優化時間卷積神經網絡-雙向長短期記憶神經網絡融合多頭注意力機制多特征分類預測/故障診斷Matlab實現

基本介紹 1.Matlab實現PSO-TCN-BiLSTM-MATT粒子群算法優化時間卷積神經網絡-雙向長短期記憶神經網絡融合多頭注意力機制多特征分類預測,PSO-TCN-BiLSTM-Multihead-Attention; 多頭自注意力層 (Multihead-Self-Attention):Multihead-Self-Atte…

第一篇:Linux 運維入門:虛擬機部署與基礎環境配置

目錄 一、準備工作與環境規劃 二、虛擬機網絡配置 1、虛擬網絡編輯器設置 2、系統網絡配置 3、主機名配置 三、Hosts 文件與 SSH 免密配置 配置 hosts 文件編輯/etc/hosts文件實現主機名解析: 分發 hosts 文件到其他節點 SSH 免密登錄配置在 zhangsan101 上…

(一)全棧(react配置/https支持/useState多組件傳遞/表單提交/React Query/axois封裝/Router)

文章目錄 項目地址 一、基礎配置 1.1 支持https 1. 安裝所需要的包 2. 配置 1.2 常用 1. 字符串拼接 二、組件 2.1 useState組件傳遞 1. App里初始化useState 2. useState和方法的傳遞 3. 接收傳遞來的狀態和方法 2.2 表單提交 1. 表單組件處理用戶輸入數據 2. App傳來的submit…

【abc417】E - A Path in A Dictionary

Problem StatementYou are given a simple connected undirected graph G with N vertices and M edges. The vertices of G are numbered vertex 1, vertex 2, …, vertex N, and the i-th (1≤i≤M) edge connects vertices Ui? and Vi?.Find the lexicographically smalle…

linux火焰圖

火焰圖簡介火焰圖是一種性能分析的可視化工具,它將CPU的調用棧(Call Stack)信息以矩形火焰的形式展現出來。Y軸:代表調用棧的深度(函數A調用了函數B,B就疊在A上面)。X軸:代表CPU的抽…

解剖 .NET 經典:從 Component 到 BackgroundWorker

1?? 背景與定位在 .NET Framework 2.0 時代,微軟引入了 BackgroundWorker 來解決 WinForm/WPF 場景下“耗時操作阻塞 UI 線程”的問題;而 Component 早在 1.0 就已存在,是所有可視化/非可視化設計器的“基類”。理解這兩者的源碼與機制&…

桌面端界面設計 |貨物 TMS 系統 - SaaS UI UX 設計:審美積累之境

在物流數字化的浪潮中,貨物 TMS 系統的 SaaS 化與 UI/UX 設計正構建著獨特的審美坐標系。這不僅是技術與功能的融合,更是一場關于效率美學的深度探索,為行業審美積累注入了鮮活的實踐樣本。SaaS 模式賦予貨物 TMS 系統輕盈而強大的特質&#…

多架構鏡像整合全攻略:在Docker中實現單一鏡像支持同時支持amd64和arm64架構

多架構支持的挑戰 :隨著異構計算(如 ARM、x86、RISC-V 等)的普及,開發者需要為不同硬件平臺提供對應的鏡像,傳統方式需維護多個版本(如 image:v1-amd64 和 image:v1-arm64 ),導致版本…

Linux730 tr:-d /-s;sort:-r,-n,-R,-o,-t,-k,-u;bash;cut:-d,-c;tee -a;uniq -c -i

回顧 sort sort [選項] 文件-u:唯一,去除重復 -r:按數字大小,倒序排序,大到小 -o:輸出文件 -n:按數字大小,順序排序,小到大 -t: -t后加分割符,按分割符為標準,進行篩選 -k:k后加數字…

力扣457:環形數組是否存在循環

力扣457:環形數組是否存在循環題目思路代碼題目 存在一個不含 0 的 環形 數組 nums ,每個 nums[i] 都表示位于下標 i 的角色應該向前或向后移動的下標個數: 如果 nums[i] 是正數,向前(下標遞增方向)移動 |nums[i]| 步…

在 Elasticsearch 中落地 Learning to Rank(LTR)

1 為什么要引入 LTR? 常規檢索(BM25、語義檢索、Hybrid、RRF …)往往只能基于少量信號(關鍵詞命中、向量相似度)排序。 Learning-to-Rank 通過機器學習模型把多維度特征(文檔屬性、查詢屬性、查詢-文檔相關…