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就先到这里,后续再补充......

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