在过去几年中,检索增强生成 (RAG)的生态系统已经蓬勃发展。互联网上出现了越来越多旨在帮助开发者构建RAG应用的开源项目。这也是情理之中的事,因为RAG是一种用外部知识源来增强大型语言模型 (LLMs)的有效方法。
RAG****管道 (pipelines)的运作方式如下:
- 系统检索文档或数据;
- 这些数据对完成用户提示的上下文具有信息价值或实用性;
- 系统将该上下文输入到LLM中,以生成准确且基于该上下文的知识性回复。
如前所述,我们将探索不同的开源RAG框架及其GitHub仓库,这些框架使用户能够轻松构建RAG系统。我们的目标是帮助开发者、学生和技术爱好者选择一个符合其需求的RAG工具包并加以利用。
为什么需要 RAG 系统
检索增强生成 (Retrieval-Augmented Generation)已迅速成为AI领域最具影响力的创新之一。随着企业越来越重视实施具有上下文感知能力的智能系统,掌握RAG不再是可选项。
公司正在利用RAG管道来构建聊天机器人 (chatbots)、知识助手 (knowledge assistants)和企业自动化 (enterprise automation)系统。这是为了确保其AI模型利用的是实时、特定领域的数据,而不是仅仅依赖预训练的知识。
在这个RAG被用于自动化智能聊天机器人、助手和企业工具的时代,彻底理解它能为你带来巨大的竞争优势。掌握如何构建和优化RAG管道,可以为你在AI开发、数据工程 (data engineering)和自动化领域打开无数扇大门。这最终将使你更具市场竞争力,并为你的职业生涯面向未来做好准备。
在追求这一精通目标的过程中,以下是用于RAG系统的顶级GitHub仓库。但在此之前,我们先了解一下这些RAG框架究竟有何帮助。
RAG 框架的作用是什么?
检索增强生成 (RAG)框架是一种先进的AI架构,旨在通过将外部信息整合到回复生成过程中,来提升LLMs的能力。这使得LLM的回复比其初始训练数据更具信息量或更具时效性。
该模型可以从外部数据库或知识库(APIs)中检索相关文档或数据。然后,它可以使用这些信息来生成基于用户查询的回复,而不是仅仅依赖于原始训练模型中的数据。
这使得模型能够处理问题并给出既正确又对时间或上下文敏感的答案。同时,它们还可以缓解与知识截断 (knowledge cut-off) 和幻觉 (hallucination) (即对提示给出不正确回复) 相关的问题。通过连接到通用和领域特定的知识源,RAG使AI系统能够提供负责任、值得信赖的回复。
RAG的应用跨越了各种用例,例如客户支持、搜索、合规性、数据分析等等。RAG系统也消除了频繁重新训练模型或试图通过训练模型来服务于单个用户回复的必要性。
RAG 系统仓库
现在我们了解了RAG系统如何提供帮助,接下来让我们探索提供详细教程、代码和资源的顶级GitHub仓库,以助你掌握RAG系统。这些GitHub仓库将帮助你精通使用RAG系统所需的工具、技能、框架和理论。
1. LangChain
LangChain是一个完整的LLM工具包,使开发者能够创建具有提示、记忆、智能体和数据连接器等功能的复杂应用。从加载文档到文本分割、嵌入和检索,再到生成输出,LangChain为RAG管道的每一步都提供了模块。
★ https://github.com/langchain-ai
LangChain拥有丰富的生态系统,集成了OpenAI、Hugging Face、Azure等众多提供商。它还支持多种语言,包括Python、JavaScript和TypeScript。LangChain采用分步流程设计,允许你混合搭配工具、构建智能体工作流,并使用内置的链 (chains)。
LangChain的核心功能集包括一个工具链系统、丰富的提示模板,以及对智能体 (agents)和记忆 (memory)的一流支持。
- LangChain是开源的 (MIT license) 且拥有庞大的社区 (70K+ GitHub stars)。
- 组件:提示模板、LLM封装器 (wrappers)、向量存储连接器 (vectorstore connectors)、智能体 (工具 + 推理)、记忆等。
- 集成:LangChain支持许多LLM提供商 (OpenAI、Azure、本地LLMs)、嵌入模型和向量存储 (FAISS、Pinecone、Chroma等)。
- 用例:定制聊天机器人、文档问答 (document QA)、多步工作流、RAG和智能体任务 (agentic tasks)。
使用示例
LangChain的高级APIs使简单的RAG管道非常简洁。例如,这里我们使用LangChain和OpenAI的嵌入及LLM来回答一个关于一小组文档的问题:
from langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import FAISSfrom langchain.llms import OpenAIfrom langchain.chains import RetrievalQA# Sample documents to indexdocs = ["RAG stands for retrieval-augmented generation.", "It combines search and LLMs for better answers."]# 1. Create embeddings and vector storevectorstore = 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 queryresult = qa({"query": "What does RAG mean?"})print(result["result"])此代码获取docs并使用OpenAI嵌入将其加载到FAISS向量存储中。然后,它使用RetrievalQA提取相关上下文并生成答案。LangChain抽象了检索和LLM调用。
2. Haystack by deepset-ai
Haystack,由deepset开发,是一个专为企业设计的RAG框架,围绕可组合的管道 (composable pipelines)构建。其核心思想是构建一个类似图的管道,在其中你将检索器、阅读器和生成器等节点 (nodes)连接成一个有向图。Haystack专为在生产环境 (prod) 中部署而设计,并为文档存储和检索提供了多种后端选择,如Elasticsearch、OpenSearch、Milvus、Qdrant等。
它同时提供基于关键词 (BM25)和密集检索 (dense retrieval),并且很容易接入开源阅读器 (Transformers QA models) 或生成式答案生成器。
- 它是开源的 (Apache 2.0) 且非常成熟 (10K+ stars)。
- 架构:以管道为中心且模块化。节点可以精确地插入和替换。
- 组件包括:文档存储 (Elasticsearch、In-Memory等)、检索器 (BM25、Dense)、阅读器 (e.g., Hugging Face QA models),以及生成器 (OpenAI、本地LLMs)。
- 易于扩展:分布式设置 (Elasticsearch clusters)、GPU支持、REST APIs和Docker。
- 可能的用例包括:用于搜索的RAG、文档问答、回顾应用和监控用户查询。
使用示例
以下是一个使用Haystack现代API**(v2)** 创建小型RAG管道的简化示例:
from haystack.document_stores import InMemoryDocumentStorefrom haystack.nodes import BM25Retriever, OpenAIAnswerGeneratorfrom haystack.pipelines import Pipeline# 1. Prepare a document storedoc_store = InMemoryDocumentStore()documents = [{"content": "RAG stands for retrieval-augmented generation."}]doc_store.write_documents(documents)# 2. Set up retriever and generatorretriever = BM25Retriever(document_store=doc_store)generator = OpenAIAnswerGenerator(model_name="text-davinci-003")# 3. Build the pipelinepipe = Pipeline()pipe.add_node(component=retriever, name="Retriever", inputs=["Query"]) # 修正了原文的 inputs=[]pipe.add_node(component=generator, name="Generator", inputs=["Retriever"])# 4. Run the RAG queryresult = pipe.run(query="What does RAG mean?")print(result["answers"][0].answer)此代码将一个文档写入内存存储,使用BM25查找相关文本,然后要求OpenAI模型回答。Haystack的Pipeline负责协调整个流程。
★ https://github.com/deepset-ai/haystack
3. LlamaIndex
LlamaIndex,前身为GPT Index,是一个以数据为中心的RAG框架,专注于索引 (indexing)和查询 (querying)你的数据以供LLM使用。可以将LlamaIndex视为一套工具,用于在你提供的文档(向量、关键词索引、图)上构建自定义索引,然后对它们进行查询。LlamaIndex是一种强大的方式,它利用索引结构将文本文件、APIs和SQL等不同数据源连接到LLMs。
例如,你可以为你所有的文件创建一个向量索引,然后使用内置的查询引擎来回答你可能有的任何问题,所有这些都通过LlamaIndex实现。LlamaIndex提供高级APIs和低级模块,能够自定义RAG过程的每个部分。
- LlamaIndex是开源的 (MIT License) 且拥有不断增长的社区 (45K+ stars)。
- 数据连接器:(用于PDFs、文档、网络内容),多种索引类型 (vector store、tree、graph),以及一个支持高效导航的查询引擎。
- 互操作性:只需将其插入LangChain或其他框架即可。LlamaIndex可与任何LLM/Embedding**(OpenAI**、Hugging Face、本地LLMs)配合使用。
- 简化 Agent 构建:LlamaIndex通过自动创建索引并从索引中获取上下文,让你更容易构建自己的RAG agents。
使用示例
LlamaIndex使从文档创建可搜索索引变得非常容易。例如,使用其核心API:
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 docsindex = VectorStoreIndex.from_documents(documents)# 3. Create a query engine from the indexquery_engine = index.as_query_engine()# 4. Run a query against the indexresponse = query_engine.query("What does RAG mean?")print(response)此代码将读取./data目录中的文件,在内存中对其进行索引,然后查询该索引。LlamaIndex以字符串形式返回答案。
★ https://github.com/run-llama
4. RAGFlow
RAGFlow是由InfiniFlow设计的RAG引擎,旨在应对复杂和大规模的企业数据。它致力于实现“深度文档理解”的目标,以解析PDFs、扫描文档、图像或表格等不同格式,并将其总结成有组织的块 (chunks)。
RAGFlow具有集成的检索模型,以及用于调试的智能体模板和可视化工具。其关键元素是针对文档的高级模板化分块 (chunking),以及可追溯的引用 (grounded citations)概念。这有助于减少幻觉,因为你可以知道哪些来源文本支持哪个答案。
- RAGFlow是基于(Apache-2.0)开源的 ,拥有强大的社区。
- 亮点:深度文档解析 (deep documents) (即分解表格、图像和多政策文档)、具有模板规则的文档分块 (用于管理文档的自定义规则),以及引用 (显示文档出处以回答问题)。
- 工作流:RAGFlow作为服务使用,这意味着你需要启动一个服务器(使用 Docker),然后通过UI或API索引你的文档。RAGFlow还具有CLI工具和Python/REST APIs用于构建聊天机器人。
- 用例:处理大量文档的大型企业,以及要求代码级可追溯性和准确性的用例。
使用示例
此示例演示了RAGFlow的聊天完成API,该API与OpenAI兼容。它向“default”助手发送一条聊天消息,该助手将使用已索引的文档作为上下文。
import requestsapi_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, json=data)print(response.json()["choices"][0]["message"]["content"])★ https://github.com/infiniflow/ragflow
5. txtai
txtai是一个一体化 (all-in-one)的AI框架,提供语义搜索 (semantic search)、嵌入和RAG管道。它附带一个可嵌入的、可向量搜索的数据库 (源自 SQLite + FAISS),以及允许你编排LLM调用的实用工具。使用txtai,一旦你使用文本数据创建了Embedding index,你可以手动将其与代码中的LLM连接,或使用内置的RAG助手。
我非常喜欢txtai的简单性:它可以100% 本地运行 (无需云),它内置了RAG管道的模板,甚至提供了自动生成的 FastAPI 服务。它也是基于(Apache 2.0)开源的 ,易于原型设计和部署。
- 开源的 **(Apache-2.0, 7K+ stars)**Python包。
- 能力:语义搜索索引 (vector DB)、RAG管道和FastAPI service generation。
- RAG****支持:txtai有一个RAG类,它接受一个Embeddings实例和一个LLM,自动将检索到的上下文粘合到LLM提示中。
- LLM****灵活性:可以使用OpenAI、Hugging Face transformers、llama.cpp或任何带有你自己的LLM接口的模型。
★ https://github.com/neuml/txtai
使用示例
以下是使用内置管道在txtai中运行RAG查询的简单示例:
from txtai import Embeddings, LLM, RAG# 1. Initialize txtai componentsembeddings = Embeddings() # uses a local FAISS+SQLite by defaultembeddings.index([{"id": "doc1", "text": "RAG stands for retrieval-augmented generation."}])llm = LLM("text-davinci-003") # or any model# 2. Create a RAG pipelineprompt = "Answer the question using only the context below.\n\nQuestion: {question}\nContext: {context}"rag = RAG(embeddings, llm, template=prompt)# 3. Run the RAG queryresult = rag("What does RAG mean?", maxlength=512)print(result["answer"])此代码片段接受单个文档并运行RAG管道。RAG助手管理从向量索引中检索相关段落,并填充提示模板中的{context}。它将允许你用良好的结构层、APIs和无代码UI来封装你的RAG管道代码。
6. LLMWare
LLMWare是一个完整的RAG框架,它强烈倾向于更小、更安全、更快速的专业模型推理。大多数框架使用大型云LLM。LLMWare可以在桌面或本地服务器上以必要的计算能力运行桌面RAG管道。它限制了数据暴露的风险,同时仍利用安全的LLMs进行大规模试点研究和各种应用。
LLMWare提供了用于常见RAG功能的无代码向导和模板,包括文档解析和索引功能。它还提供用于各种文档格式 (Office和PDF) 的工具,这些都是认知AI功能进行文档分析的有用第一步。
- 针对企业RAG的开源产品。
- 专注点:一种专注于“更小”LLMs**(例如:Llama 7B** 变体) 的方法,推理在设备上运行,同时即使在ARM设备上也提供RAG功能。
- 工具:提供CLI和REST APIs、交互式UIs和管道模板。
- 独特特性:预配置的管道、内置的事实核查功能,以及用于向量搜索和问答的插件功能。
- 示例:寻求RAG但不能将数据发送到云端的企业,例如金融服务、医疗保健或移动/边缘 AI应用的构建者。
使用示例
LLMWare的API设计得很简单。以下是基于其文档的基本示例:
from llmware.prompts import Promptfrom llmware.models import ModelCatalog# 1. Load a model for promptingprompter = Prompt().load_model("llmware/bling-tiny-llama-v0") # 2. (Optionally) index a document to use as contextprompter.add_source_document("./data", "doc.pdf", query="What is RAG?")# 3. Run the query with contextresponse = prompter.prompt_with_source("What is RAG?")print(response)此代码使用一个LLMWare Prompt对象。我们首先指定一个模型 (例如,来自Hugging Face的一个小型Llama模型)。然后,我们添加一个包含源文档的文件夹。LLMWare将“doc.pdf”解析成块,并根据与用户问题的相关性进行过滤。prompt_with_source函数随后发出请求,传递来自源的相关上下文。这会返回一个文本答案和元数据响应。
★ https://github.com/llmware-ai/llmware
7. Cognita
CognitabyTrueFoundary是一个为可扩展性和协作而构建的、可用于生产的RAG框架。它主要关注如何轻松地从笔记本或实验过渡到部署/服务。它支持增量索引 (incremental indexing),并提供一个Web UI,供非开发者尝试上传文档、选择模型并实时查询。
- 基于Apache-2.0开源协议。
- 架构:完全基于API和容器化 (containerized),可以通过Docker Compose**(包括 UI)** 在本地完全运行。
- 组件:用于解析器、加载器、嵌入器、检索器等的可重用库。一切都可以定制和扩展。
- UI - 扩展性:提供了一个Web frontend用于实验,以及一个“model gateway”来管理LLM/embedder配置。这有助于开发者和分析师共同构建RAG管道组件。
使用示例
Cognita主要通过其命令行接口和内部API进行访问,但这是一个使用其Python API的概念性伪代码片段:
from cognita.pipeline import Pipelinefrom cognita.schema import Document# Initialize a new RAG pipelinepipeline = 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 pipelineresult = pipeline.query("What does RAG mean?")print(result['answer'])在实际实现中,你会使用YAML来配置Cognita或使用其CLI来加载数据并启动服务。前面的片段描述了流程:你创建一个管道,索引你的数据,然后提出问题。Cognita文档有更多细节。
总结
这些用于RAG系统的开源GitHub仓库为开发者、研究人员和爱好者提供了广泛的工具包。
- LangChain和LlamaIndex提供了灵活的APIs,用于构建定制的管道和索引解决方案。
- Haystack提供了经过生产环境测试的NLP管道,具有数据摄取方面的可扩展性。
- RAGFlow和LLMWare解决了企业需求,其中LLMWare偏向于设备上模型和安全性。
- 相比之下,txtai提供了一个轻量级、简单、一体化的本地RAG解决方案,而Cognita则通过一个简单、模块化、UI驱动的平台来解决一切问题。
所有这些RAG系统的GitHub仓库都得到了维护,并附带了示例,帮助你轻松运行。它们共同表明,RAG不再是学术研究的前沿,而是可供所有想要构建AI应用的人使用的。实际上,“最佳选择”取决于你的需求和优先事项。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。