在大模型落地过程中,**"知识过时"和"幻觉输出"**是两大核心痛点。根据2023年斯坦福大学AI指数报告显示,主流大型语言模型如GPT-4的知识截止日期普遍停留在2021年9月至2022年12月之间,这意味着它们无法获取最新的科研进展、时事新闻或政策法规。更严重的是,MIT的研究表明,在开放域问答场景下,约15%-20%的模型输出存在不同程度的"幻觉"问题(即模型自信地生成错误信息),这在医疗诊断、法律咨询等专业领域可能造成严重后果。

而检索增强生成(Retrieval-Augmented Generation,RAG)正是破解这两个问题的关键技术方案。其核心原理是通过实时检索外部知识库(如维基百科、专业数据库或企业文档系统),将最新、最相关的信息注入到生成过程中。以医疗场景为例,当医生询问"2023年最新版NCCN肺癌诊疗指南的更新要点"时,RAG系统会先检索权威医学数据库获取最新指南,再基于这些准确信息生成回答,既解决了知识过时问题,又大幅降低了产生幻觉的概率。

一、什么是 RAG?核心原理与流程

RAG(Retrieval-Augmented Generation)的核心机制是 "让大模型带着'知识库'回答问题"。其本质是通过两个关键阶段的协同工作:

  1. 检索阶段

    • 当用户提出问题后,系统会先从外部知识库(如文档数据库、维基百科等)检索相关段落
    • 使用语义相似度计算(如余弦相似度)匹配问题与知识库内容
    • 典型检索方法包括:密集检索(Dense Retrieval)、稀疏检索(Sparse Retrieval)等
  2. 生成阶段

    • 将检索到的相关文本作为上下文,与用户问题一起输入大语言模型
    • 模型基于这些"证据"生成更准确的回答
    • 通过注意力机制重点处理检索到的相关内容

这种架构的优势在于:

  • 无需重新训练模型即可扩展知识范围
  • 通过引用最新数据保证回答时效性(如将知识库更新到2023年)
  • 提供回答可解释性(可展示引用来源)
  • 特别适合需要精确事实回答的场景(如医疗咨询、法律咨询)

典型应用场景包括:

  • 企业知识库问答系统
  • 学术文献检索助手
  • 实时信息查询(如结合新闻数据库)
  • 专业领域咨询(如法律、医疗)

与传统微调方法相比,RAG在知识更新成本和回答准确性之间取得了更好的平衡。

RAG(Retrieval-Augmented Generation)核心流程详解(4 步闭环)

  1. 文档预处理阶段

    • 文档切分(Chunking):
      • 采用滑动窗口技术或语义分割算法(如NLTK/Spacy),将原始文档(PDF/HTML/Markdown等)切分为200-500字的语义连贯片段
      • 示例:技术文档可按章节切分,新闻文章按段落切分,保留标题层级关系
      • 关键参数:chunk_size(512 tokens)、chunk_overlap(20%)
  2. 向量化存储阶段

    • 嵌入模型选择:
      • 常用模型:OpenAI text-embedding-ada-002、BERT、Sentence-BERT
      • 向量维度:通常768-1536维(如Ada-002为1536维)
    • 向量数据库:
      • 主流选择:Pinecone、Milvus、Weaviate、FAISS
      • 索引类型:HNSW(高效近邻搜索)、IVF(倒排文件)
      • 存储优化:支持增量更新,处理百万级向量时查询延迟<100ms
  3. 智能检索阶段

    • 混合检索策略:
      • 语义搜索:计算余弦相似度(问题向量 vs 文档向量)
      • 可结合BM25等传统检索算法提升准确率
      • 高级功能:支持元数据过滤(如时间范围、文档来源)
    • 结果精炼:
      • Top-k设置(通常k=3-5)
      • 重排序(Rerank)模型优化结果
  4. 生成增强阶段

    • 提示工程:
      • 模板示例:"基于以下背景知识:{context},请回答:{question}"
      • 可加入指令:"若信息不足请明确说明"
    • 大模型选择:
      • 推荐:GPT-4、Claude 2、Llama 2-70b
      • 参数设置:temperature=0.3(平衡创造性/准确性)
    • 结果验证:
      • 引用溯源:标注回答对应的文档片段
      • 置信度评分:对生成内容进行事实性校验

