【LangChain核心组件】Retrieval(检索)模块

在AI技术日新月异的今天,大型语言模型(LLM)的局限性也逐渐显现——它们无法有效处理特定领域知识和用户私有数据。这正是检索增强生成(Retrieval-Augmented Generation,RAG)技术崛起的根本原因。作为当前最主流的解决方案框架,LangChain的Retrieval模块为企业级AI应用开发提供了完整的工具链。本文将带您深入解析这个革命性框架的核心组件与技术实现。


使用RecursiveCharacterTextSplitter创建一个文本拆分器

示例代码

from pathlib import Path
from langchain.text_splitter import RecursiveCharacterTextSplitterdir_file=Path(__file__).parent.resolve()
file_path=dir_file/"text_splitter.txt"if not file_path.exists():raise FileNotFoundError(f"未检索到:{file_path}")with open(file_path,"r",encoding="utf-8") as f:render_file=f.read()text_split=RecursiveCharacterTextSplitter(chunk_size=100,chunk_overlap=20,length_function=len,add_start_index=True)text=text_split.create_documents([render_file])
print(text[0])#输出文本第一行的内容

运行结果

 page_content='医学概念标准化在生物医学研究与临床应用中的
诊断与手术名称规范化研究​​' metadata={'start_index': 0} 

 

参数解析

以下是 RecursiveCharacterTextSplitter 参数的作用、选择建议及注意事项的总结表格,基于模型特性与文本场景的平衡设计:

​参数​​作用​​推荐值​​注意事项​​参考依据​
chunk_size控制文本块的最大容量(按字符或自定义单位)- ​​通用场景​​:200-500 字符
- ​​中文长文本​​:400-800 字符
- ​​LLM输入对齐​​:512(BERT类模型)
- 过小导致语义断裂(如截断专业术语)
- 过大会稀释关键信息(如淹没核心论点)

需对齐模型输入长度(如 BCE 模型 512-1500,BGE 423-1240)

chunk_overlap相邻块的重叠量,缓解拆分导致的上下文丢失- ​​通用场景​​:10%-20% chunk_size
- ​​技术文档​​:15%-25% chunk_size
- 超过 30% 会导致冗余信息干扰检索
- 需结合分隔符优先级调整(如优先按句子拆分时可降低重叠量)

实证显示 10-20% 重叠可提升 F1 指标 2%,过低导致召回率下降 10%

length_function定义文本块长度计算方式- ​​字符计数​​:len()(默认)
- ​​Token计数​​:tokenizer.encode
- 使用 BERT 类模型时需改用 token 计数(如 1 token≈4 字符)
- 中文字符建议显式指定分词规则

Dify 实现中需用 GPT2Tokenizer 计算 token 分布

