LangChainV1.0[07]-RAG-检索增强生成

本节完成官方案例:Build a RAG agent with LangChain

文档路径: Learn->LangChain -> RAG agent , 文档地址:https://docs.langchain.com/oss/python/langchain/rag 。 主要完成两个功能:

  1. 索引:从网页获取知识,将知识向量化后存储到向量数据库
  2. RAG: 提出问题后先到向量数据库检索(R-Retrieval) ,然后将检索的结果和问题一起发送给大模型(A-Augmented) , 最终大模型给出答案(G-Generation)

1.文档加载

需要从网页加载文档,所以会用到Python 第三方库 :Beautify Soup简称:BS4,它可以从 HTML 或 XML 文档中快速地提取指定的数据。Beautiful Soup 语法简单,使用方便,并且容易理解.

# 安装 bs4 依赖pipinstallbs4

这里定义一个函数,并进行测试:

chapter07/rag-demo.py

importbs4fromlangchain_community.document_loadersimportWebBaseLoaderdefload_web(url:str):# 创建一个 SoupStrainer 对象, 用于过滤掉不需要的标签bs4_strainer=bs4.SoupStrainer()loader=WebBaseLoader(# 这个参数可以指定多个网页路径,是一个Tuple类型。# 因为这里只传入了一个url,元祖中只有一个元素。# 如果后面没有逗号,则Python会认为是一个普通的括号,而不是元素。这是url后面为什么有一个逗号的原因web_paths=(url,),bs_kwargs={"parse_only":bs4_strainer,# 指定过滤器})returnloader.load()if__name__=='__main__':docs=load_web("https://news.cctv.com/2026/01/04/ARTIvjEzc0cszhUpOlfZJz1v260104.shtml?spm=C94212.P4YnMod9m2uD.ENPMkWvfnaiV.13")print(f"文档个数:{len(docs)}, 标题:{docs[0].metadata['title']}")print(f"内容(前100个字符):{docs[0].page_content[:100]}")

2.拆分文档

前面代码获取到了一个网页内容,这个内容现在需要被拆分:

chapter07/rag-demo.py

fromlangchain_text_splittersimportRecursiveCharacterTextSplitterdefsplitDocs(docs):""" 将 Document 数组拆分为多个 Document 数组 :param docs: Document 数组 :return: 拆分后的 Document 数组 """text_splitter=RecursiveCharacterTextSplitter(chunk_size=1000,separators=["\n\n","\n","."," ",""],chunk_overlap=128)# 一个List[Document], 每个元素是一个文档块all_splits=text_splitter.split_documents(docs)print(f"拆分后的文档数量:{len(all_splits)}")returnall_splitsif__name__=='__main__':docs=load_web("https://news.cctv.com/2026/01/04/ARTIvjEzc0cszhUpOlfZJz1v260104.shtml?spm=C94212.P4YnMod9m2uD.ENPMkWvfnaiV.13")all_splits=splitDocs(docs)# 拆分后的文档数量:8

3.存入Vector Stores

这里我使用的是本地ollama 中安装的bge-m3:567m模型,需要提前在ollama中拉取:

ollama pull bge-m3:567m

前面章节中我们用到了chroma向量数据库,我们采用的是DashScopeEmbeddings即百炼的向量模型,本次使用在 ollama 中拉取的bge-m3:567m模型。官方文档:https://docs.langchain.com/oss/python/integrations/text_embedding 中提供了OllamaEmbeddings

3.1 什么是Vector Store?

Vector Store(向量存储)是一种专门用于存储高维向量(通常是文本经过嵌入模型转换后的向量表示)并支持快速相似性搜索的数据结构或数据库。其主要功能包括:

  • 存储:将文本块(chunks)及其对应的嵌入向量(embeddings)保存起来。
  • 检索:给定一个查询(query),将其转换为向量后,在向量空间中查找“最相似”的向量(通常用余弦相似度、欧氏距离等度量),返回对应的原始文本。