典型应用场景:

  • 企业知识库问答(如产品文档查询)
  • 法律条文检索系统
  • 学术文献综述辅助
  • 客户服务自动化(FAQ增强)

优化方向:

  • 动态chunk大小调整
  • 多模态扩展(图像/表格向量化)
  • 反馈学习机制(点击率优化检索)

二、主流 RAG 框架对比:怎么选? 不同场景需要适配不同的 RAG 架构,以下是 3 种高频方案的详细对比分析:

1. LangChain

核心特点

  • 模块化设计,提供超过200个可插拔组件
  • 支持多工具链组合(如结合搜索引擎+向量数据库)
  • 内置OpenAI、Anthropic等主流API对接
  • 可视化流程编排界面

适用场景

  • 快速实验和原型开发(MVP验证阶段)
  • 需要集成多种AI服务的场景(如文本+图像多模态处理)
  • 学术研究或初创团队的技术验证

典型应用案例

  • 电商智能客服系统(结合商品知识库+订单查询)
  • 科研文献智能分析平台

代码复杂度:★★★☆☆ 需要掌握Chain、Agent等核心概念,但文档完善

2. LLamaIndex

核心特点

  • 专为知识库优化的存储检索架构
  • 支持50+数据源连接器(包括Notion、Confluence等)
  • 提供细粒度访问控制
  • 内置高级检索策略(HyDE、子查询等)

适用场景

  • 企业级文档中心(如产品手册、内部Wiki)
  • 需要复杂推理的知识系统(法律、医疗领域)
  • 大规模(TB级)非结构化数据处理

典型应用案例

  • 金融机构合规文档智能检索
  • 制造业设备维修知识图谱

代码复杂度:★★★★☆ 需要配置索引策略和检索管道,学习曲线较陡

3. LangChain-ChatGLM

核心特点

  • 深度适配ChatGLM-6B等国产模型
  • 提供开箱即用的中文处理能力
  • 支持低配硬件部署(如4GB显存显卡)
  • 预置中文知识库处理模板

适用场景

  • 国产化信创环境部署
  • 中小型企业知识管理系统
  • 需要快速上线的中文场景应用

典型应用案例

  • 政府公文智能问答系统
  • 教育机构课程知识库

代码复杂度:★☆☆☆☆ 提供完整示例项目,1小时内可完成基础部署

选择建议:

  1. 验证阶段:优先选用LangChain快速试错
  2. 生产环境
    • 英文场景/复杂需求 → LLamaIndex
    • 中文场景/轻量化 → LangChain-ChatGLM
  3. 团队考量
    • 有专职AI工程师 → 可选LLamaIndex
    • 中小团队 → 推荐LangChain系方案

三、实战:用 LangChain 构建基础 RAG 系统

企业知识库问答系统实现指南 - 基于LangChain的完整RAG流程

环境准备与安装

首先需要安装必要的Python库,建议使用Python 3.8或更高版本:

pip install langchain langchain-community langchain-ollama chromadb python-dotenv

这些库的作用分别是:

  • langchain: RAG流程的核心框架
  • langchain-community: 社区维护的扩展组件
  • langchain-ollama: 用于本地运行的Ollama模型集成
  • chromadb: 轻量级向量数据库
  • python-dotenv: 环境变量管理

文档加载与预处理

1. 文档加载

我们以企业政策文档为例,支持多种格式:

from langchain_community.document_loaders import TextLoader

# 加载UTF-8编码的文本文件
loader = TextLoader("company_policy.txt", encoding="utf-8")  
docs = loader.load()

# 也可以使用DirectoryLoader加载整个文件夹
# from langchain_community.document_loaders import DirectoryLoader
# loader = DirectoryLoader('./docs', glob="*.txt")

2. 文本切分策略

合理的文本切分对RAG效果至关重要:

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,       # 每个文本块约1000字符
    chunk_overlap=200,     # 块间重叠200字符确保上下文连贯
    add_start_index=True   # 保留原始文档中的位置信息
)

doc_chunks = text_splitter.split_documents(docs)
print(f"原始文档被切分为 {len(doc_chunks)} 个语义块")

实际应用中可根据文档特点调整:

  • 技术文档:建议chunk_size=800-1200
  • 合同文本:建议chunk_size=500-800
  • 会议纪要:建议chunk_size=300-500

