【橘子大模型】初探rag知識庫的構建

一、簡介

我們在實現了一系列功能之后,終于來到了rag的部分,下面我們將基于langchain來實現一個rag檢索。
關于rag方面的知識,可以查看這兩篇文章:
大模型應用之RAG詳解
什么是 RAG(檢索增強生成)
或者是去油管上IBM Technology專欄,他們在這方面的簡介令人印象深刻。
好了,我們還是簡單來描述一下rag文本處理的一個流程。

  • 數據加載
  • 文本分塊
  • 文本嵌入
  • 創建索引

其實簡單理解就是你要把一個外部的文檔(各種格式)進行拆分,然后做嵌入(向量化),存儲進向量庫,作為檢索的語料。
這就是我們今天主要要做的,我們要基于langchain來實現一下,然后后面不斷完善他。

二、代碼實現

1、啟動es

我們需要使用es進行向量結果的存儲,所以我們簡單啟動一個es,我們選擇8.17.2
配置文件我們簡單配置一下,不啟動太多的安全檢測。如果你想啟動生產級別的單點配置,可以參考使用docker搭建ELK環境

cluster.name: my-application
node.name: node-1
http.port: 9200
xpack.security.http.ssl.enabled: false
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
xpack.ml.enabled: false

kibana我們就不配置了,啟動之后我們來編寫python代碼。

2、代碼實現

我們準備兩個pdf,我準備的是山東省公布的對臺灣同胞的政策和濰坊的美食介紹。分別是lutai.pdf,weifangfood.pdf。
我們來看一下langchain對于文檔加載的支持。這部分內容位于langchain的文檔加載
你能看到他支持多種文件格式的加載。
Webpages:網絡頁面
PDFs:pdf文件

我們這里使用的就是pdf加載器。我們就用這個,PyPDF文檔
你按照他的那個步驟安裝這個包就好了:

pip install -qU pypdf

我們在pycharm中的虛擬環境中加載這個就可以了,前面我們弄過了,可以直接去看前面的文章就行。

from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_ollama import OllamaEmbeddings
from langchain_elasticsearch import ElasticsearchStore
from uuid import uuid4from langchain_core.documents import Document# 構建一個文件數組,后期用來解析
pdf1 = './weifangfood.pdf'
pdf2 = './lutai.pdf'
pdfs = [pdf1,pdf2]
docs = []# 解析pdf拆分文檔
for pdf in pdfs:# 構建pdf loaderloader = PyPDFLoader(pdf)# 添加到文檔數組中,后面就處理這個docs.extend(loader.load())# 對文檔結果做切分,每一塊切1000個字符,重疊大約200個,并且設置索引(做編號,標記這個切分結果來自于文檔切分的哪一塊)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200,add_start_index=True)
split_text_list = text_splitter.split_documents(docs)# 構建向量化組件
embed = OllamaEmbeddings(model="llama3.2:latest")# 構建es向量存儲器
elastic_vector_search = ElasticsearchStore(es_url="http://localhost:9200",index_name="langchain_index",embedding=embed,
)documents = []
for text in split_text_list:# 向量化,輸出的就是向量結果# vector = embed.embed_query(text.page_content)# 對拆分的文本構建一個文檔結構document = Document(page_content = text.page_content,metadata = text.metadata,)documents.append(document)uuids = [str(uuid4()) for _ in range(len(documents))]
# 添加到es向量存儲中
elastic_vector_search.add_documents(documents=documents, ids=uuids)

以上代碼均可參考以下文檔來實現。
文本向量化
向量數據庫選擇
es向量化存儲

運行之后他會自動在es中創建一個索引langchain_index,然后把你的文檔向量化的結果存儲進es中。

3、向量化結果

我們運行之后,查看一下這個索引。

{"langchain_index": {"aliases": {},"mappings": {"properties": {"metadata": {"properties": {"author": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"comments": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"company": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"creationdate": {"type": "date"},"creator": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"keywords": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"moddate": {"type": "date"},"page": {"type": "long"},"page_label": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"producer": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"source": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"sourcemodified": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"start_index": {"type": "long"},"subject": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"title": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"total_pages": {"type": "long"},"trapped": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}},"text": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"vector": {"type": "dense_vector","dims": 3072,"index": true,"similarity": "cosine","index_options": {"type": "int8_hnsw","m": 16,"ef_construction": 100}}}},"settings": {"index": {"routing": {"allocation": {"include": {"_tier_preference": "data_content"}}},"number_of_shards": "1","provided_name": "langchain_index","creation_date": "1744981253591","number_of_replicas": "1","uuid": "JdwR_WlTQzWtzFRlVCv-rw","version": {"created": "8521000"}}}}
}