LangChain 为所有向量数据库提供了一致的抽象接口,开发者无需因更换底层数据库而重写业务逻辑。主要方法包括:

方法功能
add_documents(documents, ids=...)添加带内容和元数据的文档
delete(ids=...)按 ID 删除文档
similarity_search(query, k=4, filter=...)执行语义相似性搜索

这使得你可以轻松在ChromaFAISSPinecone等之间切换。

官方文档: https://docs.langchain.com/oss/python/integrations/vectorstores#ollama 有说明

3.2 创建Vector Store

fromlangchain_ollamaimportOllamaEmbeddingsfromlangchain_chromaimportChromadefget_vectory_store():# 创建一个向量模型embedding_modle=OllamaEmbeddings(model="bge-m3:567m",base_url="http://192.168.6.133:11434")vector_store=Chroma(# 创建一个向量集合collection_name="news_collection",# 向量模型embedding_function=embedding_modle,# 向量数据库保存目录persist_directory="./chroma_langchain_db",)returnvector_store

这个函数执行后,将会创建索引数据库:

3.3 保存拆分后的文档

因为vector store 提供了统一的入口,保存拆分后的文档的时候,它会自动调用为他设定的 embedding model 进行向量化,然后保存到对应的向量数据库中。

if__name__=='__main__':docs=load_web("https://news.cctv.com/2026/01/04/ARTIvjEzc0cszhUpOlfZJz1v260104.shtml?spm=C94212.P4YnMod9m2uD.ENPMkWvfnaiV.13")all_splits=splitDocs(docs)# 拆分后的文档数量:8# 创建vectory storevectory_store=get_vectory_store()# 保存文档vectory_store.add_documents(all_splits)

4.检索工具

在这里,我们使用“工具装饰器”来配置工具,以便将原始文档作为“附件”附加到每个“ToolMessage”中。这样,我们就能在应用程序中访问文档的元数据,而这些元数据与发送到模型的字符串化表示是分开的。

defcreate_retrieve_tool(vector_store):# 将检索工具用函数封装起来,因为它需要用到 vector_store@tool(response_format="content_and_artifact")defretrieve_context(query:str):"""Retrieve information to help answer a query."""retrieved_docs=vector_store.similarity_search(query,k=2)serialized="\n\n".join((f"Source:{doc.metadata}\nContent:{doc.page_content}")fordocinretrieved_docs)returnserialized,retrieved_docsreturnretrieve_context

这里之所以用create_retrieve_tool函数将工具声明封装起来,是因为在工具中要用到vector_store进行相似度搜索。

5.创建RAG agent

接下来我们需要创建一个 RAG agent,将上面创建的tool交给它,然后提出问题。那么agent就会先调用工具进行相似度检索,然后将结果和问题一起发送给大模型,大模型回答后返回结果:

if__name__=='__main__':# 获取 vectory_storevectory_store=get_vectory_store()# 创建检索工具tools=[create_retrieve_tool(vectory_store)]# 对话模型model=init_chat_model(model="ollama:qwen3-next:80b-cloud",base_url="http://127.0.0.1:11434")# 在Python中,当你用括号包围多个字符串时,Python会自动将它们连接成一个单一的字符串。这种做法通常用于提高代码的可读性,特别是当字符串很长时。SYSTEM_PROMPT=("You have access to a tool that retrieves context from a blog post.\n\n""Use the tool to help answer user queries.")# 创建Agentagent=create_agent(model=model,system_prompt=SYSTEM_PROMPT,tools=tools)# 问题question="《固体废物综合治理行动计划》是哪一天由谁印发的?"response=agent.stream({"messages":[{"role":"user","content":question}]},stream_mode="values",)foreventinresponse:# 取最后一条打印event["messages"][-1].pretty_print()

输出:

