Background
很早就開始做檢索增強(qiáng)的大語言模型Agent了,通過外接知識庫為LLM提供外部知識能增強(qiáng)它回答的準(zhǔn)確性。這里我們使用ElasticSearch作為數(shù)據(jù)庫存儲相關(guān)知識,使用百度文心千帆的embedding API提供向量嵌入;借助langchain搭建LLM Agent.
需要安裝的環(huán)境有:
Python, ElasticSearch, langchain, qianfan;后兩個直接pip install langchain,pip install qianfan
檢索原理
這里可以參考我之前的博客:document-question-answering-bot(文檔問答機(jī)器人)-CSDN博客
使用里面提到的雙塔模型原理完成檢索功能。
如何檢索?我們拋棄了ElasticSearch中古老的TF-IDF檢索方式,也放棄了使用BERT進(jìn)行文檔嵌入;而是全面向大語言模型時代看齊,使用新的模型構(gòu)建基于語義的搜索引擎。
文本嵌入
現(xiàn)有的很多開源項目使用OpenAI提供的embedding API進(jìn)行,但是考慮到翻墻,我們放棄了這個做法;也有人使用Huggingface上的模型進(jìn)行API嵌入,考慮到可能需要本地部署LLM的算力消耗,我們?nèi)詻]有考慮;出于類似的原因,我們放棄了本地部署LLaMa,Baichuan2等LLM模型進(jìn)行詞嵌入。
本文最后使用百度文心千帆提供的Embedding-V1文本嵌入模型進(jìn)行,步驟是:
- 使用該模型需要現(xiàn)在文心千帆控制臺注冊賬戶:百度智能云控制臺?(baidu.com)
- 注冊賬戶后,左側(cè)千帆大模型平臺-應(yīng)用接入-創(chuàng)建應(yīng)用;記住API-KEY和SECRET-KEY。
數(shù)據(jù)庫
需要先安裝并啟動ElasticSearch數(shù)據(jù)庫,具體教程略
LangChain搜索引擎
langchain是一個大語言模型Agent開發(fā)框架,我們在這里使用它讀取數(shù)據(jù)內(nèi)容并建立索引,完成對前述文本嵌入模型和數(shù)據(jù)庫的調(diào)用,搜索引擎構(gòu)建:
from langchain.document_loaders import PyPDFLoader
from langchain.embeddings import QianfanEmbeddingsEndpoint
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import ElasticVectorSearch
from langchain.chains import RetrievalQA
import os
os.environ['QIANFAN_AK'] = ""
os.environ['QIANFAN_SK'] = ""
loader = PyPDFLoader("2307.10569.pdf")
data = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=0)
documents = text_splitter.split_documents(data)
print(len(documents), documents[0])
這里loader中是需要檢索的外部知識庫,我這里以一個PDF文檔為例。如果嵌入的是HTML、TXT等其他類型,只需要調(diào)用langchain.documents_loaders里的其他讀取方式即可。
使用RecursiveCharacterTextSplitter對文本進(jìn)行分割;這里設(shè)置每200個詞語截斷成一段話,搜索引擎會為這每一段建立索引。像這里我們把PDF文件分成了98塊,顯示了第一塊的內(nèi)容,并為此建立了源。
下面這段代碼定義了一個嵌入模型及數(shù)據(jù)庫,這一段執(zhí)行結(jié)束之后數(shù)據(jù)庫中就已經(jīng)存儲了相關(guān)信息了;程序會輸出下面的內(nèi)容:
embeddings = QianfanEmbeddingsEndpoint()
db = ElasticVectorSearch.from_documents(
documents,
embeddings,
elasticsearch_url="http://localhost:9200",
index_name="elastic-index",
)
print(db.client.info())
接下來只需要查詢:
db = ElasticVectorSearch(
elasticsearch_url="http://localhost:9200",
index_name="elastic-index",
embedding=embeddings,
)
docs_and_scores = db.similarity_search_with_score("What it Aligning?", k=10)
print(docs_and_scores)
"What is Aligning"是我們提出的問題,K=10是搜索引擎按照相似度返回的前10個文檔:
可以看到文檔內(nèi)容,文檔源等等。在此可以說我們的搜索引擎已經(jīng)構(gòu)建完成啦!
Langchain構(gòu)建檢索增強(qiáng)LLM Agent
如果你的目標(biāo)只是構(gòu)建一個搜索引擎,那這一部分可以跳過。
如果你是想讓一個LLM的機(jī)器人能根據(jù)檢索出的文檔內(nèi)容回答,只需要調(diào)用LLM機(jī)器人,并把之前返回的文檔內(nèi)容寫入prompt中即可完成。這方面可以自己調(diào)用API完成,也可以繼續(xù)使用Langchain框架完成。具體如何調(diào)用LLM就不詳細(xì)介紹啦。
一些參考文檔:
同濟(jì)子豪兄-基于文心大模型的金融知識庫問答AI實戰(zhàn) - 飛槳AI Studio星河社區(qū) (baidu.com)
基于langchain+千帆sdk的一個基于文檔的QA問答Demo - 百度智能云千帆社區(qū) (baidu.com)文章來源:http://www.zghlxwxcb.cn/news/detail-758550.html
使用 Elasticsearch、OpenAI 和 LangChain 進(jìn)行語義搜索_Elastic 中國社區(qū)官方博客的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-758550.html
到了這里,關(guān)于Langchain+ElasticSearch+文心千帆 構(gòu)建檢索增強(qiáng)LLM Agent的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!