add_start_index记录块在原文中的起始位置,用于调试或上下文追溯​推荐启用​​(True- 增加少量内存开销
- 需确保原始文本未被篡改(如预处理后需同步更新索引)

LangChain 文档加载器中需配合 Document.metadata 使用


一、RAG技术的革命性突破

传统LLM的"知识冻结"特性严重制约了其在专业领域的应用。设想一个医疗AI系统需要处理最新医学研究成果,或一个法律助手需要引用地方性法规条款,单纯依赖预训练模型显然无法满足需求。

RAG技术通过动态检索外部知识库,将最新、最相关的信息实时注入生成过程,完美解决了以下关键痛点:

  • 突破模型训练数据的时间限制

  • 保护企业敏感数据不进入模型参数

  • 实现知识库的实时更新与扩展

  • 确保输出内容的可追溯性


二、LangChain Retrieval模块架构解析

2.1 文档加载器(Document Loaders)

LangChain支持的100+文档加载器可分为三大类别:

文件类型维度:

# 典型使用示例
from langchain.document_loaders import PyPDFLoader, UnstructuredHTMLLoader# PDF文档加载
pdf_loader = PyPDFLoader("medical_report.pdf")
pages = pdf_loader.load()# HTML文档处理
html_loader = UnstructuredHTMLLoader("research.html")
web_content = html_loader.load()

数据源维度:

  • 云存储:S3、Google Drive、OneDrive

  • 数据库:PostgreSQL、MongoDB、Elasticsearch

  • SaaS应用:Notion、Confluence、Salesforce

特殊格式支持:

  • 代码仓库:GitLoader支持.git目录解析

  • 视频字幕:YouTubeLoader提取CC字幕

  • 邮件归档:MboxLoader处理Thunderbird格式


2.2 文档转换器(Document Transformers)

关键转换策略对比:

策略适用场景优点缺点
固定分块结构化文档保持结构完整可能切断语义
递归分块混合内容自适应内容结构需要调试参数
语义分块专业文献保留完整语义计算成本较高
代码分块程序源码保持语法完整需要语言识别

高级处理技巧:

from langchain.text_splitter import SemanticChunker
from langchain.embeddings import HuggingFaceEmbeddings# 基于语义的分块
embedder = HuggingFaceEmbeddings(model_name="paraphrase-multilingual-MiniLM-L12-v2")
semantic_splitter = SemanticChunker(embedder, breakpoint_threshold=0.7)
chunks = semantic_splitter.split_documents(docs)

2.3 文本嵌入模型(Text Embedding Models)

选型决策树:

  1. 多语言支持 → 选择sentence-transformers/paraphrase-multilingual系列

  2. 长文本处理 → 考虑text-embedding-3-large等支持8K上下文

  3. 领域适配 → 使用Instructor-XL进行领域微调

  4. 实时性要求 → 采用text-embedding-3-small提升推理速度

性能基准测试(MTEB排行榜):

模型参数量维度综合得分推理速度
text-embedding-3-large未知307264.3230ms/doc
BAAI/bge-large-en-v1.51.3B102463.8180ms/doc
sentence-transformers/all-mpnet-base-v2110M76861.585ms/doc

2.4 向量存储(Vector Stores)

生产环境推荐方案:

  • 中小规模:Pinecone(全托管服务)

  • 超大规模:Milvus/Zilliz(分布式架构)

  • 混合搜索:Elasticsearch(支持标量+向量)

  • 本地开发:Chroma(轻量级内存存储)

高级检索示例:

# 混合搜索(向量+关键词)
from langchain.retrievers import BM25Retriever, EnsembleRetrievervector_retriever = db.as_retriever(search_type="mmr")
bm25_retriever = BM25Retriever.from_documents(chunks)
ensemble_retriever = EnsembleRetriever(retrievers=[bm25_retriever, vector_retriever],weights=[0.4, 0.6]
)

2.5 检索器(Retrievers)

创新检索算法解析:

父文档检索器(Parent Document Retriever)

  • 实现原理:建立chunk与原始文档的映射关系

  • 核心价值:保持上下文完整性

  • 典型应用:法律条款检索、论文引用

自查询检索器(Self-Query Retriever)

  • 元数据过滤:自动解析查询中的过滤条件

  • 示例对话:"请找出去年Q2的销售报告"

  • 实现机制:LLM辅助的查询解析

多向量检索器(Multi-Vector Retriever)

  • 摘要检索:先匹配摘要再获取全文

  • 问题生成:为每个chunk生成潜在问题

  • 混合索引:构建多维度搜索空间


三、生产环境最佳实践

3.1 索引优化策略

  • 分层存储架构:热数据(SSD)、温数据(HDD)、冷数据(对象存储)

  • 增量索引更新:通过版本号控制文档版本

  • 分布式索引:采用一致性哈希进行分片

3.2 性能监控指标

 

3.3 安全合规设计

  • 数据加密:传输层(TLS 1.3)+存储层(AES-256)

  • 访问控制:RBAC+ABAC混合模型

  • 审计日志:记录完整检索历史

  • 数据脱敏:自动识别PII信息


四、行业应用案例

4.1 金融合规审计系统

  • 挑战:实时解析200+监管文档

  • 方案:多级分块+法律条款关联

  • 成效:审计效率提升300%

4.2 医疗知识库系统

  • 特点:处理CT影像报告+医学文献

  • 创新:DICOM元数据提取器

  • 成果:诊断准确率提升40%

4.3 智能客服升级

  • 痛点:产品手册频繁更新

  • 实施:自动版本对比+变更提醒

  • 效果:首次解决率提高65%


五、未来演进方向

  1. 多模态检索:支持图像、视频的跨模态搜索

  2. 联邦学习:保护隐私的分布式检索

  3. 自适应索引:动态调整分块策略

  4. 认知架构:结合知识图谱的混合推理

在数字化转型的浪潮中,LangChain的Retrieval模块正在重塑企业智能化的技术底座。通过本文的深度解析,相信开发者们能够更好地驾驭这套工具,构建出真正理解业务、持续进化的智能系统。未来的AI应用,必将是检索与生成的完美协奏。

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

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

相关文章

Java使用WebSocket视频拆帧进度处理与拆帧图片推送,结合Apipost进行调试

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>Configuration public class WebSocketConfig {/*** 启动 WebSocket 服务器*/Beanpublic ServerEndpointE…

XSS攻击(反射型、存储型、dom型、PDF、SWF、SVG)

一、XSS攻击是什么 XSS是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中 Web 里面的脚本代码会被执行&#xff0c;从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。 二、XSS分类 反射型XSS 常见情况是…

vue + element-plus自定义表单验证(修改密码业务)

写一个vue组件Password.vue 没有表单验证只有3个表单项 <template><div><el-form><el-form-item label"旧密码"><el-input></el-input></el-form-item><el-form-item label"新密码"><el-input>&l…

Linux下使用MTK的SP_Flash_tool刷机工具

MTK的SP_Flash_tool刷机工具安装流程如下&#xff1a; 1、解压SP_Flash_Tool_Linux_v5.1336.00.100_Customer.zip unzip SP_Flash_Tool_exe_Linux_64Bit_v5.1520.00.100.zip 2、首先安装 libusb-dev 这个包&#xff1a; sudo apt-get install libusb-dev 3、安装成功之后…

基于 PyGetWindow 获取窗口信息和控制窗口

PyGetWindow 是基于Python的一款简单、跨平台的模块&#xff0c;用来获取窗口信息和控制窗口。可以实现的功能有&#xff1a; 获取当前系统中所有打开窗口的列表。 根据窗口标题、窗口句柄等属性获取特定的窗口对象。 激活、最小化、最大化和关闭窗口。 获取和设置窗口的位置、…

STM32硬件IIC+DMA驱动OLED显示——释放CPU资源,提升实时性

目录 前言 一、软件IIC与硬件IIC 1、软件IIC 2、硬件IIC 二、STM32CubeMX配置KEIL配置 三、OLED驱动示例 1、0.96寸OLED 2、OLED驱动程序 3、运用示例 4、效果展示 总结 前言 0.96寸OLED屏是一个很常见的显示模块&#xff0c;其驱动方式在用采IIC通讯时&#xff0c;常用软件IIC…

【ozone工具使用指南】基于keil使用ozone创建一个调试工程

前言&#xff1a;一般调试嵌入式工程代码最常见的方式是基于keil上面DEBUG&#xff0c;使用这种最古老的方式虽然也很方便&#xff0c;但是一些功能并没有办法体现&#xff0c;比如变量的变化曲线或者波形并无法直观的显示出来&#xff0c;ozone这个工具就结合了上面提到的比ke…

【ROS2】行为树 BehaviorTree(五):详细学习端口和黑板

1、构造函数 之前使用的行为树创建节点时,默认的构造函数形如: CalculateGoal(const std::string& name, const NodeConfig& config):SyncActionNode(name,config) {

架构思维:缓存层场景实战_读缓存(下)

文章目录 Pre业务场景缓存存储数据的时机与常见问题解决方案1. 缓存读取与存储逻辑2. 高并发下的缓存问题及解决方案3. 缓存预热&#xff08;减少冷启动问题&#xff09; 缓存更新策略&#xff08;双写问题&#xff09;1. 先更新缓存&#xff0c;再更新数据库&#xff08;不推荐…

Odrive源码分析(七) 逆park变换

Odrive源码分析(七) Park逆变换 Odrive中FOC部分代码分散在各个对象中&#xff0c;并不是集中在某一块&#xff0c;所以试图在某一段代码就能得到FOC全貌是不现实的。 先看下FOC的整个流程&#xff1a; 控制变量到三相电流输出的关键部分分为Park逆变换和SVPWM。本文主要讨论…

Flink Hive Catalog最佳实践

Flink Hive Catalog 最佳实践 一、配置与初始化 依赖管理 Hive Connector 版本对齐&#xff1a;需确保 flink-sql-connector-hive 版本与 Hive 版本严格匹配&#xff08;如 Hive 3.1.3 对应 flink-sql-connector-hive-3.1.3_2.12&#xff09;&#xff0c;同时添加 Hadoop 遮蔽…

通过人类和机器人演示进行联合逆向和正向动力学的机器人训练

25年3月来自哥伦比亚大学的论文“Train Robots in a JIF: Joint Inverse and Forward Dynamics with Human and Robot Demonstrations”。 在大型机器人演示数据集上进行预训练是学习各种操作技能的强大技术&#xff0c;但通常受到收集以机器人为中心数据的高成本和复杂性限制…

金融简单介绍及金融诈骗防范

在当今社会&#xff0c;金融学如同一股无形却强大的力量&#xff0c;深刻影响着我们生活的方方面面。无论是个人的日常收支、投资理财&#xff0c;还是国家的宏观经济调控&#xff0c;都与金融学紧密相连。​ 一、金融学的概念​ 金融学&#xff0c;简单来说&#xff0c;是研…

JavaScript `new Date()` 方法移动端 `兼容 ios`,ios环境new Date()返回NaN

在 iOS 环境下&#xff0c;new Date() 方法会返回 NaN&#xff0c;这通常是由于时间字符串的格式问题。iOS 的 Date 构造函数对时间字符串的格式要求比其他平台更严格。 原因&#xff1a;ios端不兼容“-”为连接符的时间。 解决办法&#xff1a; 替换时间格式 IOS 不支持某…

【网络编程】网络编程基础和Socket套接字

目录 一. 网络编程的概念 二. 网络编程基础知识 1&#xff09;网卡 2&#xff09;接收端和发送端 3&#xff09;客户端和服务器 4&#xff09;请求和响应 5&#xff09;客户端和服务器的交互模式 三. Socket 套接字模型 一. 网络编程的概念 网络编程 是通过编程实现不同…

盛水最多的容器问题详解:双指针法与暴力法的对比与实现

文章目录 问题描述方法探讨方法一&#xff1a;暴力法&#xff08;Brute Force&#xff09;思路代码实现复杂度分析 方法二&#xff1a;双指针法&#xff08;Two Pointers&#xff09;思路正确性证明代码实现复杂度分析 方法对比总结 摘要 盛水最多的容器&#xff08;Container …

图论-BFS搜索图/树-最短路径问题的解决

续上篇~图论--DFS搜索图/树-CSDN博客 先看第一次学习的博客&#xff01;&#xff01;&#x1f447;&#x1f447;&#x1f447;&#x1f447; &#x1f449; 有一些问题是广搜 和 深搜都可以解决的&#xff0c;例如岛屿问题&#xff0c;这里我们记dfs的写法就好啦&#xff0c;…

C++进阶——C++11_智能指针

目录 1、问题引入 2、RAII和智能指针 3、C标准库的智能指针 3.1 auto_ptr (不好) 3.2 unique_ptr 3.3 shared_ptr (重点) 3.4 weak_ptr (重点) 4、shared_ptr的循环引用问题(重点) 5、shared_ptr的线程安全问题 6、C11智能指针和boost的关系 7、内存泄漏 7.1 什么是…

数据库的基本原则

数据库的核心原则 原子性与持久性&#xff1a;原子性&#xff08;Atomicity&#xff09;确保一个事务中的所有操作要么全部完成&#xff0c;要么完全不执行&#xff0c;不会出现部分完成的情况。持久性&#xff08;Durability&#xff09;则保证一旦事务提交成功&#xff0c;即…

Java设计模式实战:装饰模式在星巴克咖啡系统中的应用

一、装饰模式简介 装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种模式创建了一个装饰类&#xff0c;用来包装原有的类&#xff0c;并在保持类方法签名完整性的前…