============= Human Message ============= 《固体废物综合治理行动计划》是哪一天由谁印发的? ============= Ai Message ============= Tool Calls: retrieve_context (409b1e3d-185a-4c48-b64d-cc836d35034a) Call ID: 409b1e3d-185a-4c48-b64d-cc836d35034a Args: query: 固体废物综合治理行动计划 印发日期 印发单位 ============= Tool Message ============= Name: retrieve_context ......省略 ============= Ai Message ============= 《固体废物综合治理行动计划》由国务院于2025年12月27日印发,文件编号为国发〔2025〕14号。该通知明确要求各省、自治区、直辖市人民政府及国务院各部委、各直属机构认真贯彻执行。

可以看到,agent在执行的时候,自动调用了 tool工具到本地向量数据库中进行了相似度搜索。

自动将搜索结果与问题一起发送给了大模型,最终大模型经过思考后,给出了最终答案。很显然它的答案是来自于刚开始从网站上抓取的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1124161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发者必看:如何在Conda环境中运行阿里万物识别代码

开发者必看:如何在Conna环境中运行阿里万物识别代码本文为开发者提供一份完整可执行的实践指南,详细讲解如何在 Conda 环境中部署并运行阿里开源的“万物识别-中文-通用领域”图像识别模型。涵盖环境激活、文件操作、路径配置与推理执行等关键步骤&#…

资深考官亲授:MCP模拟试题精准还原度达95%的备考法

第一章:MCP考试核心认知与备考策略什么是MCP认证 Microsoft Certified Professional(MCP)是微软推出的权威技术认证体系,旨在验证IT专业人员在微软技术平台上的实际能力。获得MCP认证意味着考生已掌握特定微软产品或服务的核心技能…

万物识别对抗训练:提升模型鲁棒性的快速方案

万物识别对抗训练:提升模型鲁棒性的快速方案 当安全团队发现公司的识别系统容易被对抗样本欺骗时,如何快速实施对抗训练提升模型鲁棒性?本文将介绍一种基于预置镜像的快速解决方案,帮助你在产品发布前加固识别系统。这类任务通常需…

Hunyuan-MT-7B-WEBUI实测:民汉互译准确率超90%?真实数据告诉你

Hunyuan-MT-7B-WEBUI实测:民汉互译准确率超90%?真实数据告诉你 在边疆地区的政务大厅里,一位工作人员正将一份长达十页的汉语政策文件粘贴进一个网页界面。不到两分钟,系统便输出了流畅的维吾尔语译文——这是过去需要翻译团队耗时…

【MCP零信任安全实战指南】:从架构设计到落地实施的9大核心步骤

第一章:MCP零信任安全的核心理念与演进在现代企业网络架构中,传统的边界防御模型已无法应对日益复杂的威胁环境。MCP(Micro-Segmentation Control Plane)零信任安全模型应运而生,其核心理念是“永不信任,始…

UltraISO注册码最新版找不到?先学会用AI翻译获取海外资源

用AI翻译打开全球技术资源的大门:本地化高质量机器翻译实践 在技术社区里,你是否也遇到过这样的场景?发现一个看起来非常不错的开源项目,点进GitHub仓库却发现文档全是英文;想查阅某个工具的部署指南,结果官…

MGeo优化技巧:通过批处理提升GPU利用率至90%以上

