思维导图
📚 引言
大型语言模型(如ChatGPT)虽然功能强大,但它们存在一些明显的局限性。这些模型的知识库更新较慢,无法实时学习最新内容,而且对私有数据或特定领域的专业知识了解有限。例如,ChatGPT的知识截止到特定时间点,无法感知用户本地电脑或内网中的数据。这就是为什么当我们询问非常具体或专业的内容时,它的回答可能显得泛泛而谈。
那么,如何让大模型变得更"聪明",能够获取最新知识并回答更专业的问题呢?这就是本文要介绍的RAG(检索增强生成)技术。
🔍 RAG技术概述
什么是RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合检索和生成两种技术的方法,旨在帮助计算机更好地理解和回答问题。简单来说,它让AI模型能够在回答问题前先"查阅资料",从而提供更准确、更专业的回答。
RAG的基本流程
RAG技术的典型流程包括:
- 加载数据(Loader):从各种来源加载文档数据
- 处理文档(Transform):对文档进行切割、整理等处理
- 向量化(Embedding):将文本转换为向量表示
- 存储(Store):将向量数据存储在向量数据库中
- 检索(Retrieve):根据问题检索相关文档片段
- 生成回答(Generate):基于检索结果生成答案
🔧 LangChain中的RAG实现
Loader:让大模型具备实时学习的能力
LangChain包装了各种Loader,使大模型能够加载各种格式的文档:
- CSV Loader:加载表格数据
- Directory Loader:加载整个目录的文件
- HTML Loader:加载网页内容
- JSON Loader:加载JSON格式数据
- Markdown Loader:加载Markdown文档
- PDF Loader:加载PDF文件
除此之外,LangChain还支持超过100种不同的数据源接口,包括B站、YouTube、GitHub等平台的数据。
# 加载Markdown文件示例
from langchain.document_loaders import UnstructuredMarkdownLoader
loader = UnstructuredMarkdownLoader("path/to/file.md")
data = loader.load()
# 加载CSV文件示例
from langchain.document_loaders import CSVLoader
loader = CSVLoader("path/to/file.csv")
data = loader.load()
# 加载目录中的文件
from langchain.document_loaders import DirectoryLoader
loader = DirectoryLoader("path/to/directory", glob="**/*.pdf")
data = loader.load()
文档转换:切割、总结和翻译
加载文档后,通常需要对其进行处理,以便更好地利用文档内容:
文档切割
文档切割的目的是:
- 降低成本,适应大模型的上下文窗口限制
- 将文档转换为结构化数据,便于查询
LangChain提供了多种切割器:
# 字符串分割
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(
separator="\n\n",
chunk_size=1000,
chunk_overlap=200,
length_function=len
)
docs = text_splitter.split_documents(documents)
# 按代码分割
from langchain.text_splitter import RecursiveCharacterTextSplitter
python_splitter = RecursiveCharacterTextSplitter.from_language(
language="python",
chunk_size=1000,
chunk_overlap=200
)
文档总结、精炼和翻译
LangChain还提供了文档总结、精炼和翻译的功能:
# 文档总结
from langchain.chains.summarize import load_summarize_chain
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(temperature=0)
chain = load_summarize_chain(llm, chain_type="map_reduce")
summary = chain.run(docs)
# 文档翻译
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
template = """Translate the following text from {source_language} to {target_language}:
{text}"""
prompt = PromptTemplate(
input_variables=["source_language", "target_language", "text"],
template=template
)
chain = LLMChain(llm=llm, prompt=prompt)
translated = chain.run(source_language="English", target_language="C