——已获知乎作者【卜寒兮】授权转载
事情是这样的,前段时间我家猫软便一直不好,我带去宠物医院检查。现在的宠物医院都会给去过的宠物建档案,就像人的电子病历一样,记录一些基本信息、病史,以及疫苗接种记录之类的。因为之前去过同一家,所以我家的猫在这也有记录,当天去了之后,医生也是惯例查电子记录,但不知道他们的系统有问题还是他不会用,找了半天也没找出来,后来另外一个人过来在后台把一大串数据调出来才找到。 当时我的感觉是他们这个信息管理系统太不智能了,作为一个 AI 大模型的重度使用者,自然想到大模型在宠物医院这个场景下的应用,特别是结合 RAG(Retrieval-Augmented Generation, 检索增强生成)技术,应该可以解决很多实际问题。比如宠物信息的管理、辅助兽医诊断、病历分析等等,这些都是大模型擅长的东西,在类似的垂直领域已经有不少成功的应用了。 当下萌生这个想法之后,晚上就简单构思了一个基于 LLM+RAG 的系统框架(就叫它“宠物医院 AI 助手”吧)。
然后做了一个简易版的实现,可以管理宠物的基本信息,针对性的给出健康建议等,效果大概是下面这样⬇️
这篇文章就主要分享一下思路和详细的搭建过程。 最核心的思路就是用 RAG 来增强通用大模型在特定领域和私有知识库场景下回答的精准度。 以防有人不了解,这里先补充一点 RAG 技术的背景知识。(不感兴趣的可以直接划到实操部分)
一、为什么要用 RAG?
大家都知道,大模型掌握的知识来源于海量数据的训练,所有能获取到的信息和知识都可以文本化后投喂给大模型,经过训练后内化为大模型知识的一部分。但问题在于有些知识和数据是私有的,或者是有时效性的,研发大模型的企业无法获取到这类数据去训练模型,当模型回答相关问题的时候,也就无法给出准确的答案,甚至出现“幻觉”,编造错误的信息输出给用户。 所以,AI 并不是什么都知道,你问 AI 全世界的猫有多少品种,它可能会告诉你;但是如果你问 AI 我家的猫叫什么,它当然不知道,因为它的训练数据里没有这个信息。 以上只是一个举例,更一般的情况是特定领域的专业知识(比如法律、医疗、金融),或企业内部非公开数据(比如项目文档、技术规范、产品信息等等),在这些场景中,光靠通用大模型无法解决实际需求。比如一家公司需要用大模型构建 AI 智能客服,回答客户产品咨询相关的问题,那么就必须想办法让模型“看到”产品数据。
1.1 了解 RAG
RAG 的基本思想就是给大模型外接一个“知识库”,它不是让 LLM 仅依赖其内部预训练的知识来回答问题,而是在生成答案之前,先从一个外部的(通常是更新的、更专业的)知识库中检索相关信息,然后将这些信息作为上下文提供给模型,指导它生成更准确、更可靠、更有依据的回答。
RAG 结合了信息检索(Retrieval)的能力和大模型强大的生成(Generation)能力,很好的解决了 LLM 特定领域知识缺乏、知识时效性差等问题。 适合采用 RAG 方案的场景一般都有下面这些特点:
- 依赖外部、特定或动态更新的知识。
- 对答案的准确性、事实性和可追溯性要求高。
- 需要处理领域专业知识或私有数据。
- 希望在不频繁重新训练大模型的情况下,扩展或更新系统的知识范围。
对照这些特点,会发现上面提到的宠物医院场景非常契合 RAG 的技术优势。
第一,痛点明确。类似人的病历一样,宠物病历通常包含大量非结构化文本(医生记录)、结构化数据(检查结果)和时间序列信息。人工查找、汇总特定信息非常耗时。而借助 AI 可以快速定位和总结。
第二,知识库私有且专业。病历数据以及诊断经验等是宠物医院私有数据,也属于特定领域知识库,不适合公开的大模型直接回答,属于 RAG 的理想应用场景。
第三,技术匹配度高。
- 提高效率:RAG 擅长从文档库中检索相关信息并结合 LLM 生成针对性回答,这能明显提高兽医获取宠物关键信息的效率,节省查阅时间;
- 辅助诊断:大模型还可以结合全面的历史记录和检查报告,结合模型自身理解能力和数据分析能力,提供初步诊断,作为兽医的参考建议。
- 定制化健康建议。基于更全面的知识库信息,AI 可以给出更个性化和有针对性的健康管理建议(如饮食、运动、复查提醒等)。
1.2 RAG 系统的关键组件
(来源:https://mp.weixin.qq.com/s/UrTS7evWZeZp8mnjQiKEuQ)
通俗的讲,RAG 就是在模型正式回答之前把外部知识库的相关“知识/上下文”补充到用户的问题(query)中,一起输入给大模型。这里的关键在于如何精确地检索出来跟用户 query 相关的知识。 然而,外部知识库通常是多种格式的数据(PDF、txt、图片等等),它们无法直接被检索,也无法被大模型理解,所以在构建知识库过程中,需要进行一系列数据处理操作。
具体地,对于原始数据,一般需要如下步骤:
- 原始数据解析。比如把非结构化的文档转换为结构化文档;或者将图片通过 OCR 识别、大模型理解等收到解析为文本;
- 文档切片。将长文档切割成较小的、语义相对独立的文本块 (Chunk)。
- 向量化。通过 embedding model 将文本转换为机器能理解和计算的数学形式(向量),以便进行语义相似度计算、信息检索等任务。
- 索引与存储。将文本块内容、其对应的向量以及可能的 metadata (如文档来源、块编号、标题等) 存储到向量数据库中。
(来源:https://www.multimodal.dev/post/how-to-chunk-documents-for-rag)
目前市面上已经有不少实现 RAG 的常用工具和框架,比如主流的 LangChain、LlamaIndex 基础框架,以及各类云平台等。 我用的是阿里云的AI搜索开放平台,之所以选这个,是因为它把 RAG 的整个链路都组件化了,不需要自己写底层代码,只需要编排好每个环节,直接调用相关的服务就可以完成对应的任务,调用代码也通过模块化的形式提供,所以搭建起来非常快,并且不需要很高的技术门槛。 比如,你可以直接在平台的体验中心里选择文本向量化服务,并选择一个 embedding 模型,然后粘贴想处理的文本,点击“获取结果”就可以得到这段文本的向量表示(下面的演示里是一个1536维的向量)。同时,还提供了完成这个操作的示例代码,属于是“开箱即用”了。
下面是借助阿里云 AI 搜索开发平台搭建一个 RAG 系统(以本文宠物医院场景为例)的完整过程。
二、完整搭建过程
2.1 知识库
上面提到,RAG 的知识库可以是领域特定知识、企业私有数据,通俗来说,只要是对场景任务帮助,能给大模型提供增量信息的都可以作为知识库。 比如可以是专业的诊断书籍,医院积累的病历、宠物数据等等,甚至是电子医疗影像(结合LLM多模态能力)。 本文的例子中,由于我并没有真实的数据,所以找到了一份家庭宠物医生的参考书,然后用大模型随机生成了一些宠物档案,作为模拟数据。由于都是纯文本数据,可以把他们保存在一个txt文件中。
2.2 开通阿里云 AI 搜索开放平台服务
1、首先需要在阿里云平台官方开通 AI 搜索开放平台服务,才能使用平台上的功能,开通服务是免费的,登录一下阿里云账号后开通即可,官网链接: https://opensearch.console.aliyun.com/cn-shanghai/rag/server-market?spm=a2c4g.11186623.0.0.4899347aSJxkI2
2、开通之后,在页面左侧点击 API Keys,创建一个密钥,以便后续通过 API/SDK 调用相关服务时使用,注意及时保存。
3、平台功能及调用方法 目前,该平台提供了10多种智能搜索和 RAG 场景相关的服务,比如文档/图片内容解析、文本向量化、搜索引擎、大模型(支持 DeepSeek-R1,QwQ 等推理模型)等等。 帮大家整理了一下完整服务如下⬇️
你可以通过“体验中心”在线使用这些功能(新用户有10次免费额度)。
也可以通过API调用相关的服务,平台支持 Python SDK,调用起来也非常方便。 需要提前配置一下 Python 开发环境,安装依赖项: pip install alibabacloud_searchplat20240529 alibabacloud_credentials==1.0rc4 可以简单运行一个文档切片的脚本,验证环境是否配置成功:
from alibabacloud_tea_openapi.models import Config from alibabacloud_searchplat20240529.client import Client from alibabacloud_searchplat20240529.models import GetDocumentSplitRequest if __name__ == '__main__': config = Config( bearer_token='OS-xxx', endpoint='xxx.platform-cn-shanghai.opensearch.aliyuncs.com', protocol='http' ) client = Client(config=config) request = GetDocumentSplitRequest().from_map({"document": {"content": "这是一个测试! This is a test.", "content_type": "text"}, "strategy": {"max_chunk_size": 300, "need_sentence": False}}) response = client.get_document_split("default", "ops-document-split-001", request) for chunk in response.body.result.chunks: print(chunk.content)
将上述代码中的bearer_token
和endpoint
替换为你自己的 API key 和 API 域名:
如果程序正确运行,并出现类似下图中的结果,则说明环境配置成功:
2.3 创建 Elasticsearch 实例
根据上面的介绍,将知识库的文档向量化后,需要存储到向量库中,以便后续的索引和检索等操作。本文使用阿里云 Elasticsearch 作为搜索引擎,它是阿里云平台提供的 AI 搜索引擎服务,可进行向量和文本内容存储、构建索引、以及在线向量/文本检索,结合排序等服务实现知识库文档的召回,为接下来的大模型增强生成提供必要的上下文信息。 使用阿里云 Elasticsearch 的方式是创建一个 Elasticsearch 实例,并完成必要的配置,具体步骤如下: (1)进入阿里云 Elasticsearch 平台(https://elasticsearch.console.aliyun.com/cn-shanghai/instances),进入“Elasticsearch实例”页面,点击“创建”后进入配置页面:
(2)规格配置。在该页面进行实例各项规格的配置,建议选择“按量付费”,会以小时为单位计算费用,接下来选择地区,建议选择离自己最近的区域。
(3)网络类型这里,需要首先创建一个 VPC 网络和对应的虚拟交换机,可通过如下地址创建:https://vpc.console.aliyun.com/vpc/cn-shanghai/vpcs
需要注意的是创建交换机的时候,可用区要跟 Elasticsearch 的可用区保持一致。
然后点击刷新,创建好的VPC就是自动出现,选中即可。
(4)配置 ES 实例规格,根据自己的实际需求选择对应参数,建议一开始可以配置低一点,因为这个是按规格和小时数收费的,测试和开发阶段不用配置太高。 最后填入登录名(默认)和登录密码,后面会用到。
最后确认配置无误后,点击立即开通完成ES实例创建。
(5)设置 ES 访问 ip 白名单 不管是通过公网还是私网,访问 ES 实例之前,都要将待访问设备(比如你自己的电脑)的 ip 加入到 ES 的访问白名单中。 在ES控制台,选中刚刚创建好的实例,进入设置页面,选择“安全配置”,点击“ VPC 私网访问白名单”或“公网地址访问白名单”(默认关闭,需要手动打开)右侧的“修改”。
在修改白名单面板,单击 default 分组右侧的配置,然后把你电脑的 ip 添加到白名单中。(FIY:可以通过www.cip.cc 查看自己电脑的 ip 地址)
2.4 编排 RAG 系统组件
完成以上的准备工作,就可以重新回到 AI 搜索开放平台正式搭建 RAG 系统了。实际上,平台专门针对 RAG 场景提供了一套标准的搭建模板,包含了从文档处理、向量化,到检索、排序、上下文增强,再到模型生成的完整技术链路。
在场景中心,进入到RAG场景:
在该页面对具体环节进行配置,每一个环节都提供一种或多种服务/模型来完成具体的任务,对应的服务已经集成到平台上了,只需要按照自己的需求选择即可。
比如有几个关键的部分: 1、文本向量化服务。有针对多语言的 embedding 模型,也有专门针对中文的 embedding 模型; 2、排序服务。根据用户问题(query),搜索引擎从知识库(如文档集合、数据库)中初步召回(Retrieve)一批可能相关的文档片段;但需要对召回的文档进行更精细的评估和排序,选出最相关的片段和用户问题组合在一起作为 prompt 提供给大模型,这个任务就是排序/重排序。它直接关系到提供什么样的额外信息给大模型作为上下文参考,直接影响了大模型生成回答的准确性和相关性。阿里云 AI 搜索平台的排序服务,可找到相关性更高的内容并依次返回,有效提升检索及大模型生成的准确率。
3、大模型生成服务。检索和排序部分负责“找对书、翻到页”(提供相关的原始素材),而 LLM 则负责“阅读理解、提炼总结、写出答案”。毫无疑问,大模型直接决定了整个系统输出的上限和质量。尽管检索环节提供了相关的外部知识,但最终将这些知识转化为精准、流畅、有用答案的“大脑”仍然是 LLM 。
平台提供的大语言模型服务包括:
- 通用模型:
- DeepSeek 系列:提供 R1/V3 及 7B/14B 蒸馏等全线模型。
- 通义千问 (Qwen) 系列:支持 Turbo、Plus、Max 版本。
- RAG 优化模型:
- 内置 OpenSearch-通义千问-Turbo:基于 Qwen-Turbo,经有监督微调,专用于提升 RAG 性能和降低幻觉率。
完成所有服务的配置后,点击底部的代码查询,就可以得到完整的 Python 脚本,分为离线处理和在线问答两个部分。
将代码文件下载到本地,完成必要参数的配置,需要自己填入的参数有:
- api key和api域名(参照上文)
- 工作空间名称(
workspace_name
),如果你没有新建过工作空间,那就是默认的default,无需修改;如果使用的是新创建的工作空间,此处填入新工作空间的名称; - ES登录名和密码(
es_auth
),即创建ES实例时自己设置的密码; - ES地址(es_host),在ES实例的信息页面查找:
2.5 效果测试
完成上述所有配置后,即可以在本地的 Python 环境中执行脚本。
1、首先执行文档处理脚本,离线处理包括知识库文档解析、文档切片、向量化和将向量写入搜索引擎等任务;注意模板代码里用到的是示例数据,如果希望处理自己的知识库,那么需要把document_url
这里的链接换成自己文档的链接(比如我这里是把文档存储到了阿里 OSS 上,所以直接使用文件的 OSS 地址)。
运行后如果出现“ES write success”,说明知识库文本和向量数据成功写入了 ES 中,RAG 的关键步骤之一向量化就完成了。
2、接下来就可以正式利用知识库内容+LLM 回答问题了(执行在线问答脚本)。
- 系统先把问题转换成它能“读懂”的数学形式(Query向量化);
- 然后利用向量的相似度,去知识库里快速找出一些可能相关的文档片段(文档召回)。
- 接下来会重新评估找出来的片段,挑出其中最有用、最匹配你问题的几个(排序打分,示例脚本中设置的是 top 8,可以根据具体情况修改该参数)。
- 最后,把原问题和这些精选出来的“参考资料”一起交给大模型,让它根据这些上下文信息生成一个清晰、准确的回答(大模型问答)。
至此,一个简易的“宠物医院AI助手”就搭建完成了。我测试了一下直接用它查询宠物档案信息,比如查询“某个宠物的疫苗接种记录”:
对比实际数据,信息是完全吻合且准确的:
结合大模型自身的知识和性能,还可以完成更智能化的任务,比如让该“助手”针对这个猫咪平时的习惯(同样存档于知识库中),推测其可能发生的疾病,并给出一些针对性的喂养建议:
通过这个例子简要演绎一下 RAG 的过程,大致就是:
- 系统首先理解我(用户)的意图,提取关键信息,比如宠物的姓名,然后在给到的电子知识库中,通过数据过滤和向量搜索,检索(Retrieval)出跟J asper 最相关的行为习惯和历史记录片段
- 接着,系统将这些检索到的、关于 Jasper 的具体信息(上下文)与原始问题增强(Augmented)组合,形成一个详细的指令提示给大型语言模型 (LLM)。
- 最后,LLM 利用这个包含具体上下文的 prompt ,结合其自身的兽医知识进行推理分析,生成(Generation)一份针对 Jasper 个体的、有理有据的健康风险评估和个性化喂养建议。
如果没有 RAG 的外接知识库,大模型通常只会给出一个博学但泛泛而谈的答案,比如基于品种特性和一般猫科知识的回答;而在这个例子中,RAG 系统则能化身为一个“私宠兽医“,结合通用知识和某个宠物的专属档案和记录,提供高度个性化、有事实依据、更具针对性的分析和建议。这也是 RAG 的核心优势——将LLM的通用智能锚定在具体的、实时的个体数据上。
以上就是完整的搭建一个 RAG 系统的过程,其实我自己根本没写几行代码,主要是阿里云的 AI 搜索开放平台把对应的功能模块化后,我只需要选择对应的服务就行了。可以单独调用平台的某个服务,也可以搭建完整的工作流。我使用下来的感受,可以概括为几个词:“简单、高效、灵活、省钱”。 关于费用这块,主要是ES实例的运行费用,至于 AI 搜索开放平台本身服务的调用,参照一下平台的计费规则,我觉得几乎都可以忽略不计了。
实际上 RAG 技术的潜在应用场景非常多,只要大模型幻觉和数据私有这两个问题存在,RAG 就一直有市场,许多企业接入大模型更多的业务需求其实都是处理内部数据,这个需求背景下,可以说 RAG 是刚需。 最后,对于想尝试搭建 RAG 系统的,推荐大家去亲自动手尝试一下。
更多详情:https://www.aliyun.com/activity/bigdata/opensearch/platform