譯者 | 李睿
審校 | 重樓
檢索增強(qiáng)生成(RAG)的生態(tài)系統(tǒng)在過去幾年中迅速崛起。如今,互聯(lián)網(wǎng)上涌現(xiàn)出越來越多幫助開發(fā)人員構(gòu)建RAG應(yīng)用程序的開源項(xiàng)目。而RAG是一種通過外部知識(shí)源增強(qiáng)大型語言模型(LLM)的有效方法。因此,本文將介紹一些掌握RAG系統(tǒng)的優(yōu)秀GitHub存儲(chǔ)庫。
在詳細(xì)介紹之前,首先簡(jiǎn)單了解一下RAG及其應(yīng)用程序。
RAG管道的工作流程如下:
?系統(tǒng)檢索文件或數(shù)據(jù);
?檢索對(duì)完成用戶提示上下文有幫助或有用的信息;
?系統(tǒng)將這些上下文信息輸入LLM,以生成準(zhǔn)確且符合上下文的響應(yīng)。
如上所述,本文將探討不同的開源RAG框架及其GitHub存儲(chǔ)庫,使用戶能夠輕松構(gòu)建RAG系統(tǒng)。其目的是幫助開發(fā)人員、學(xué)生和技術(shù)愛好者選擇適合自己需求的RAG工具包并加以利用。
為什么應(yīng)該掌握RAG系統(tǒng)
檢索增強(qiáng)生成(RAG)已經(jīng)迅速成為人工智能領(lǐng)域最具影響力的創(chuàng)新技術(shù)之一。隨著企業(yè)越來越注重實(shí)施具有上下文感知能力的智能系統(tǒng),掌握RAG將成為必備技能。企業(yè)正利用RAG管道構(gòu)建聊天機(jī)器人、知識(shí)助理和企業(yè)自動(dòng)化工具,以確保其人工智能模型能夠利用實(shí)時(shí)、特定領(lǐng)域的數(shù)據(jù),而不是僅僅依賴于預(yù)訓(xùn)練的知識(shí)。
在RAG被用于構(gòu)建更智能的聊天機(jī)器人、企業(yè)助手和自動(dòng)化工具的時(shí)代,深入理解RAG可以讓用戶能夠在人工智能開發(fā)、數(shù)據(jù)工程和自動(dòng)化領(lǐng)域獲得巨大的競(jìng)爭(zhēng)優(yōu)勢(shì)。掌握構(gòu)建和優(yōu)化RAG管道的技能將獲得更多的機(jī)遇,并最終提升市場(chǎng)競(jìng)爭(zhēng)力,讓職業(yè)生涯更具前瞻性。
圖1 RAG的好處
在尋求掌握這些工具和技能的過程中,將介紹如何掌握RAG系統(tǒng)的頂級(jí)GitHub存儲(chǔ)庫。但在此之前,需要了解這些RAG框架究竟如何提供幫助。
RAG框架的作用
檢索增強(qiáng)生成(RAG)框架是一種先進(jìn)的人工智能架構(gòu),旨在通過將外部信息集成到響應(yīng)生成過程中來提高LLM的能力。這使得LLM的響應(yīng)更加豐富或具有時(shí)效性,而不是僅僅依賴于構(gòu)建語言模型時(shí)使用的初始數(shù)據(jù)。該模型可以從外部數(shù)據(jù)庫或知識(shí)庫(API)中檢索相關(guān)文檔或數(shù)據(jù),然后根據(jù)用戶查詢生成響應(yīng),而不是簡(jiǎn)單地依賴于最初訓(xùn)練模型的數(shù)據(jù)。
圖2 RAG的架構(gòu)
這使得模型能夠處理問題并生成正確、對(duì)時(shí)間敏感或與上下文相關(guān)的答案。與此同時(shí),它還能緩解知識(shí)截?cái)嗪湍P突糜X(即對(duì)提示的錯(cuò)誤響應(yīng))等問題。通過將通用知識(shí)與特定領(lǐng)域信息相結(jié)合,RAG使人工智能系統(tǒng)能夠提供負(fù)責(zé)任、可信的響應(yīng)。
RAG技術(shù)的應(yīng)用場(chǎng)景廣泛,包括客戶支持、搜索、合規(guī)性、數(shù)據(jù)分析等。此外,RAG系統(tǒng)還顯著降低了對(duì)模型進(jìn)行頻繁重訓(xùn)練的需求,避免了為滿足特定請(qǐng)求而專門調(diào)整模型的成本。
掌握RAG系統(tǒng)的優(yōu)秀存儲(chǔ)庫
既然已經(jīng)了解RAG系統(tǒng)如何提供幫助,以下將探索一些頂級(jí)GitHub存儲(chǔ)庫,這些存儲(chǔ)庫提供了詳細(xì)的教程、代碼和資源,幫助人們掌握RAG系統(tǒng)。這些GitHub存儲(chǔ)庫將幫助用戶掌握使用RAG系統(tǒng)所需的工具、技能、框架和理論。
1.LangChain
LangChain是一個(gè)完整的LLM工具包,使開發(fā)者能夠創(chuàng)建具有提示、記憶、代理和數(shù)據(jù)連接器等功能的復(fù)雜應(yīng)用程序。從加載文檔、拆分文本、嵌入和檢索,到生成輸出,LangChain為RAG管道的每個(gè)步驟都提供了模塊。
LangChain擁有一個(gè)與OpenAI、Hugging Face、Azure等模型提供商集成的豐富生態(tài)系統(tǒng),并支持Python、JavaScript和TypeScript等多種編程語言。LangChain的模塊化架構(gòu)采用分步流程設(shè)計(jì),使用戶能夠靈活組合工具、構(gòu)建智能代理工作流,并利用豐富的內(nèi)置鏈?zhǔn)浇M件快速搭建應(yīng)用程序。
?LangChain的核心功能包括工具鏈系統(tǒng)、豐富的提示模板,以及對(duì)代理和記憶模塊的一流支持。
?LangChain采用開源協(xié)議(MIT許可證),擁有龐大的社區(qū)(GitHu Star超過70000個(gè))。
?組件:提示模板、LLM封裝器、向量庫連接器、代理(工具+推理)、記憶模塊等。
?集成:LangChain支持許多LLM提供商(OpenAI、Azure、本地LLM),嵌入模型和向量存儲(chǔ)(FAISS, 、Pinecone、Chroma等)。
?用例:定制聊天機(jī)器人、文檔問答、多步驟工作流程、RAG和代理任務(wù)。
使用示例
LangChain的高級(jí)API使簡(jiǎn)單的RAG管道簡(jiǎn)潔明了。例如,在這里使用LangChain來回答一個(gè)問題,使用OpenAI的嵌入和LLM的一小部分文檔:
Python
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
# Sample documents to index
docs = ["RAG stands for retrieval-augmented generation.", "It combines search and LLMs for better answers."]
# 1. Create embeddings and vector store
vectorstore = FAISS.from_texts(docs, OpenAIEmbeddings())
# 2. Build a QA chain (LLM + retriever)
qa = RetrievalQA.from_chain_type(
llm=OpenAI(model_name="text-davinci-003"),
retriever=vectorstore.as_retriever()
)
# 3. Run the query
result = qa({"query": "What does RAG mean?"})
print(result["result"])這段代碼獲取文檔并使用OpenAI嵌入將其加載到FAISS向量存儲(chǔ)中。然后,它使用RetrievalQA獲取相關(guān)上下文并生成答案。LangChain抽象了檢索和LLM調(diào)用。(有關(guān)其他說明請(qǐng)參閱LangChain API和教程。)
有關(guān)更多信息可以在此處查看Langchain的GitHub存儲(chǔ)庫。
2.deepset-ai的Haystack
Haystack是deepset團(tuán)隊(duì)開發(fā)的一款面向企業(yè)的RAG框架,是圍繞可組合管道構(gòu)建的。該框架采用圖狀管道設(shè)計(jì),允許用戶將檢索器、閱讀器和生成器等功能節(jié)點(diǎn)連接成有向圖結(jié)構(gòu)。Haystack專為prod中的部署而設(shè)計(jì),并為文檔存儲(chǔ)和檢索提供了多種后端選擇,例如Elasticsearch、OpenSearch、Milvus、Qdrant等。
?它提供了基于關(guān)鍵字的檢索(BM25)和密集檢索功能,并且易于插入開源閱讀器(Transformers QA模型)或生成式答案生成器。
?它是開源的(Apache 2.0許可證),并且非常成熟(GitHub Star超過10000個(gè))。
?架構(gòu):以管道為中心且模塊化,節(jié)點(diǎn)可以準(zhǔn)確插入和替換。
?組件包括:文檔存儲(chǔ)(Elasticsearch、In-Memory等),檢索器(BM25、Dense),讀取器(例如,Hugging FaceQA模型)和生成器(OpenAI、本地LLM)。
?易于擴(kuò)展:分布式設(shè)置(Elasticsearch集群)、GPU支持、REST API和Docker。
?可能的用例包括:用于搜索的RAG、文檔問答、摘要應(yīng)用、監(jiān)控用戶查詢。
使用示例
以下是使用Haystack現(xiàn)代API(v2)創(chuàng)建小型RAG管道的簡(jiǎn)化示例:
Python
from haystack.document_stores import InMemoryDocumentStore
from haystack.nodes import BM25Retriever, OpenAIAnswerGenerator
from haystack.pipelines import Pipeline
# 1. Prepare a document store
doc_store = InMemoryDocumentStore()
documents = [{"content": "RAG stands for retrieval-augmented generation."}]
doc_store.write_documents(documents)
# 2. Set up retriever and generator
retriever = BM25Retriever(document_store=doc_store)
generator = OpenAIAnswerGenerator(model_name="text-davinci-003")
# 3. Build the pipeline
pipe = Pipeline()
pipe.add_node(compnotallow=retriever, name="Retriever", inputs=[])
pipe.add_node(compnotallow=generator, name="Generator", inputs=["Retriever"])
# 4. Run the RAG query
result = pipe.run(query="What does RAG mean?")
print(result["answers"][0].answer)這段代碼將一個(gè)文檔寫入內(nèi)存,使用BM25查找相關(guān)文本,然后要求OpenAI模型回答。Haystack的Pipeline負(fù)責(zé)編排流程。有關(guān)更多信息可以查看此處的deepset repository。
3.LlamaIndex
LlamaIndex(前身為GPT Index)是一個(gè)以數(shù)據(jù)為中心的RAG框架,專注于為LLM使用索引和查詢數(shù)據(jù)。你可以將LlamaIndex視為一套用于構(gòu)建文檔自定義索引(向量、關(guān)鍵詞索引、圖像)并查詢它們的工具。LlamaIndex 是一種強(qiáng)大的方式,可以使用索引結(jié)構(gòu)將文本文件、API和SQL等不同數(shù)據(jù)源連接到 LLM。
例如,可以創(chuàng)建所有文件的矢量索引,然后使用內(nèi)置查詢引擎回答任何問題,這一切都可以通過LlamaIndex實(shí)現(xiàn)。LlamaIndex提供了高級(jí)API和低級(jí)模塊,以便自定義RAG流程的每個(gè)部分。
?LlamaIndex是開源的(MIT許可證),擁有不斷壯大的社區(qū)(GitHub Star超過45,000個(gè))。
?數(shù)據(jù)連接器:(用于PDF、文檔、網(wǎng)頁內(nèi)容)、多種索引類型(向量存儲(chǔ)、樹、圖)和能夠高效導(dǎo)航的查詢引擎。
?可以輕松插入LangChain或其他框架。LlamaIndex適用于任何大型語言模型/嵌入(OpenAI、Hugging Face、本地LLM)。
?通過自動(dòng)創(chuàng)建索引,然后從索引中獲取上下文,采用LlamaIndex可以更輕松地構(gòu)建RAG代理。
使用示例
LlamaIndex使得從文檔創(chuàng)建可搜索索引變得非常簡(jiǎn)單。例如,使用核心API:
Python
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# 1. Load documents (all files in the 'data' directory)
documents = SimpleDirectoryReader("./data").load_data()
# 2. Build a vector store index from the docs
index = VectorStoreIndex.from_documents(documents)
# 3. Create a query engine from the index
query_engine = index.as_query_engine()
# 4. Run a query against the index
response = query_engine.query("What does RAG mean?")
print(response)這段代碼將讀取./data目錄中的文件,在內(nèi)存中建立索引,然后查詢?cè)撍饕?/span>LlamaIndex以字符串形式返回答案。有關(guān)更多信息,可以查看Llamindex存儲(chǔ)庫。
4.RAGFlow
RAGFlow是InfiniFlow團(tuán)隊(duì)為企業(yè)設(shè)計(jì)的一款RAG引擎,旨在處理復(fù)雜和大規(guī)模的數(shù)據(jù)。其目標(biāo)是實(shí)現(xiàn)“深度文檔理解”,以便解析PDF、掃描文檔、圖像或表格等不同格式,并將它們總結(jié)成結(jié)構(gòu)化的知識(shí)片段。
RAGFlow具有集成的檢索模型、代理模板和用于調(diào)試的可視化工具,其關(guān)鍵要素包括基于模板的高級(jí)文檔分塊和引用標(biāo)注概念。這有助于減少幻覺,因?yàn)榭梢灾滥男┰次谋局С帜男┐鸢浮?/span>
?RAGFlow是開源的(Apache-2.0許可證),擁有強(qiáng)大的社區(qū)(GitHub Star超過65,000個(gè))。
?亮點(diǎn):深層文檔的解析(例如,分解圖表、圖像和多策略文檔),使用模板規(guī)則(用于管理文檔的自定義規(guī)則)對(duì)文檔進(jìn)行分塊,以及引用以顯示如何記錄出處以回答問題。
?工作流:RAGFlow作為服務(wù)使用,這意味著可以啟動(dòng)一個(gè)服務(wù)器(使用Docker),然后通過用戶界面或API索引文檔。RAGFlow 還提供了用于構(gòu)建聊天機(jī)器人的 CLI 工具和 Python/REST API。
?用例:處理大量文檔的大型企業(yè),以及對(duì)答案可追溯性和準(zhǔn)確性有嚴(yán)格要求的用例。
使用示例
Python
import requests
api_url = "http://localhost:8000/api/v1/chats_openai/default/chat/completions"
api_key = "YOUR_RAGFLOW_API_KEY"
headers = {"Authorization": f"Bearer {api_key}"}
data = {
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "What is RAG?"}],
"stream": False
}
response = requests.post(api_url, headers=headers, jsnotallow=data)
print(response.json()["choices"][0]["message"]["content"])這個(gè)示例演示了RAGFlow的聊天補(bǔ)全API的使用方式,它與OpenAI兼容。它向“默認(rèn)”助理發(fā)送聊天消息時(shí),助手將使用索引文檔作為上下文來生成回復(fù)。
5.txtai
txtai是一個(gè)一體化的人工智能框架,提供語義搜索、嵌入和RAG管道功能。它配備了一個(gè)可嵌入的向量搜索數(shù)據(jù)庫,源自SQLite+FAISS,以及允許編排LLM調(diào)用的實(shí)用程序。使用txtai,一旦使用文本數(shù)據(jù)創(chuàng)建了嵌入索引,就應(yīng)該在代碼中人工將其連接到LLM,或者使用內(nèi)置的RAG輔助工具。
txtai的真正優(yōu)點(diǎn)在于其簡(jiǎn)單性:它可以100%地在本地運(yùn)行(無需云平臺(tái)),它內(nèi)置了RAG 管道模板,甚至提供了自動(dòng)生成的FastAPI服務(wù)。它也是開源的(Apache 2.0),易于原型設(shè)計(jì)和部署。
?開源(Apache-2.0許可證,GitHub Star超過7,000個(gè))的Python包。
?功能:語義搜索索引(向量數(shù)據(jù)庫)、RAG管道和FastAPI服務(wù)生成。
?RAG支持:txtai有一個(gè)RAG類,它接受一個(gè)Embeddings實(shí)例和一個(gè)LLM,它自動(dòng)將檢索到的上下文插入到LLM提示中。
?LLM靈活性:使用OpenAI、Hugging Face轉(zhuǎn)換器、llama.cpp或任何想要的LLM接口模型。
使用示例
以下是使用內(nèi)置管道在txtai中運(yùn)行RAG查詢的簡(jiǎn)單方法:
Python
from txtai import Embeddings, LLM, RAG
# 1. Initialize txtai components
embeddings = Embeddings() # uses a local FAISS+SQLite by default
embeddings.index([{"id": "doc1", "text": "RAG stands for retrieval-augmented generation."}])
llm = LLM("text-davinci-003") # or any model
# 2. Create a RAG pipeline
prompt = "Answer the question using only the context below.\n\nQuestion: {question}\nContext: {context}"
rag = RAG(embeddings, llm, template=prompt)
# 3. Run the RAG query
result = rag("What does RAG mean?", maxlength=512)
print(result["answer"])這段代碼片段選取了一個(gè)文檔并運(yùn)行了RAG管道。RAG助手從向量索引中管理相關(guān)段落的檢索,并填充提示模板中的{context}。它將允許采用良好的結(jié)構(gòu)(包括API和無代碼UI)封裝RAG管道代碼。Cognita確實(shí)在底層使用了LangChain/LlamaIndex模塊,但以結(jié)構(gòu)化的方式組織它們:數(shù)據(jù)加載器、解析器、嵌入器、檢索器和指標(biāo)模塊。有關(guān)更多信息可以查看此處的存儲(chǔ)庫。
6. LLMWare
LLMWare是一個(gè)完整的RAG框架,其核心理念是推崇使用更輕量、更安全、更快速的專用模型進(jìn)行推理。與多數(shù)依賴大型云端LLM的框架不同,LLMWare旨在本地部署,只需在具備必要計(jì)算能力的桌面或服務(wù)器上即可流暢運(yùn)行整套RAG流程。這一設(shè)計(jì)從源頭上限制了數(shù)據(jù)外泄風(fēng)險(xiǎn),使得用戶能夠安全地利用LLM進(jìn)行大規(guī)模試點(diǎn)研究及多樣化應(yīng)用。
LLMWare為常見的RAG功能提供了無代碼向?qū)Ш湍0澹ㄎ臋n解析和索引功能。它還為各種文檔格式(Office和PDF)提供了工具,這些為認(rèn)知人工智能功能進(jìn)行文檔分析奠定了堅(jiān)實(shí)基礎(chǔ)。
?面向企業(yè)RAG的開源產(chǎn)品(Apache-2.0許可證,GitHub Star超過14000個(gè))。
?一種專注于更小的LLM(如Llama 7B變體)的方法,并且推理可以在設(shè)備上運(yùn)行,同時(shí)即使在ARM設(shè)備上也能提供RAG功能。
?工具:提供CLI和REST API、交互式UI以及管道模板。
?顯著的特點(diǎn):預(yù)先配置的管道,內(nèi)置的事實(shí)檢查功能,用于向量搜索和問答的插件功能。
?示例:追求RAG但無法將數(shù)據(jù)發(fā)送到云的企業(yè),例如金融服務(wù)、醫(yī)療保健或移動(dòng)/邊緣人工智能應(yīng)用程序的開發(fā)者。
使用示例
LLMWare的API設(shè)計(jì)易于使用。以下是基于其文檔的簡(jiǎn)單示例:
Python
from llmware.prompts import Prompt
from llmware.models import ModelCatalog
# 1. Load a model for prompting
prompter = Prompt().load_model("llmware/bling-tiny-llama-v0")
# 2. (Optionally) index a document to use as context
prompter.add_source_document("./data", "doc.pdf", query="What is RAG?")
# 3. Run the query with context
response = prompter.prompt_with_source("What is RAG?")
print(response)這段代碼使用了一個(gè)LLMWare Prompt對(duì)象。首先指定一個(gè)模型(例如,來自Hugging Face的小型Llama模型)。然后,添加一個(gè)包含源文檔的文件夾。LLMWare將“doc.pdf”解析為片段,并根據(jù)與用戶問題的相關(guān)性進(jìn)行過濾。然后,prompt_with_source函數(shù)發(fā)出請(qǐng)求,傳遞來自源的相關(guān)上下文。這將返回一個(gè)文本答案和元數(shù)據(jù)響應(yīng)。有關(guān)更多信息,請(qǐng)查看此處的存儲(chǔ)庫。
7.Cognita
Cognita由TrueFoundary開發(fā),是一個(gè)為可擴(kuò)展性和協(xié)作而構(gòu)建的生產(chǎn)就緒RAG框架。它主要致力于簡(jiǎn)化從筆記本或?qū)嶒?yàn)到部署/服務(wù)的過程。它支持增量索引,并具有一個(gè)Web UI,供非開發(fā)人員嘗試上傳文檔、選擇模型和實(shí)時(shí)查詢。
?它是開源的(Apache-2.0許可證)。
?架構(gòu):完全基于API和容器化,可以通過Docker Compose(包括用UI)完全在本地運(yùn)行。
?組件:用于解析器、加載器、嵌入器、檢索器等的可重用庫。所有組件都可以定制和擴(kuò)展。
?UI-可擴(kuò)展性:提供了一個(gè)用于實(shí)驗(yàn)的 Web 前端和一個(gè)用于管理 LLM/嵌入器配置的“模型網(wǎng)關(guān)”。當(dāng)開發(fā)人員和分析師協(xié)作構(gòu)建RAG管道組件時(shí),這非常有用。
使用示例
Cognita主要通過其命令行界面和內(nèi)部 API 訪問,但以下是使用其Python API的概念性偽代碼片段:
Python
from cognita.pipeline import Pipeline
from cognita.schema import Document
# Initialize a new RAG pipeline
pipeline = Pipeline.create("rag")
# Add documents (with text content)
docs = [Document(id="1", text="RAG stands for retrieval-augmented generation.")]
pipeline.index_documents(docs)
# Query the pipeline
result = pipeline.query("What does RAG mean?")
print(result['answer'])在實(shí)際應(yīng)用中,用戶可以使用YAML來配置Cognita框架,或者使用其CLI來加載數(shù)據(jù)并啟動(dòng)服務(wù)。上述代碼片段清晰地展示了核心操作流程:首先創(chuàng)建數(shù)據(jù)處理管道,接著構(gòu)建索引,最后執(zhí)行查詢。Cognita文檔有更多詳細(xì)信息。有關(guān)更多信息,請(qǐng)查看此處的存儲(chǔ)庫。
結(jié)論
這些用于RAG系統(tǒng)的開源GitHub存儲(chǔ)庫為開發(fā)人員、研究人員和業(yè)余愛好者提供了豐富的工具包。
?LangChain和LlamaIndex為構(gòu)建定制管道和索引解決方案提供了靈活的API。
?Haystack提供了經(jīng)過生產(chǎn)環(huán)境測(cè)試的NLP管道,并關(guān)注數(shù)據(jù)攝取的擴(kuò)展性。
?RAGFlow和LLMWare滿足企業(yè)需求,LLMWare在某種程度上更側(cè)重于設(shè)備上的模型和安全性。
?相比之下,txtai提供了一個(gè)輕量級(jí)的、簡(jiǎn)單的、一體化的本地RAG解決方案,而Cognita則通過一個(gè)簡(jiǎn)單的、模塊化的、UI驅(qū)動(dòng)的平臺(tái)來處理一切。
上述所有應(yīng)用于RAG系統(tǒng)的GitHub存儲(chǔ)庫均保持著良好的維護(hù)狀態(tài),并且都提供了可直接運(yùn)行的示例代碼。這些情況充分表明,RAG技術(shù)已經(jīng)超越了學(xué)術(shù)研究的前沿范疇,如今已具備足夠的成熟度,可以供任何有志于構(gòu)建人工智能應(yīng)用的人士直接使用。實(shí)際上,究竟哪一個(gè)是“最佳選擇”,還需根據(jù)用戶的具體需求和優(yōu)先級(jí)來綜合判斷。
原文標(biāo)題:7 Best GitHub Repositories For Mastering RAG Systems,作者:Vipin Vashisth






