我們來主要分析一下他的這些字段,或者你可以在代碼中輸出結果來看下。我們在es中直接查看即可。

  • text:你在把文本拆分之后然后對每一段進行向量化存儲,每一段就是一條es doc。text存儲了這一段的原文。
  • metadata:元數據,這里是一個層級結構,下層還存儲著當前段來自哪個文檔,屬于第幾段。這個文檔一共拆分了幾段,當前這一段屬于第幾段,等等元信息。
  • vector:double類型的數組,其實就是當前段向量化之后的結果。

我們來看其中一個段的結果:

{"_index": "langchain_index","_id": "e5bb54ff-8269-4e0b-8cb3-3952dc4d57b9","_score": 1,"_ignored": ["text.keyword"],"_source": {"text": """中國臺灣網 815 日濟南訊 731 日,山東省正式發布實施《關
于促進魯臺經濟文化交流合作的若干措施》,該措施共 56 條,其中
促進魯臺經濟合作 23 條措施、促進魯臺文教交流 14 條措施,支持
臺灣同胞在魯學習創業就業生活 19 條。措施涵蓋產業合作、就業、
人才引進、知識產權保護、文教合作及職業資格考試、證件辦理等
方面,綜合運用了財稅、金融、用地等政策手段,并明確規定今后
山東省各級政府在制定發展規劃、設立扶持資金和出臺支持政策時,
都將保障符合條件的臺資企業和臺灣同胞享有同等待遇。
山東是大陸國有經濟大省、基礎設施建設不斷發展,該措施支
持臺灣民間資本與山東國有資本共同設立股權投資基金、產業投資
基金,支持臺資參與山東高速公路、軌道交通等多方面基礎設施建
設,讓臺商臺企率先享受山東發展紅利,實現兩岸資本合作共贏。
山東也是儒家文化發源地和教育人力資源大省,措施扶持臺灣同胞、
臺灣高校研究機構和民間社團參與承接山東文化產業工程項目,聯
合開展教學改革和共建研究生培養基地,大力拓展兩岸文化融合的
深度廣度,特別是將大力吸引臺灣儒學研究高端人才到山東開展儒
學研究和傳播工作,符合條件的給予優厚待遇。同時,該措施也針
對臺商反映的“退城進園”、農業土地流轉合同到期優先續租、子
女就學、臺胞行醫等做出了統籌管理和制度化安排。
據悉,山東省人大正加緊制定保護促進臺胞在山東投資權益的
地方立法條例,條例將吸收本次出臺的 56 條措施,在法律層面上對
臺胞應享有權益予以明確和保障。""","metadata": {"producer": "","creator": "WPS 文字","creationdate": "2024-07-30T17:08:05+09:08","author": "","comments": "","company": "","keywords": "","moddate": "2024-07-30T17:08:05+09:08","sourcemodified": "D:20240730170805+09'08'","subject": "","title": "","trapped": "/False","source": "./lutai.pdf","total_pages": 14,"page": 0,"page_label": "1","start_index": 0},"vector": [0.017683318,0.010620082,0.02021882,-0.0032659627,......0.006196561]}}

4、相似性檢索

我們把文本向量化之后,我們就可以執行一些向量檢索,這個是es中一個比較重要的概念,文檔位于ai檢索
我們使用langchain中的一些封裝就可以。文檔同樣位于langchain相似性檢索

from langchain_ollama import OllamaEmbeddings
from langchain_elasticsearch import ElasticsearchStore# 向量化
embed = OllamaEmbeddings(model="llama3.2:latest")# 存儲es
elastic_vector_search = ElasticsearchStore(es_url="http://localhost:9200",index_name="langchain_index",embedding=embed,
)
# 使用相似性檢索
results = elastic_vector_search.similarity_search_with_score(query="進魯臺經濟合作方面",k=1,
)# 輸出檢索結果
for doc, score in results:print(f"* [SIM={score:3f}] {doc.page_content} [{doc.metadata}]")

這個檢索結果有很大提升空間,我們后面整合到llm中再說。

5、Retrievers 檢索器

