从0开始搭建AI Agent(六)
LangChain RAG(检索增强生成)的核心作用是将外部知识库与大语言模型(LLM)结合,解决传统大模型在知识时效性、领域专业性和事实准确性上的短板(即“幻觉”问题)。
具体来说,LangChain RAG 的作用与优势体现在以下几个方面:
1. 提升回答的准确性与时效性
-
动态接入最新数据:传统大模型的知识停留在训练阶段,而 RAG 可以在生成回答前,先从外部知识库中检索最新的文档片段(如实时新闻、行业报告),确保信息的时效性。
-
消除“幻觉”:通过让大模型基于检索到的真实文档生成回答,有效避免了模型凭空捏造事实,提升了回答的可靠性。
2. 增强领域适配与可解释性
-
私有/专业知识问答:支持接入企业内部文档,在法律咨询、医疗诊断、企业知识库等垂直领域提供高度专业的解答。
-
结果可追溯:RAG 在生成答案的同时,能够提供作为依据的原始文档片段,增强了结果的可信度和可解释性。
工作原理
RAG的核心思想是在LLM回答用户问题之前,先进行一次信息检索,主要分为以下几个步骤:
1.用户查询
2.知识库
3.检索
4.增加提示词
5.生成
搭建流程
RAG系统搭建流程
1.收集数据
2.数据分块
3.选择文本嵌入模型
4.初始化向量数据库
5.存储向量
6.整合大语言模型
示例1
我们先用之前文本嵌入模型的TXT文档做检索:
加载大模型
key = '你自己的API Key'
from langchain_community.chat_models import ChatZhipuAI
import os
os.environ["ZHIPUAI_API_KEY"] = key
chat = ChatZhipuAI(
model="glm-4",
temperature=0.5, #模型温度(0-1之间,值越小,随机性越低,随机性即模型的发散思维)
)
收集数据
from langchain_community.document_loaders import TextLoader
loader = TextLoader('./公司考勤.txt', encoding='utf-8')
documents = loader.load()
数据分块
from langchain.text_splitter import RecursiveCharacterTextSplitter
#中文分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=50, #适合中文段落的段落大小
chunk_overlap=0, #上下误差 避免上下文缺失
separators=["\n\n", "\n", " ", ",","。"]
)
splits = text_splitter.split_documents(documents)
选择文本嵌入模型
from langchain_huggingface import HuggingFaceEmbeddings
#加载本地模型
embeddings = HuggingFaceEmbeddings(
model_name='bge-small-zh-v1.5',
model_kwargs={'device': 'cpu'},
encode_kwargs={'normalize_embeddings': False} #提升相似度计算精度
)
持久化
from langchain_community.vectorstores import Chroma
db = Chroma.from_documents(
documents=splits,
embedding=embeddings,
persist_directory="./chroma_db"
)
测试调用
from langchain.chains.retrieval_qa.base import RetrievalQA
#创建RAG链
qa_chain = RetrievalQA.from_chain_type(
llm = chat,
retriever = db.as_retriever(search_kwargs={"k": 1}),
return_source_documents=True
)
query = "迟到处罚?"
result = qa_chain({'query': query})
print('答案:', result['result'])
print('相关文档:', result['source_documents'][0].page_content)
可以看到,前面5步的代码,都已经是之前章节写过的,只是最后一步,查询的时候利用大模型的RAG,得到的结果就比之前文本嵌入章节的查询结果更准确。
加载pdf
真实应用中,我们往往会加载pdf文档(比如公司的规范手册、一些行业手册等),下面例子我将会加载一个公司员工手册,然后用RAG来做一个简单的员工问题查询系统;
先安装一个读取pdf的包,这种包有很多,选择一个适合自己的就行;
pip install pymupdf
相关代码:
import fitz
def extractTextPdf(pdf,start=1,end = None):
'''
Extract text from PDF file
Args:
pdf (str): Path to PDF file
start (int): Page number to start extraction
end (int): Page number to end extraction
Returns:
str: Extracted text
'''
text = ''
pageNumbers=[]
for pn,page in enumerate(pdf):
if pn < start:#不要第一页(我的第一页是空白的)
continue
if end is not None and pn == end:
break
#读数据
curText = page.get_text("text")
if curText:
text += curText
pageNumbers.extend([pn]*len(curText.split('\n')))#添加每段数据页码
return text,pageNumbers
pdf = fitz.open('./xxxx.pdf')
text,pageNumbers = extractTextPdf(pdf)
# print(text)
# print(pageNumbers)
pdf.close()
然后其它的调用方式就和“示例1”相同了,也是将数据分块、持久化,只是数据分块时候,split_documents需要传入的是Document对象,所以我们需要把读取出来的pdf的str数据,转换为Document对象,方法如下:
from langchain.docstore.document import Document
documents = [Document(page_content=text,metadata={"source": "xxxx.pdf"})]
ok,AI Agent就先到这里,后续再补充......
更多推荐


所有评论(0)