MGeo优化技巧:通过批处理提升GPU利用率至90%以上 在中文地址数据的实体对齐任务中,地址相似度匹配是关键环节。由于中文地址存在表述多样、缩写习惯差异、层级结构不一致等问题,传统字符串匹配方法(如编辑距离、Jaccard&#xff…

MCP模拟考试高频错题TOP10(附权威解析与避坑指南)

第一章:MCP考试核心考点全景解析 考试范围与知识体系概述 Microsoft Certified Professional(MCP)认证涵盖多个技术方向,包括Windows Server管理、Azure云服务、网络安全、Active Directory配置等。考生需掌握核心的系统架构原理…

全网最全专科生必备TOP10 AI论文软件测评

全网最全专科生必备TOP10 AI论文软件测评 2026年专科生AI论文写作工具测评:为什么你需要这份榜单? 随着人工智能技术的不断进步,AI论文写作工具已经成为高校学生尤其是专科生提升学术效率的重要助手。然而,面对市场上琳琅满目的产…

GitHub镜像网站推荐:如何快速获取Hunyuan-MT-7B-WEBUI部署资源

GitHub镜像网站推荐:如何快速获取Hunyuan-MT-7B-WEBUI部署资源 在多语言内容爆炸式增长的今天,从科研论文翻译到企业出海本地化,再到民族地区公共服务的语言互通,高质量机器翻译已不再是“锦上添花”,而是刚需。然而&…

端午节由来多语言版本:Hunyuan-MT-7B自动产出科普内容

端午节由来多语言自动翻译:Hunyuan-MT-7B如何让文化传播更高效 在全球化日益深入的今天,一个中国传统节日的内容能否被世界理解,往往取决于它是否能跨越语言和文化的双重门槛。比如“端午节”——这个承载着千年历史与民族情感的节日&#x…

Hunyuan-MT-7B-WEBUI深度评测:7B参数下的多语言翻译王者

Hunyuan-MT-7B-WEBUI 深度评测:7B参数下的多语言翻译王者 在跨国协作日益频繁的今天,一句准确流畅的翻译可能直接决定一次商务谈判的成败,也可能让一段少数民族地区的政策宣传真正触达基层群众。然而,高质量机器翻译的落地长期以来…

【MCP AI Copilot考试通关秘籍】:20年专家亲授高分技巧与避坑指南

第一章:MCP AI Copilot考试高分策略总览在准备MCP AI Copilot认证考试时,掌握系统化的学习与应试策略是取得高分的关键。考生需全面理解AI助手的核心功能、上下文感知能力、代码建议机制以及与开发环境的集成方式。通过模拟真实开发场景的题目&#xff0…

智能家居中枢:用现成镜像打造家庭物品识别系统

智能家居中枢:用现成镜像打造家庭物品识别系统 作为一名极客家长,你是否想过把家里闲置的旧平板改造成一个智能物品识别终端?孩子指着各种物品问"这是什么"时,不用再手忙脚乱地查手机,只需轻轻一拍就能获得答…

AI赋能电商:快速部署中文商品识别系统

AI赋能电商:快速部署中文商品识别系统 为什么需要商品识别系统 对于小型电商公司来说,商品图片的标签管理一直是个头疼的问题。手动为每张商品图片添加标签不仅耗时耗力,还容易出错。而一个高效的商品识别系统可以自动分析图片内容&#xff0…

互联网大厂年度总结1000+道高频Java面试题(附答案解析)

进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全,其中概括的知识点有:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spr…

【新】基于SSM的在线网络教学平台【源码+文档+调试】

💕💕发布人: 星河码客 💕💕个人简介:混迹java圈十余年,精通Java、小程序、数据库等。 💕💕各类成品Java毕设 。javaweb,ssm,springboot等项目&…

从零到一:30分钟构建你的第一个中文万物识别系统

从零到一:30分钟构建你的第一个中文万物识别系统 作为一名数字艺术家,你是否经常需要手动分类和标记作品中的各种元素?现在,借助AI技术,我们可以快速构建一个中文万物识别系统,自动完成这项繁琐的工作。本文…

ISTA2A vs 3A:医疗器械/生物制药包装运输测试选型指南

医疗器械、生物制药、疫苗等产品的包装运输安全直接关系到产品效能与患者生命安全。作为第三方包装运输测试实验室,我们常面临企业对ISTA2A与ISTA3A标准的选型困惑。这两项均为国际安全运输协会(ISTA)核心测试标准,却因模拟场景、…

简历自我评价多语言版本生成:Hunyuan-MT-7B提升求职效率

简历自我评价多语言生成:Hunyuan-MT-7B如何重塑求职效率 在一场面向东南亚市场的招聘会上,一位来自贵州的工程师用流利的泰语向面试官介绍自己——不是因为他精通外语,而是他提前使用一款本地部署的翻译工具,将中文简历中的“自我…