我們的langchain中有很多向量檢索的api,es的 pgsql的很多。這種都有各自的使用方式,于是langchain封裝了一個上層實現Retrievers 檢索器
眾多實現都實現了這個接口,我們可以直接使用這個上層接口來屏蔽底層的實現。我們來簡單實現一個。

from langchain_ollama import OllamaEmbeddings
from langchain_elasticsearch import ElasticsearchStore# 向量化
embed = OllamaEmbeddings(model="llama3.2:latest")# 存儲es
elastic_vector_search = ElasticsearchStore(es_url="http://localhost:9200",index_name="langchain_index",embedding=embed,
)
# 構建一個Retrievers 檢索器,使用similarity相似性檢索。k:1表示每一個問題都只返回一個回答
retriever = elastic_vector_search.as_retriever(search_type="similarity",search_kwargs={"k":1}
)# 批量執行兩個問題
resp = retriever.batch(["臺灣同胞在山東就業期間有什么政策","濰坊有啥好吃的"]
)
# 返回輸出
for result in resp:print(result)

這就是檢索器的簡單使用,我們后面再來探究其深入使用。

三、總結

我們到此完成了文本的rag存儲,后面我們將會使用rag增強檢索來增強大模型的問答效果。

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

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

相關文章

CentOS7執行yum命令報錯 Could not retrieve mirrorlist http://mirrorlist.centos.org

CentOS7執行yum命令報錯 引更新yum源備份原有源創建新的源文件清理并重建緩存 引 CentOS 7 系統無法連接到 CentOS 的官方鏡像站點。這通常是由于網絡問題或 CentOS 7 已停止維護導致的(2024年6月30日后 CentOS 7 已進入 EOL) 報錯明細: 已…

VSCode安裝與環境配置(Mac環境)

20250419 - 概述 大概是非常久之前了,裝了VSCode,估計都得21的時候了,電腦上也沒更新過。當時安裝也直接裝上就完事了。這次把版本更新一下,同時記錄一下這個安裝過程。 安裝 mac下安裝非常簡單,直接從官網下載&am…

QML動畫--ParallelAnimation和SequentialAnimation

