
为你的下一个RAG系统准备的10个有用的LangChain组件
图片来源:编辑 | Midjourney
LangChain 是一个强大的框架,旨在简化开发 LLM(大型语言模型)驱动的应用程序。其多功能组件允许将 LLM 集成到各种工作流程中,包括检索增强生成 (RAG) 系统。RAG 系统将 LLM 与外部文档库相结合,通过从文档库检索最新的相关信息,从而提供更准确、上下文相关且事实正确的响应。
本文概述了 LangChain 中 10 个最受欢迎的构建块,如果您有兴趣使用这个强大的框架构建 RAG 系统,可以考虑使用它们。从数据摄取到检索方法,再到与 LLM 的编排,我们将介绍一些值得关注的关键组件。
1. 文档加载器
文档加载器是 LangChain 用于从 TXT 或 PDF 文件、网页或 CSV 文件等各种来源摄取数据的组件。它们还支持连接器,通过 API 从存储系统或数据库加载文件。文档加载器的具体示例包括PyPDFLoader、UnstructuredFileLoader 和WebBaseLoader。
2. 文本分割器
文本分割器负责将大型文本分解成更易于管理的部分,通常称为块 (chunks),以便在加载文档后进行高效处理和快速索引。LangChain 的文本分割器支持自定义块大小,甚至支持块之间的重叠,以避免上下文丢失。常见的文本分割器类型包括RecursiveCharacterTextSplitter 和TokenTextSplitter。
3. 嵌入
嵌入是一种将文本数值化编码的同时保留其语义属性的有效方法,通常通过密集向量表示来实现。在 RAG 系统中,嵌入是执行基于相似度的搜索的基石:彼此靠近的嵌入向量应表示相似的文本。LangChain 支持通过其 API 与 OpenAI 模型等常用嵌入模型集成,并通过 Hugging Face 实现句嵌入。对应的类是OpenAIEmbeddings和HuggingFaceEmbeddings。
4. 向量存储
向量存储是用于在基于相似度的搜索过程中存储和检索嵌入的组件。LangChain 提供了一些特定的组件来管理向量数据库,例如Pinecone、Chroma 和FAISS。
5. 检索器
检索器是 RAG 系统的核心组件,负责在向量存储中搜索并检索与输入查询最相关的块嵌入。在 LangChain 中,它们可以针对混合检索方法进行调整,例如结合稀疏和密集搜索。用于实现 LangChain 检索器的示例组件包括SimilarityRetriever 和HybridRetriever。
6. LLM 包装器
LLM 包装器是 RAG 系统与 LLM 的接口,专注于文本生成。通过 API,它可以调用广泛的模型,如 OpenAI 的 GPT 模型、Anthropic 的 Claude 模型,以及 Hugging Face 的本地预训练模型(类HuggingFaceHub)。
7. 链
链是 LangChain 整体的关键要素,链是一个将多个 NLP 组件组合在一起的工作流程。我们稍后将看到的示例是问答链,它可以将检索器与 LLM 连接起来,以基于检索到的知识生成答案。LangChain 提供了各种类来支持针对不同场景的特定类型链,例如RetrievalQA 和ConversationalRetrievalChain。
8. 内存管理
内存管理组件有助于跨交互控制对话的状态和上下文,在基于聊天的 RAG 系统中是必不可少的。它们通过ConversationBufferMemory 和VectorStoreMemory 等抽象进行控制。
9. 交互工具与代理
交互工具和代理是这些高级组件,使 RAG 系统中的 LLM 能够与外部系统进行交互,以基于代理来处理更具挑战性的任务,代理会动态地为每个特定问题选择最合适的工具。Tool 和ZeroShotAgent 类用于此目的。
10. 评估
LangChain 中的评估是指评估 RAG 管道的性能,而QA Eval Chain 等 LangChain 组件允许迭代地调整检索和生成机制及其基准测试。
示例:将它们(几乎)全部整合起来
为了在 Python 代码中进行简单的演示,下面是一个非常简化的问答 RAG 工作流程的完整示例,它整合了一些我们讨论过的 LangChain 组件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import FAISS from langchain.chains import RetrievalQA from langchain.llms import OpenAI # 1. 加载示例文档 loader = TextLoader("sample.txt") documents = loader.load() # 2. 将文档分割成块 text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) chunks = text_splitter.split_documents(documents) # 3. 将块转换为向量嵌入并存储 embeddings = OpenAIEmbeddings() vector_store = FAISS.from_documents(chunks, embeddings) # 4. 初始化检索器 retriever = vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 3}) # 5. 构建检索增强型 QA 链 llm = OpenAI(model="gpt-3.5-turbo") qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever, return_source_documents=True) # 6. 提问 query = "文档中的要点是什么?" result = qa_chain.run(query) # 7. 显示结果 print("答案:", result["result"]) print("来源:", [doc.metadata["source"] for doc in result["source_documents"]]) |
为确保代码顺利执行,有几个重要方面需要注意
- 如果您在笔记本电脑上运行,需要先安装 LangChain 的社区版,方法是运行:
!pip install -U langchain-community
- 您需要准备一个自己的示例文档 .txt 文件
- 您还需要 OpenAI API 密钥才能使用OpenAIEmbeddings等类
总结
本文介绍了 LangChain 广泛而强大的框架中的 10 种必需组件类型,这些组件在构建有效的 RAG 系统时值得考虑,涵盖了知识检索、文本嵌入、与 LLM 和外部系统的交互等元素和流程。通过一个示例,我们说明了如何将其中一些组件组合起来,定义一个简化的基于 RAG 的问答工作流程。
这太令人兴奋了!迫不及待地想看到这些家伙扩展起来!!!
我认为如果代码更新到 Langchain 的更新版本会很有用。
这些是否也适用于 LangChain4J?
你好 Rahul……我们还没有研究过。您是否正在处理某个特定问题,这可以帮助我们更好地理解您需要什么帮助?