向量存储构建

1. 嵌入模型选择

使用Ollama本地部署的Llama3模型生成向量:

from langchain_ollama import OllamaEmbeddings

embeddings = OllamaEmbeddings(
    model="llama3",        # 使用llama3模型
    temperature=0,         # 确定性输出
    num_ctx=2048           # 上下文窗口大小
)

2. 向量数据库配置

采用ChromaDB作为向量存储:

from langchain_community.vectorstores import Chroma

vector_db = Chroma.from_documents(
    documents=doc_chunks,
    embedding=embeddings,
    persist_directory="./chroma_db",  # 持久化存储路径
    collection_name="company_policy"  # 指定集合名称
)

# 持久化保存
vector_db.persist()

向量检索参数说明:

  • persist_directory: 数据库文件存储路径
  • collection_name: 可创建多个知识库集合
  • 默认使用余弦相似度计算

RAG流程整合

1. 大模型初始化

from langchain_ollama import ChatOllama

llm = ChatOllama(
    model="llama3",
    temperature=0.3,       # 适当创造性
    top_p=0.9,            # 核采样参数
    num_ctx=4096          # 更大的上下文窗口
)

2. 提示工程优化

设计专业的提示模板:

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template("""
你是一个专业的企业政策咨询助手,请严格根据提供的上下文信息回答问题。

政策上下文:
<context>
{context}
</context>

用户问题:{input}

回答要求:
1. 只基于上下文回答,不知道就说"根据现有政策无法确定"
2. 保持专业正式的语气
3. 如果涉及多个条款,分点列出
4. 最后注明相关条款出处
""")

3. 检索链构建

from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain

# 文档处理链
doc_chain = create_stuff_documents_chain(llm, prompt)

# 检索器配置
retriever = vector_db.as_retriever(
    search_type="mmr",          # 最大边际相关性算法
    search_kwargs={
        "k": 3,                 # 返回3个最相关片段
        "fetch_k": 10           # 初步检索10个候选
    }
)

# 完整RAG链
rag_chain = create_retrieval_chain(retriever, doc_chain)

系统测试与优化

测试用例

# 简单查询
response = rag_chain.invoke({"input": "年假如何申请?"})
print(response["answer"])

# 复杂查询
response = rag_chain.invoke({
    "input": "比较年假和病假的申请流程差异"
})
print(response["answer"])

# 未知问题测试
response = rag_chain.invoke({
    "input": "公司是否有海外工作派遣政策?"
})
print(response["answer"])

性能优化建议

  1. 检索优化

    • 尝试不同search_type(similarity/mmr)
    • 调整k和fetch_k参数
    • 添加元数据过滤
  2. 提示工程

    • 加入示例(few-shot)
    • 指定回答格式
    • 设置角色扮演
  3. 评估指标

    • 回答相关性
    • 事实准确性
    • 响应速度

生产环境部署建议

  1. 持久化方案:

    # 加载已有向量库
    vector_db = Chroma(
        persist_directory="./chroma_db",
        embedding_function=embeddings
    )
    

  2. API服务化:

    • 使用FastAPI封装
    • 添加认证中间件
    • 实现批处理接口
  3. 监控指标:

    • 请求响应时间
    • 缓存命中率
    • 知识覆盖率

这套方案适用于:

  • 企业内部政策问答
  • 产品文档查询
  • 技术支持知识库
  • 合规审查系统

通过调整嵌入模型和LLM,可以轻松适配不同规模的企业需求。

四、RAG SDK:企业级落地工具

当需要规模化部署 RAG(Retrieval-Augmented Generation)系统时,可采用专业化的 RAG SDK(如昇腾 RAG SDK)。该 SDK 提供了一套完整的解决方案,其核心架构包含以下关键组件:

  1. 数据处理层

    • 支持多格式文档解析:包括 PDF、Word、Excel、PPT、HTML 网页等多种常见格式
    • 文档预处理功能:自动进行文本清洗、分块(chunking)、去重等操作
    • 元数据提取:自动识别文档标题、作者、创建日期等关键信息
  2. 检索层

    • 混合检索策略:结合向量检索(基于语义相似度)和关键词检索(基于精确匹配)
    • 高级重排序算法:使用如 BERT 等模型对初步检索结果进行相关性重排序
    • 多级缓存机制:提高高频查询的响应速度
  3. 生成层

    • 多模型适配:支持 ChatGLM、LLama、GPT 等多种主流大语言模型
    • 流式输出:支持实时生成和返回结果,提升用户体验
    • 回答格式化:可配置回答模板,确保输出风格一致性
  4. 监控层

    • 实时指标监控:检索准确率、响应时间、资源利用率等
    • 幻觉检测:自动识别和标记模型生成内容中的事实性错误
    • 可视化看板:提供直观的数据分析和性能监控界面