一、ParallelAnimation ParallelAnimation 是 QML 中用于并行執行多個動畫的容器動畫類型,可以同時運行多個子動畫。 基本用法 qml import QtQuick 2.15Rectangle {id: rectwidth: 100; height: 100color: "red"x: 0; y: 0; opacity: 1.0ParallelAnim…

NLP高頻面試題(四十三)——什么是人類偏好對齊中的「對齊稅」(Alignment Tax)?如何緩解?

一、什么是「對齊稅」(Alignment Tax)? 所謂「對齊稅」(Alignment Tax),指的是在使人工智能系統符合人類偏好的過程中,所不可避免付出的性能損失或代價。換句話說,當我們迫使AI遵循人類價值觀和規范時,AI系統往往無法達到其最大理論性能。這種性能上的妥協和折衷,就…

速查手冊:TA-Lib 超過150種量化技術指標計算全解 - 1. Overlap Studies(重疊指標)

速查手冊:TA-Lib 超過150種量化技術指標計算全解 - 1. Overlap Studies(重疊指標) TA-Lib(Technical Analysis Library)是廣泛使用的金融技術分析庫,實現了超過150種技術指標計算函數,適用于股票…

重構未來智能:Anthropic 解碼Agent設計哲學三重奏

第一章 智能體進化論:從工具到自主體的認知躍遷 1.1 LLM應用范式演進圖譜 階段技術形態應用特征代表場景初級階段單功能模型硬編碼規則執行文本摘要/分類進階階段工作流編排多模型協同調度跨語言翻譯流水線高級階段自主智能體動態決策交互編程調試/客服對話 1.1.…

Git 中修改某個特定的commit提交內容

在 Git 中修改某個特定的提交(commit)通常需要使用 交互式變基(Interactive Rebase) 或 修改提交(Commit Amend)。以下是不同場景下的具體操作步驟: 一、修改最近的提交(最新提交&am…

ZLMediaKit流媒體服務器

ZLMediaKit 簡介 ZLMediaKit 是一個基于 C11 開發的高性能流媒體服務器框架,支持 RTSP、RTMP、HLS、HTTP-FLV、WebSocket-FLV、HTTP-TS、WebSocket-TS、HTTP-fMP4、WebSocket-fMP4 等多種流媒體協議。 主要特性 多協議支持: 支持 RTSP/RTMP/HLS/HTTP-F…

數字電子技術基礎(五十)——硬件描述語言簡介

目錄 1 硬件描述語言簡介 1.1 硬件描述語言簡介 1.2 硬件編程語言的發展歷史 1.3 兩種硬件描述的比較 1.4 硬件描述語言的應用場景 1.5 基本程序結構 1.5.1 基本程序結構 1.5.2 基本語句和描述方法 1.5.3 仿真 1 硬件描述語言簡介 1.1 硬件描述語言簡介 硬件描述語…

SQL系列:常用函數

1、【MySQL】合并字段函數(列轉行) 它可以將兩個字段中的數據合并到一個字段中。 1)CONCAT函數 CONCAT函數可以將多個字段中的數據合并到一個字段中。它的語法格式如下: SELECT CONCAT(字段1,字段2,...字段N) FROM 表名;SELEC…

多線程和線程同步

多線程在項目開發中使用頻率高,使用多線程能夠提高程序的并發性 提高程序的并發性:1.多線程,對系統資源的消耗更小一些 2.多進程 系統的cpu資源有線,cpu時間片被分好后,由系統進行調度,每個線程在執行的時候都需要搶這個cpu的時間片。如果搶到了,就執行,如果沒搶到,…

時序數據預測:TDengine 與機器學習框架的結合(一)

一、引言 在當今數字化時代,時序數據如潮水般涌來,廣泛存在于物聯網、工業監控、金融交易、氣象監測等眾多領域。這些按時間順序記錄的數據蘊含著豐富的信息,對其進行準確預測,能夠為企業和組織的決策提供有力支持,帶…

elementUI中MessageBox.confirm()默認不聚焦問題處理

在項目中使用elementUI的MessageBox.confirm()出現了默認不聚焦的問題,默認確認按鈕是淺色的,需要點擊一下才會變成正常。面對這種問題,創建新組件,實現聚焦。替換默認的MessageBox.confirm() 解決 創建components/MessageBoxCo…

yarn的定義

YARN 即 Yet Another Resource Negotiator,它是 Apache Hadoop 2.x 及后續版本中的集群資源管理系統,也是 Hadoop 生態系統的核心組件之一。 YARN 的誕生是為了解決 Hadoop 1.x 中 MapReduce 框架將資源管理和作業調度任務耦合在一起所帶來的可擴展性差等…

http、https、TLS、證書原理理解,對稱加密到非對稱加密問題,以及對應的大致流程

http 超文本傳輸協議 存在問題: 安全性、隱私性、數據完整性 易被中間人(黑客之類的)對數據進行劫持、篡改、隱私泄露 引出了 https (source) http 在網絡模型中的應用層 Application > transport > inter…

深度補全網絡:如CSPN++填補稀疏點云的深度信息

深度補全網絡:CSPN填補稀疏點云的深度信息 深度補全(Depth Completion)是計算機視覺中的一個重要任務,旨在從稀疏的深度測量中恢復密集的深度圖。CSPN(Convolutional Spatial Propagation Network)是這一領域的前沿方法之一。 CSPN概述 CSPN是對原始CSPN…

QT網絡拓撲圖繪制實驗

前言 在網絡通訊中,我qt常用的是TCP或者UDP協議,就比方說TCP吧,一臺服務器有時可能會和多臺客戶端相連接,我之前都是處理單鏈接情況,最近研究圖結構的時候,突然就想到了這個問題。那么如何解決這個問題呢&…

DNS主從同步實驗

dns域名解析原理 實驗步驟1、主dns要完成dns解析:192.168.21.128 [rootlocalhost ~]# yum install bind -y [rootlocalhost ~]# systemctl start named [rootlocalhost ~]# vim /etc/named.conf options { listen-on port 53 { any; }; direct…

知識了解03——怎么解決使用npm包下載慢的問題?

1、為什么使用npm下載包會下載的慢 因為使用npm下載包時,默認使用國外服務器進行下載,此時的網絡傳輸需要經過漫長的海底電纜,因此下載速度會變慢 2、怎么解決?(切換鏡像源) (1)方…

在Ubuntu系統中安裝和升級RabbitVCS

在Ubuntu系統中安裝和升級RabbitVCS 目前在ubuntu中使用svn的GUI工具,已經安裝了。想升級一下。 當前遇到的問題是,我想用它看看我當前的代碼對應的版本號,然后再決定是否update。但是,好像我看不出來。根本不如在windows使用To…