使用RAG技术构建企业级文档问答系统之基础流程

1 概述

本文是本系列(使用RAG技术构建企业级文档问答系统)的第二篇,将介绍检索增强生成(Retrieval Augmented Generation,简称RAG)最基础流程。

所谓检索增强生成,是大语言模型兴起之后发展迅速的一个应用领域,简单说就是,这项技术,可以根据用户输入的问题,从文档(如PDF、Word、PPT、TXT、网页等)中自动检索跟问题相关的文本片段(或称为知识片段、上下文),然后将一段指令、用户输入的问题、文本片段拼装成一个Prompt(也就是大语言模型的输入),让大语言模型生成一个回答。

在ChatGPT最初发布的时候,回答问题主要还是依赖ChatGPT训练时的知识,由此导致了三个显著问题:

  • 知识陈旧:也就是新发生的事情,它是没办法回答的
  • 幻觉:也就是编造与事实不符的回答
  • 没有办法让ChatGPT基于自己独有的,如个人积累的或者企业内部积累的知识文档回答问题,只能基于已经公开的信息回答

根据RAG所检索对象的不同,大致可以分成2类,但底层的技术其实是高度相似的:

  • 知识库问答:主要是检索企业内部一系列文档,比如Word、PDF、Wiki、Confluence等,或者企业自建的知识管理平台。很多企业其实积累了非常多的内部文档,传统方式只能使用关键词,或者特定类目检索,效率低下,使用RAG后可以高效快速地直接返回答案,当然这个地方也有它自己的坑,先按下不表,后面有机会再细谈

  • 联网搜索问答:这个主要是检索整个互联网,最典型代表就是Perplexity,国内的典型产品像秘塔AI搜索、天工AI、360AI搜索等,其实也是检索文档,但会首先借助搜索引擎API,获取一个网页列表,然后再对每个网页执行加载、切分、向量化操作。
    上面反复提到了知识库,在RAG的流程中,知识库会经历下面4个步骤处理,如下图所示:

  • 加载:可以简单理解成把文档读取成字符串

  • 切分:按照特定长度,把文档切分成文本片段,做这一步是因为,后面要使用向量模型将切分后的文本片段(其实就是段落或者句子)转换成向量,由于向量模型输入长度限制,所以这一步必须按照特定长度切分

  • 向量化:这一步会使用一个向量模型,将一个句子转换成一个向量,跟word2vec模型其实不是一个东西,word2vec模型是把一个字符或者一个词,转换成一个向量,而在RAG中说的向量模型,是把句子转换成向量,这样后续就可以使用向量计算,来比较句子之间的相似性,所谓RAG中的检索,很大程度是依赖向量,所以这块很重要

  • 向量存储:这一步一般会使用向量库存储向量化好的文本片段,以及一些元数据信息,如文件名、ID之类的,向量库是类似MySQL、PostgreSQL一样的一个数据库,只不过它专注于存储向量,典型的有Milvus、FAISS、Chroma、Qdrant、Pinecone、Weatiate、PGVector等

图片

(https://python.langchain.com/v0.2/docs/tutorials/rag/)

知识库处理好,保存到向量库之后,当用户提问时,会将用户问题也进行向量化,然后拿用户问题向量,去向量库中,使用余弦相似度(只是原理,后续后再详细展开),检索到最相似的一些句子,然后将用户问题、检索到的相似句子,一同组成一个Prompt,输入大模型,生成答案,如下图所示:

### 构建企业级RAG问答系统的最佳实践 #### 1. 数据准备与预处理 数据的质量直接影响到最终的问答效果。因此,在构建企业级RAG系统之前,需对内部文档、FAQ列表以及其他结构化或非结构化的数据源进行全面整理和清洗。这一步骤可能包括去除冗余信息、标准化术语以及标注敏感字段等操作[^2]。 对于特定行业而言,还需要考虑专业知识背景下的语义理解问题。例如医疗健康类应用需要特别关注医学名词的一致性和准确性;金融领域则要确保法规条款解释无误。这种细致的数据准备工作能够帮助后续检索阶段更精准定位相关内容片段[^1]。 #### 2. 检索模块设计 在RAG架构中,检索部分扮演着至关重要的角色——它负责从海量存储库中快速找到与当前提问高度匹配的知识条目。目前主流做法有两种: - **向量相似度搜索**:利用预先训练好的编码器将文本转换成固定长度向量表示形式后再计算距离得分; - **关键词匹配机制**:基于传统IR理论直接比较问句同候选集之间的共同词项频率统计特性。 实际开发过程中往往结合两者优势形成混合方案以兼顾速度与精度需求。另外值得注意的是,在某些特殊场景下还可以引入外部API服务作为补充来源进一步扩大覆盖范围。 ```python from langchain.vectorstores import FAISS from langchain.embeddings.openai import OpenAIEmbeddings embeddings = OpenAIEmbeddings() vectorstore = FAISS.from_texts(texts, embeddings) ``` 上述代码展示了一个简单版本的FAISS矢量化索引创建过程,适用于中小型规模的企业资料管理环境。 #### 3. 提示工程优化 为了使大语言模型更好地理解和回应用户的意图,精心设计Prompt至关重要。具体来说可以采用如下几种技巧来改进对话体验: - 使用清晰简洁的语言描述任务目标; - 明确指出可用参考资料的位置及其作用; - 控制上下文窗口大小从而减少不必要的干扰因素影响判断逻辑; - 针对企业特有的业务流程定制专属模板以便于新员工培训期间迅速上手操作指南等内容学习。 #### 4. 性能调优与监控维护 即使经过充分测试上线后的系统也可能因为各种原因逐渐偏离预期表现水平。为此建议定期审查日志记录查找潜在瓶颈所在并及时调整参数配置直至恢复正常运作状态为止。与此同时也要建立完善的反馈收集渠道鼓励终端使用者积极参与进来共同促进产品迭代升级进程加快步伐向前迈进! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值