SDK 快速调用示例(以昇腾 RAG SDK 为例)展示了典型的使用流程:

from ascend_rag_sdk import RAGClient

# 初始化SDK
rag_client = RAGClient(
    api_key="your_api_key",  # 认证密钥
    vector_db_config={
        "type": "milvus",    # 支持milvus/faiss等多种向量数据库
        "host": "127.0.0.1",
        "port": 19530,
        "collection_name": "company_knowledge"  # 指定知识库集合
    },
    llm_config={
        "model": "chatglm3",  # 默认使用模型
        "temperature": 0.7    # 生成参数配置
    }
)

# 上传知识库文档(支持批量上传)
upload_result = rag_client.upload_knowledge(
    file_path="company_policy.pdf",
    document_id="policy_2023",  # 自定义文档ID
    metadata={"department": "HR", "version": "1.0"}  # 附加元数据
)

# 发起RAG查询
result = rag_client.query(
    question="公司病假工资如何计算?",
    top_k=3,                   # 返回前3个最相关文档片段
    model="chatglm3",          # 指定生成模型
    stream=False,              # 是否启用流式输出
    filters={"department": "HR"}  # 添加检索过滤器
)

# 输出结果
print("SDK回答:\n", result["answer"])
print("参考文档:\n", result["references"])  # 包含引用来源信息
print("置信度评分:", result["confidence_score"])

该 SDK 还提供进阶功能:

  • 增量更新:支持知识库的增量添加和更新
  • 版本控制:管理不同版本的知识库
  • 权限管理:细粒度的访问控制
  • 批处理模式:支持大规模离线处理任务

通过这种模块化设计,开发者可以快速构建高性能的企业级 RAG 应用,适用于客服系统、智能知识库、法律咨询等多种业务场景。

五、总结与优化方向

RAG(Retrieval-Augmented Generation)的效果优化可从以下几个关键方向入手:

  1. 检索优化
  • 基础检索:使用向量数据库(如 FAISS、Milvus)实现语义检索
  • 混合检索方案:
    • 加入关键词检索(如 Elasticsearch 或 BM25 算法)
    • 实现向量检索与关键词检索的加权融合
    • 示例:在医疗问答系统中,同时使用"糖尿病"关键词和"血糖控制"语义向量进行检索
  • 检索增强:
    • 加入查询扩展技术
    • 实现检索结果的重排序(reranking)
  1. 文档切分策略优化
  • 传统方法的问题:固定长度切分会导致语义割裂
  • 改进方案:
    • 使用语义切分工具(如 LangChain 的 SemanticChunker)
    • 基于 NLP 模型识别语义边界
    • 示例:法律文档按"条款"切分,技术文档按"功能模块"切分
  • 分块大小调整:
    • 根据领域特点动态调整
    • 知识密集型内容使用较大分块
    • 对话场景使用较小分块
  1. 多轮对话优化
  • 上下文管理:
    • 使用 RunnableWithMessageHistory 保存对话历史
    • 实现基于对话树的上下文跟踪
  • 改进策略:
    • 在检索时注入历史对话信息
    • 示例:用户询问"上一条提到的治疗方案"时能准确召回相关内容
    • 实现对话状态跟踪(DST)
  • 缓存机制:
    • 对重复查询进行结果缓存
    • 建立问题-答案对的知识图谱
  1. 其他优化方向
  • 结果精炼:对检索结果进行去重和摘要
  • 时效性管理:对知识库建立版本控制机制
  • 反馈机制:收集用户对生成结果的评价用于迭代优化

2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖。 报名链接:https://www.hiascend.com/developer/activities/cann20252

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