在大语言模型(LLM)推动下,构建复杂的问题解答(Q&A)聊天机器人成为可能。这些应用程序能够回答关于特定信息源的问题,我们使用一种称为检索增强生成(RAG)的技术来实现这一目标。本教程将展示如何在文本数据源上建立一个简单的Q&A应用程序。我们将探讨典型的Q&A架构,并突显更高级Q&A技术的额外资源,同时展示LangSmith如何帮助我们追踪和理解应用。在应用复杂度增加时,LangSmith将变得愈加有用。
技术背景介绍
大型语言模型(LLMs)虽然能在广泛主题上进行推理,但它们的知识仅限于训练时的公共数据。如果希望构建能对私有数据或模型的截止日期之后引入的数据进行推理的AI应用,我们需要将模型的知识与特定信息相结合。这一过程被称为检索增强生成(RAG)。
核心原理解析
一个典型的RAG应用由两个主要组件构成:
- 索引:一个从源中获取数据并进行索引的管道,通常离线进行。
- 检索与生成:在运行时,RAG链接收用户查询,从索引中检索相关数据,然后将其传给模型生成答案。
代码实现演示
让我们通过代码实现上述流程来构建我们的Q&A应用。
安装依赖
首先,在你的Python环境中安装所需的依赖:
pip install langchain langchain_chroma langchain_community
索引阶段
加载数据
使用WebBaseLoader
从网页获取数据:
import bs4
from langchain_community.document_loaders import WebBaseLoader
# 只保留帖子标题、头和内容
bs4_strainer = bs4.SoupStrainer(class_=("post-title", "post-header", "post-content"))
loader = WebBaseLoader(
web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
bs_kwargs={"parse_only": bs4_strainer},
)
docs = loader.load()
文本分割
使用RecursiveCharacterTextSplitter
分割文档:
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
存储嵌入
使用Chroma
向量存储进行存储:
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
检索和生成阶段
检索数据
从向量存储中检索相关文档:
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 3})
生成答案
构建RAG链并生成答案:
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
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": lambda x: x}
| ChatOpenAI(model="gpt-4o-mini")
| StrOutputParser()
)
answer = rag_chain.invoke("What is Task Decomposition?")
print(answer)
应用场景分析
RAG技术在需要对特定领域数据进行精确查询的应用中尤为有效,例如企业内部知识库、医学文献档案及法律条款查询等场景。
实践建议
- 灵活调整分块策略:根据具体应用需要调整文本分块大小及重叠度。
- 优化检索策略:在检索过程中应根据应用特点调整检索策略,以平衡效率和准确性。
- 使用LangSmith调试:使用LangSmith工具来跟踪和调试应用管道,有助于提高应用的鲁棒性。
如果遇到问题欢迎在评论区交流。
—END—