大模型之深入了解Retrievers解析器 原創(chuàng)
前言
在上一章【??大模型之深入探索RAG流程???】中,我們對(duì)RAG流程中 ??文檔讀取(LOAD)?
?? -> ??文檔切分(SPLIT)?
?? -> ??向量化(EMBED)?
?? -> ??存儲(chǔ)(STORE)?
?? 進(jìn)行了深入了解,本章將接著深入了解 ??解析(Retrieval)?
? 的使用
解析器簡(jiǎn)介
簡(jiǎn)介:在 RAG(Retrieval-Augmented Generation)流程中,Retrieval(檢索)是關(guān)鍵環(huán)節(jié),其主要目標(biāo)是從大量文檔或知識(shí)庫中提取與用戶查詢相關(guān)的信息。
目的:
- 信息獲取:根據(jù)用戶的查詢,從外部知識(shí)庫中獲取相關(guān)文檔或片段,以增強(qiáng)生成模型的上下文信息。
- 提高準(zhǔn)確性:通過提供具體的、相關(guān)的信息,幫助生成模型(如語言模型)產(chǎn)生更準(zhǔn)確和上下文相關(guān)的回答。
流程
- 用戶查詢:用戶輸入一個(gè)查詢或問題。
- 檢索器:使用檢索算法(如 BM25、TF-IDF 或基于嵌入的檢索)搜索知識(shí)庫,找到與查詢最相關(guān)的文檔。
- 文檔評(píng)分:對(duì)檢索到的文檔進(jìn)行評(píng)分,通常依據(jù)相關(guān)性得分來排序。
- 返回結(jié)果:將最相關(guān)的文檔或片段返回給生成模型。
解析器的基礎(chǔ)使用
創(chuàng)建知識(shí)庫
第一步:?jiǎn)?dòng)Chroma數(shù)據(jù)庫
chroma run --path chroma_xiyou --port 8000
第二步:使用RAG基礎(chǔ)流程:Load->Split->EMBED->STORE創(chuàng)建一個(gè)知識(shí)庫
from langchain_text_splitters importRecursiveCharacterTextSplitter
from langchain.embeddings importHuggingFaceEmbeddings
from langchain.document_loaders importPyMuPDFLoader
from langchain_chroma importChroma
from chromadb importSettings
from chromadb importClient
from utils import get_ernie_models
import chromadb
# 連接大模型
llm_ernie, chat_ernie, embed_ernie = get_ernie_models()
# 初始化 HuggingFaceEmbeddings
embedding_function =HuggingFaceEmbeddings(model_name="bert-base-chinese")
# 加載文檔
pdf_loader =PyMuPDFLoader("testfiles/西游記.pdf")
documents = pdf_loader.load()
# 切分文檔
spliter =RecursiveCharacterTextSplitter(chunk_size=128, chunk_overlap=64)
docs = spliter.split_documents(documents)
# 配置連接信息
client = chromadb.HttpClient(host='localhost', port=8000)
chroma_db =Chroma(
embedding_functinotallow=embedding_function,
client=client
)
batch_size =6# 每次處理的樣本數(shù)量
# 分批入庫
for i inrange(0,len(docs), batch_size):
batch = docs[i:i + batch_size]# 獲取當(dāng)前批次的樣本
print(f'Processing batch {i} to {i + batch_size}, total {len(batch)} samples')
chroma_db.add_documents(documents=batch) # 入庫
說明:
- 向量化說明:由于Qwen和百度千帆的向量接口限制較多,對(duì)于向量化西游記這本書來說,經(jīng)常會(huì)遇到超出限制等問題,所以此處我將向量化接口換為HuggingFaceEmbeddings(),該接口可能會(huì)存在被Ban的風(fēng)險(xiǎn),請(qǐng)自行更換向量化接口。
- 測(cè)試文檔:西游記下載地址請(qǐng)見夸克網(wǎng)盤:西游記
創(chuàng)建解析器
第三步:創(chuàng)建一個(gè)解析器
retriever = chroma_db.as_retriever()
創(chuàng)建chain鏈
創(chuàng)建chain鏈有兩種方法:一種是管道符連接,一種是使用 create_retrieval_chain 。本章我們兩種方法都做嘗試,以便對(duì)比代碼的寫法。
方式一:傳統(tǒng)的管道符構(gòu)建chain
# RAG系統(tǒng)經(jīng)典的 Prompt
prompt =ChatPromptTemplate.from_messages([
("human","""You are an assistant for question-answering tasks. Use the following pieces
of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Use three sentences maximum and keep the answer concise.
Question: {question}
Context: {context}
Answer:""")
])
defformat_docs(docs):
return"\n\n".join(doc.page_content for doc in docs)
# RAG 鏈
rag_chain =(
{"context": retriever | format_docs,
"question":RunnablePassthrough()}
| prompt
| chat_ernie
|StrOutputParser()
)
rag_chain.invoke(input="孫悟空三打白骨精時(shí),白骨精分別變成了哪些形態(tài)?")
運(yùn)行結(jié)果:
方式二:使用create_retrieval_chain構(gòu)建
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts importChatPromptTemplate
prompt =ChatPromptTemplate.from_messages([
("system","""Answer any use questions based solely on the context below:
<context>
{context}
</context>"""),
("placeholder","{chat_history}"),
("human","{input}"),
])
combine_docs_chain = create_stuff_documents_chain(
llm=chat_ernie,prompt= prompt
)
chain = create_retrieval_chain(retriever=retriever, combine_docs_chain=combine_docs_chain)
chain.invoke(input={"input":"孫悟空三打白骨精時(shí),白骨精分別變成了哪些形態(tài)?"})
說明:
- 上述的prompt可以在smith.langchain.com上查詢?
?langchain-ai/retrieval-qa-chat?
?得到。
運(yùn)行結(jié)果:
通過對(duì)比,可以看到使用 ??create_retrieval_chain?
? 創(chuàng)建chain時(shí),可以減少format_docs()步驟以及使用管道符部分的代碼量,簡(jiǎn)化調(diào)用步驟。
以上調(diào)用即為完整的解析器使用流程,其中第三步中 ??retriever = chroma_db.as_retriever()?
? 可以有多種方式構(gòu)建解析器。本章內(nèi)容,我們著重對(duì)此深入研究。
解析器的不同類型
除了上面基礎(chǔ)的向量存儲(chǔ)檢索器之外,Langchain 還提供了多種高級(jí)檢索類型,包括多查詢檢索器(MultiQueryRetriever)、結(jié)合檢索器(EnsembleRetriever)等。
多查詢檢索器 MultiQueryRetriever
簡(jiǎn)介: ??MultiQueryRetriever?
? 是一種檢索算法,它通過使用大型語言模型(LLM)生成多個(gè)查詢,從而自動(dòng)化提示調(diào)優(yōu)過程。
功能: 它為給定的用戶輸入查詢生成多個(gè)不同視角的查詢。對(duì)于每個(gè)查詢,它檢索一組相關(guān)文檔,并通過所有查詢的唯一聯(lián)合來獲得更大的一組潛在相關(guān)文檔。這種方法提高了檢索的準(zhǔn)確性和多樣性。
使用場(chǎng)景: 當(dāng)用戶的問題復(fù)雜并且需要多條不同的信息來回答時(shí),??MultiQueryRetriever?
? 特別有用。它可以在需要關(guān)于多個(gè)主題的信息時(shí)提供更全面的結(jié)果
使用方法: 第一步:構(gòu)建知識(shí)庫(此處復(fù)用上面的知識(shí)庫,詳細(xì)內(nèi)容不再贅述)
第二步:使用MultiQueryRetriever
import logging
from langchain.retrievers.multi_query importMultiQueryRetriever
question ="孫悟空三打白骨精時(shí),白骨精分別變成了哪些形態(tài)?"
# 把向量操作封裝為一個(gè)基本檢索器
retriever = chroma_db.as_retriever()
retriever_from_llm =MultiQueryRetriever.from_llm(
retriever=chroma_db.as_retriever(), llm=chat_ernie
)
logging.basicConfig()
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)
unique_docs = retriever_from_llm.get_relevant_documents(query=question)
unique_docs
print(f'返回的文檔個(gè)數(shù):{len(unique_docs)}')
print(f'返回的文檔內(nèi)容:')
for doc in unique_docs:
print(doc.page_content)
運(yùn)行結(jié)果:
INFO:langchain.retrievers.multi_query:Generated
queries: ['以下是三個(gè)不同版本的生成問題,旨在從不同角度探索原始問題的相關(guān)信息:',
'1. 孫悟空在三打白骨精的情節(jié)中,白骨精分別化作了哪些生物或物體形態(tài)?',
'2. 孫悟空三打白骨精時(shí),白骨精變身的形態(tài)有哪些?請(qǐng)?jiān)敿?xì)列出。',
'3. 在《西游記》中,白骨精在孫悟空三打她的過程中,她變換成了哪些不同的身份或外觀?',
'希望以上問題可以幫助你從不同的角度獲取相關(guān)信息,從而更全面地回答原始問題。']
第三步:使用 create_retrieval_chain 進(jìn)行完整查詢
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts importChatPromptTemplate
# 創(chuàng)建結(jié)合文檔的鏈
prompt =ChatPromptTemplate.from_messages([
("system","""Answer any user questions based solely on the context below:
<context>
{context}
</context>"""),
("placeholder","{chat_history}"),
("human","{input}"),
])
combine_docs_chain = create_stuff_documents_chain(
llm=chat_ernie, prompt=prompt
)
# 創(chuàng)建檢索鏈
chain = create_retrieval_chain(retriever=retriever_from_llm, combine_docs_chain=combine_docs_chain)
# 使用鏈進(jìn)行查詢
result = chain.invoke(input={"input": question})
# 輸出最終結(jié)果
print("最終回答:", result)
運(yùn)行結(jié)果:
最終回答: {'input':'孫悟空三打白骨精時(shí),白骨精分別變成了哪些形態(tài)?',
'context':[
Document(metadata={'author':'吳承恩','creationDate':"D:20240329064911+00'00'",'creator':'calibre 3.23.0 [https://calibre-ebook.com]','file_path':'testfiles/西游記.pdf','format':'PDF 1.4','keywords':'','modDate':'','page':7,'producer':'calibre 3.23.0 [https://calibre-ebook.com]','source':'testfiles/西游記.pdf','subject':'','title':'西游記(人文社經(jīng)典彩皮版,長(zhǎng)銷70年,以明代世德堂本為底本;三次修訂重校;豆瓣上萬條評(píng)論;2020年教育部指導(dǎo)目錄圖書)','total_pages':675,'trapped':''}, page_cnotallow='了許多新的成果,為了能讓廣大讀者更好地理解該作品,這次特意邀請(qǐng)北京大學(xué)劉勇強(qiáng)教授重新為該書撰\n寫了前言。\n六、關(guān)于取經(jīng)途中所遇的八十一難順序,第九十九回諸神給觀音菩薩提供的簿子所記,與小說的敘述'),
....(內(nèi)容過多,此處省略)
Document(metadata={'author':'吳承恩','creationDate':"D:20240329064911+00'00'",'creator':'calibre 3.23.0 [https://calibre-ebook.com]','file_path':'testfiles/西游記.pdf','format':'PDF 1.4','keywords':'','modDate':'','page':6,'producer':'calibre 3.23.0 [https://calibre-ebook.com]','source':'testfiles/西游記.pdf','subject':'','title':'西游記(人文社經(jīng)典彩皮版,長(zhǎng)銷70年,以明代世德堂本為底本;三次修訂重校;豆瓣上萬條評(píng)論;2020年教育部指導(dǎo)目錄圖書)','total_pages':675,'trapped':''}, page_cnotallow='五、更換前言。本書的前言,過去一直沿用華東師范大學(xué)郭豫適、簡(jiǎn)茂森教授一九七二年所寫的文\n字,限于當(dāng)時(shí)的歷史環(huán)境,政治化色彩較濃,而《西游記》研究在過去的幾十年中取得了很大發(fā)展,出現(xiàn)')],
'answer':'根據(jù)原文信息得出,孫悟空三打白骨精時(shí),白骨精分別變成了美麗的村姑、年滿八旬的老婦人、和一位白發(fā)蒼蒼的老公公。'}
通過以上實(shí)踐,可以看到:
1、MultiQueryRetriever會(huì)借助大模型生成新的多個(gè)查詢 queries;
2、MultiQueryRetriever會(huì)通過這些 queries 檢索出相關(guān)的文檔;
3、最后,通過 combine_docs_chain 將檢索出的文檔交給大模型得到最終答案。
結(jié)合檢索器 EnsembleRetriever
簡(jiǎn)介: EnsembleRetriever是一種結(jié)合多個(gè)檢索器結(jié)果的算法,通過重新排序來提高檢索效果。
功能: 該算法從多個(gè)檢索器中獲取文檔,并將它們組合在一起,以提高文本相似性匹配和信息檢索的準(zhǔn)確性。通過結(jié)合多種補(bǔ)充的向量搜索算法,EnsembleRetriever提供了最先進(jìn)的文本相似性匹配和信息檢索能力。
使用場(chǎng)景: 當(dāng)需要結(jié)合多種檢索方法以獲得更高的檢索準(zhǔn)確性時(shí),EnsembleRetriever是理想的選擇。這種方法適用于需要從大量文檔集合中進(jìn)行信息檢索的應(yīng)用場(chǎng)景
使用方法 第一步:安裝依賴包
pip install rank_bm25
pip install faiss-gpu
第二步:準(zhǔn)備知識(shí)數(shù)據(jù)
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
from langchain_community.vectorstores import FAISS
# 初始化 HuggingFaceEmbeddings
embedding =HuggingFaceEmbeddings(model_name="bert-base-chinese")
# 中文文檔列表
doc_list_1 =[
"我喜歡蘋果",
"我喜歡橙子",
"蘋果和橙子都是水果",
]
doc_list_2 =[
"你喜歡蘋果嗎?",
"你喜歡橙子嗎?",
]
第三步:創(chuàng)建組合檢索器
# 初始化 BM25 檢索器
bm25_retriever = BM25Retriever.from_texts(
doc_list_1, metadatas=[{"source":1}]*len(doc_list_1)
)
bm25_retriever.k =2
# 創(chuàng)建 FAISS 向量存儲(chǔ)
faiss_vectorstore = FAISS.from_texts(
doc_list_2, embedding, metadatas=[{"source":2}]*len(doc_list_2)
)
faiss_retriever = faiss_vectorstore.as_retriever(search_kwargs={"k":2})
# 初始化組合檢索器
ensemble_retriever =EnsembleRetriever(
retrievers=[bm25_retriever, faiss_retriever], weights=[0.5,0.5]
)
第四步:進(jìn)行查詢
# 輸入查詢
docs = ensemble_retriever.invoke("我想知道關(guān)于蘋果的信息")
print(docs)
運(yùn)行結(jié)果:
[
Document(metadata={'source':1}, page_cnotallow='蘋果和橙子都是水果'),
Document(metadata={'source':2}, page_cnotallow='你喜歡蘋果嗎?'),
Document(metadata={'source':1}, page_cnotallow='我喜歡橙子'),
Document(metadata={'source':2}, page_cnotallow='你喜歡橙子嗎?')
]
說明:
- BM25Retriever 是一種基于經(jīng)典信息檢索模型 BM25 的檢索器。它的優(yōu)點(diǎn):
簡(jiǎn)單易用,適合處理短文本和關(guān)鍵詞檢索。
對(duì)于傳統(tǒng)的文本匹配任務(wù)表現(xiàn)良好。
- FAISS(Facebook AI Similarity Search)是一個(gè)高效的相似性搜索庫,專門用于處理大規(guī)模向量數(shù)據(jù)。它的優(yōu)點(diǎn):
- 適合處理復(fù)雜的語義檢索任務(wù),尤其是在向量空間中。
- 能夠處理大規(guī)模數(shù)據(jù)集,檢索速度快。
- 將 BM25Retriever 和 FAISS 組合在一起:
- 互補(bǔ)性:BM25 更適合處理基于關(guān)鍵詞的檢索,能夠有效地從文本中找到相關(guān)文檔;FAISS 則擅長(zhǎng)處理語義相似性,通過向量化表示捕捉文本的深層含義。
- 提高檢索:通過組合兩種方法,可以充分利用 BM25 的詞頻特性和 FAISS 的向量相似性,從而提高整體檢索的準(zhǔn)確性和全面性。
長(zhǎng)上下文重排序 LongContextReorder
簡(jiǎn)介: LongContextReorder是一種用于處理長(zhǎng)上下文信息的技術(shù),旨在提高模型在長(zhǎng)文本中的信息提取和理解能力。它通過重新排序文檔,以使最相關(guān)的信息更易于被模型捕捉。
功能: 信息重排序: LongContextReorder從多個(gè)檢索器中獲取文檔,并對(duì)它們進(jìn)行重新排序,使得最相關(guān)的文檔位于上下文窗口的開頭和結(jié)尾。這有助于模型更好地關(guān)注整個(gè)上下文中的關(guān)鍵內(nèi)容。 上下文優(yōu)化: 通過優(yōu)化上下文的排列,模型能夠更有效地利用長(zhǎng)文本中的信息,從而提高回答的準(zhǔn)確性和相關(guān)性。
使用場(chǎng)景: 這種技術(shù)特別適合需要在長(zhǎng)文本中提取關(guān)鍵信息的應(yīng)用場(chǎng)景,比如法律文書分析、學(xué)術(shù)論文閱讀和長(zhǎng)篇故事理解等。
使用方法:
第一步:?jiǎn)?dòng) Chroma 數(shù)據(jù)庫
chroma run --path chroma_test --port 8000
說明:
- 此處是避免與前面的代碼產(chǎn)生數(shù)據(jù)污染,所以最好關(guān)閉之前的chroma數(shù)據(jù)庫,重新啟動(dòng)一個(gè)新的。
第二步:準(zhǔn)備數(shù)據(jù)
import os
from langchain.chains importLLMChain,StuffDocumentsChain
from langchain.prompts importPromptTemplate
from langchain_chroma importChroma
from langchain_community.document_transformers import(
LongContextReorder,
)
from langchain_community.embeddings importHuggingFaceEmbeddings
# 測(cè)試數(shù)據(jù)
texts =[
"籃球是一項(xiàng)很棒的運(yùn)動(dòng)。",
"《Fly me to the moon》 是我最喜歡的歌曲之一。",
"凱爾特人是我最喜歡的球隊(duì)。",
"這是關(guān)于波士頓凱爾特人的一篇文章。",
"我最喜歡的游戲是《黑神話:悟空》",
"波士頓凱爾特人以20分的優(yōu)勢(shì)贏得了比賽。",
"在《西游記》中,孫悟空三打白骨精時(shí),白骨精分別變成了村姑、老婦和老翁這三種形態(tài)。"
"孫悟空三大白骨精是西游記中一段精彩的篇章。",
"L. Kornet 是凱爾特人隊(duì)中最優(yōu)秀的球員之一",
"Larry Bird 是一位標(biāo)志性的NBA球員。",
]
# 初始化 HuggingFaceEmbeddings
embeddings =HuggingFaceEmbeddings(model_name="bert-base-chinese")
第三步:創(chuàng)建Retriever并查詢相關(guān)信息
# 創(chuàng)建一個(gè) retriever
retriever = Chroma.from_texts(texts, embedding=embeddings).as_retriever(
search_kwargs={"k": 10}
)
query = "請(qǐng)告訴我關(guān)于白骨精的事情"
# Get relevant documents ordered by relevance score
docs = retriever.get_relevant_documents(query)
for doc in docs:
print(doc.page_content)
運(yùn)行結(jié)果:
在《西游記》中,孫悟空三打白骨精時(shí),白骨精分別變成了村姑、老婦和老翁這三種形態(tài)。孫悟空三大白骨精是西游記中一段精彩的篇章。
這是關(guān)于波士頓凱爾特人的一篇文章。
我最喜歡的游戲是《黑神話:悟空》
L. Kornet 是凱爾特人隊(duì)中最優(yōu)秀的球員之一
《Fly me to the moon》 是我最喜歡的歌曲之一。
凱爾特人是我最喜歡的球隊(duì)。
Larry Bird 是一位標(biāo)志性的NBA球員。
籃球是一項(xiàng)很棒的運(yùn)動(dòng)。
波士頓凱爾特人以20分的優(yōu)勢(shì)贏得了比賽。
第四步:使用LongContextReorder進(jìn)行重排序
reordering = LongContextReorder()
reordered_docs = reordering.transform_documents(docs)
for doc in reordered_docs:
print(doc.page_content)
運(yùn)行結(jié)果:
在《西游記》中,孫悟空三打白骨精時(shí),白骨精分別變成了村姑、老婦和老翁這三種形態(tài)。孫悟空三大白骨精是西游記中一段精彩的篇章。
我最喜歡的游戲是《黑神話:悟空》
《Fly me to the moon》 是我最喜歡的歌曲之一。
Larry Bird 是一位標(biāo)志性的NBA球員。
波士頓凱爾特人以20分的優(yōu)勢(shì)贏得了比賽。
籃球是一項(xiàng)很棒的運(yùn)動(dòng)。
凱爾特人是我最喜歡的球隊(duì)。
L. Kornet 是凱爾特人隊(duì)中最優(yōu)秀的球員之一
這是關(guān)于波士頓凱爾特人的一篇文章。
對(duì)比上面的結(jié)果,可以看到,通過使用 LongContextReorder,可以將文檔重新排序,將與西游相關(guān)的信息排在前面,有助于提高模型的理解能力。
ElasticSearchBM25Retriever
簡(jiǎn)介: ElasticSearchBM25Retriever使用BM25算法,這是信息檢索中的一種經(jīng)典方法,廣泛應(yīng)用于ElasticSearch等搜索引擎中。
功能: BM25是一種基于概率模型的檢索算法,能夠根據(jù)文檔和查詢之間的詞頻和逆文檔頻率,計(jì)算文檔的相關(guān)性得分。
使用場(chǎng)景: ElasticSearchBM25Retriever適用于需要高效文本搜索的場(chǎng)景,尤其是在需要處理大量非結(jié)構(gòu)化文本數(shù)據(jù)時(shí)。它在搜索引擎優(yōu)化和文本挖掘中非常有用。
使用方法:
第一步:安裝必要的庫
pip install elasticsearch langchain
第二步:安裝Elasticsearch并啟動(dòng)服務(wù)
- 1. 啟動(dòng)Elasticsearch的Docker容器,確保 Elasticsearch 服務(wù)正在運(yùn)行。
- 2. 在瀏覽器中訪問 http://localhost:9200 可以得到如下內(nèi)容。
說明:Elasticsearch 的安裝方法較長(zhǎng),由于不是本章的主線內(nèi)容,所以我將這方面內(nèi)容放在附錄部分。
第三步:準(zhǔn)備數(shù)據(jù)并創(chuàng)建索引
from elasticsearch importElasticsearch
from langchain.retrievers importElasticSearchBM25Retriever
elasticsearch_url ="http://elastic:mytest@localhost:9200"
# 創(chuàng)建檢索器
retriever =ElasticSearchBM25Retriever.create(elasticsearch_url,"langchain-index-5")
# 準(zhǔn)備測(cè)試數(shù)據(jù)
documents =[
"籃球是一項(xiàng)很棒的運(yùn)動(dòng)。",
"《Fly me to the moon》 是我最喜歡的歌曲之一。",
"凱爾特人是我最喜歡的球隊(duì)。",
"這是關(guān)于波士頓凱爾特人的一篇文章。",
"我最喜歡的游戲是《黑神話:悟空》"
]
# 添加文本
retriever.add_texts(documents)
運(yùn)行結(jié)果:
['39c92ff7-4aba-42fb-bc88-2997b5e0c297',
'b1e9c357-b67c-43e0-bf95-2591c9e2a103',
'e4f964cf-92a0-4b4a-b648-9d0c2f8594b0',
'9edcfd38-e954-4bb1-b0d5-68ebf13b3443',
'ea0fc62f-6afd-4e27-9f85-a357ef9221a3']
說明: ??http://elastic:mytest@localhost:9200?
? 中:
- ?
?elastic?
? 是用戶名 - ?
?mytest?
? 是密碼
第四步:使用 ??retriever?
? 進(jìn)行查詢
# 查詢
query ="請(qǐng)告訴我關(guān)于凱爾特人的事情"
try:
docs = retriever.get_relevant_documents(query)
# 輸出結(jié)果
for doc in docs:
print(doc.page_content)
print("-"*20)
exceptExceptionas e:
print(f"An error occurred: {e}")
運(yùn)行結(jié)果:
這是關(guān)于波士頓凱爾特人的一篇文章。
--------------------
凱爾特人是我最喜歡的球隊(duì)。
--------------------
我最喜歡的游戲是《黑神話:悟空》
--------------------
《Fly me to the moon》 是我最喜歡的歌曲之一。
--------------------
籃球是一項(xiàng)很棒的運(yùn)動(dòng)。
--------------------
附錄
ElasticSearch的Docker安裝教程
由于在系統(tǒng)環(huán)境中安裝ElasticSearch非常繁瑣,需要安裝(JDK等)基礎(chǔ)環(huán)境,所以我們使用Docker來安裝ElasticSearch。
安裝Docker
Docker的安裝教程比較多且詳細(xì),所以本文不再贅述,詳情請(qǐng)查看: 10分鐘學(xué)會(huì)Docker的安裝和使用
創(chuàng)建網(wǎng)絡(luò)
docker network create es-net
運(yùn)行結(jié)果:
拉取鏡像
docker pull elasticsearch:8.6.0
運(yùn)行結(jié)果:
創(chuàng)建掛載點(diǎn)目錄
# 選擇合適的目錄創(chuàng)建三個(gè)文件夾
mkdir -p /Users/deadwalk/Code/elasticsearch/data /Users/deadwalk/Code/elasticsearch/config /Users/deadwalk/Code/elasticsearch/plugins
運(yùn)行結(jié)果:
啟動(dòng)容器
命令行中輸入命令啟動(dòng)Docker容器
docker run -d \
--restart=always \
--name es \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
--privileged \
-v /Users/deadwalk/Code/elasticsearch/data:/usr/share/elasticsearch/data \
-v /Users/deadwalk/Code/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:8.6.0
運(yùn)行結(jié)果:
使用 ??docker ps?
? 可以看到Docker容器已經(jīng)啟動(dòng)。
修改elasticsearch的密碼
第一步:進(jìn)入es容器
docker exec -it es /bin/bash
第二步:命令行輸入重置密碼命令
bin/elasticsearch-reset-password -i -u elastic
根據(jù)提示重置密碼,例如:mytest
第三步:使用瀏覽器訪問http://localhost:9200/ 使用用戶名 ??elastic?
?? 和重置的密碼 ??mytest?
? ,驗(yàn)證可以登錄。
內(nèi)容小結(jié)
- RAG系統(tǒng)在進(jìn)行Load->Split->Embedding->Store->Query流程時(shí),需要使用?
?Retriever?
? 進(jìn)行文檔檢索。 - Retriever進(jìn)行文檔檢索時(shí),有兩種方法構(gòu)建Chain鏈:一種是傳統(tǒng)的管道符構(gòu)建,另一種是使用?
?create_retrieval_chain?
? 。 - 使用Retriever時(shí),除了基礎(chǔ)的向量存儲(chǔ)檢索器之外,還可以使用多查詢檢索器(?
?MultiQueryRetriever?
?)、結(jié)合檢索器(??EnsembleRetriever?
?)等。 - ?
?MultiQueryRetriever?
? 是一種檢索算法,它通過使用大型語言模型(LLM)生成多個(gè)查詢,從而自動(dòng)化提示調(diào)優(yōu)過程。 - ?
?MultiQueryRetriever?
? 的工作流程如下:
1.??MultiQueryRetriever?
?? 會(huì)借助大模型生成新的多個(gè)查詢 ??queries;?
?
2.??MultiQueryRetriever?
?? 會(huì)通過這些 ??queries?
? 檢索出相關(guān)的文檔;
3.最后,通過 ??combine_docs_chain?
? 將檢索出的文檔交給大模型得到最終答案。
- ?
?EnsembleRetriever?
? 是一種結(jié)合多個(gè)檢索器結(jié)果的算法,通過重新排序來提高檢索效果。 BM25Retriever
是一種基于經(jīng)典信息檢索模型 BM25 的檢索器。FAISS(Facebook AI Similarity Search)
是一個(gè)高效的相似性搜索庫,專門用于處理大規(guī)模向量數(shù)據(jù)。EnsembleRetriever
可以將BM25Retriever
和FAISS
組合使用,從而提高整體檢索的準(zhǔn)確性和全面性。LongContextReorder
是一種用于處理長(zhǎng)上下文信息的技術(shù),旨在提高模型在長(zhǎng)文本中的信息提取和理解能力。ElasticSearchBM25Retriever
可以與開源搜索引擎ElasticSearch
進(jìn)行交互,以實(shí)現(xiàn)向量搜索。
本文轉(zhuǎn)載自公眾號(hào)一起AI技術(shù) 作者:熱情的Dongming
