1.前言

为了避免 llm正确的废话和幻觉,知识库可以说是现在开发 agent的必备了。同时,作为 rag中的 r,知识库召回的成功率会极大的影响 llm的最终回复效果。一般,会把知识库召回的内容作为背景知识给到 llm,并在 prompt中明确告诉它优先使用知识库召回的内容回答用户问题,甚至要求必须基于知识库回答也是可以的。

环境信息如下:

​ python-3.13、langchain-0.3.26

2.知识库设计

这里设计一个轻量级知识库,基于 csv格式的数据,可用于小型项目,维护成本极低。样例如下:

报错信息,原因分析,修复建议
"java.sql.SQLException: EXECUTION FAILED: Task DDL error HiveException: [Error 20604] Can not create table: create table busi.dwd_cd_eksiq_024323331015027700004_20250720_de083461-142e-4768-38si-bd7046532ca9 failed","Hive相关服务负载过高","排除服务故障后可尝试重做任务"
"The ownership on the staging directory file:/tmp/hadoop/mapred/staging/KS_MACHINE1666781422/.staging is not as expected. It is owned by hctr. The directory must be owned by the submitter KS_MACHINE or KS_MACHINE@LAKEHOUSE.IK","权限信息错误或者kinit没有正确连接","优先联系管理员确认权限问题"
"org.apache.hadoop.hive.ql.metadata.HiveException: Invalid Value ""1"" for decimal(3,3) column when inserting. Column to inserting: name","字段和字段内容不匹配导致无法写入","decimal字段小数点位数不能超过保留位数"

这是一个运维场景,记录了任务报错的日志原因分析修复建议。日常维护可以使用 excel进行管理,然后导出成 csv即可,非常的方便快捷。

对于一线的运维来说只是简单记录日常工作,而且能反过来提高自己的工作效率,故一般都不会排斥。

3.加载知识库

首先,读取和解析 csv需要用到 langchain_community的 CSVLoader。如下:

loader = CSVLoader(file_path="task-records.csv",encoding="utf-8",metadata_columns=["原因分析", "修复建议"],content_columns=["报错信息"],
)
docs = loader.load()

这里的重点是:content_columns,内容列,知识库召回时会基于此列的内容,使用 embedding模型进行向量化的时候也是用这一列。

metadata_columns是元数据列,不会参与召回,可用于丰富召回结果。比如 补充数据来源、原因分析和修复建议。

其次,需要对文本进行分块,如下:

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
all_splits = text_splitter.split_documents(docs)

chunk_size分块大小为 1000个字符,chunk_overlap设置为0表示片段无重叠,这两个参数会影响召回成功率,需要根据知识库和业务调用实际情况修改。比如 业务调用时多用关键词,则需要把 chunk_size调小;反之,如果用的是句子段落,则需要把chunk_size调大。

4.修改Embedding客户端

这里选取的 embedding模型是 BAAI-bge-small-zh-v1.5离线版,维度是 1024,使用 docker进行部署,适合无法联网的环境,比如 内网、局域网。如果使用的是 langchain支持厂商的 embedding模型,可以跳过本步骤。

为了适配此离线 embedding模型,故基于 langchain-openai embedding客户端进行改造,修改内容如下:

// 修改 _get_len_safe_embeddings函数
// 把下面的内容去掉
for i in _iter:response = self.client.create(input=tokens[i : i + _chunk_size], **client_kwargs)if not isinstance(response, dict):response = response.model_dump()batched_embeddings.extend(r["embedding"] for r in response["data"])

这个函数主要影响的是知识库分段后的向量化过程,很重要。

其他的 离线 embedding模型可以参考此方式进行修改,不一定适用所有的模型。

5.知识库召回

知识库是需要存储的,这里选用极致轻量化的方案:内存存储,对应的代价就是每次程序重启或知识库更新时需要全量初始化,比较耗时。

首先,进行知识库向量化:

embeddings = BAAIEmbeddings(base_url="http://127.0.0.1:9997/v1",  # 远程embedding服务地址api_key="no-key",model="BAAI-bge-small-zh-v1.5",
)vector_store = InMemoryVectorStore(embeddings)
vector_store.add_documents(documents=all_splits)

BAAIEmbeddings这个类是基于 openai进行改造后的,add_documents时会调用 embedding模型进行知识库分片的向量化,并将结果存储在内存中。

至此,知识库已经完全准备好了,可以进行召回测试了,如下:

retrieved_docs = vector_store.similarity_search_with_score(query="/tmp/hadoop/mapred/staging/KS_MACHINE1666781422/.staging is not as expected",k=1,
)
print(retrieved_docs)

这里 k能够控制最终召回的数据条数,在召回成功率低的情况下可以调大。

知识库召回效果如下

[(Document(id=‘d06c773b-fd98-4de9-b939-ce2d3e513a11’, metadata={‘source’: ‘task-records.csv’, ‘row’: 2, ‘原因分析’: ‘权限信息错误或者kinit没有正确连接’, ‘修复建议’: ‘优先联系管理员确认权限问题’}, page_content=‘报错信息: The ownership on the staging directory file:/tmp/hadoop/mapred/staging/KS_MACHINE1666781422/.staging is not as expected. It is owned by hctr. The directory must be owned by the submitter KS_MACHINE or KS_MACHINE@LAKEHOUSE.IK’), 0.8914968315763799)]

可以看到 langchain准确的找出了知识库中与问题最匹配的数据,并且可以在元数据中看到是来自task-records.csv、原因分析和修复方式,以及文本相似度。这些信息在实际项目中都是需要进行展示的,增加可信度和便于溯源。

6.总结

本文描述了如何使用 langchain构建一个轻量级的知识库,步骤如下:

  1. 设计csv格式的知识库
  2. 加载csv文件
  3. 文本分片
  4. 文本向量化与存储
  5. 文本召回

其实基于其他的存储,比如 pg、es,步骤类似,其次知识库的工程化不能忽视,否则会极大的影响召回成功率。

在实际项目中,召回数据通常会有很多条,一般生产环境会默认允许召回 20条、30条甚至更多,故还可以增加 rerank模型进行重排,进一步增加知识库检索准确率。

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

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

相关文章

NPM打包时,报reason: getaddrinfo ENOTFOUND registry.nlark.com

先说解决方法:将 package-lock.json 文件中的 registry.nlark.com 改为 registry.npmmirror.com现象:npm ERR! code ENOTFOUND npm ERR! syscall getaddrinfo npm ERR! errno ENOTFOUND npm ERR! network request to https://registry.nlark.com/url-too…

python内置库os与sys的区别是什么?分别能实现什么功能?

Python 的 os 和 sys 是两个功能截然不同但都非常重要的内置库,它们分别服务于不同的交互场景:前者专注于与操作系统交互,后者专注于与 Python 解释器本身交互。以下是详细解析: 一、os 库:操作系统交互接口 os 库&…

【云计算】云主机的亲和性策略(一):快乐旅行团

《云主机的亲和性策略》系列,共包含以下文章: 1️⃣ 云主机的亲和性策略(一):快乐旅行团2️⃣ 云主机的亲和性策略(二):集群节点组3️⃣ 云主机的亲和性策略(三&#xf…

USRP捕获手机/路由器数据传输信号波形(下)

目录: USRP捕获手机/路由器数据传输信号波形(上) USRP捕获手机/路由器数据传输信号波形(中) USRP捕获手机/路由器数据传输信号波形(下) 四、路由器MIMO-OFDM系统 本文深入分析采集手机与路由…

位运算在权限授权中的应用及Vue3实践

在现代前端应用中,权限管理是一个至关重要的功能模块。随着应用复杂度的提示功能,权限细粒度越来越精细,如何高效地管理和判断权限成为前端开发的一大挑战。位运算作为一种高效的运算方式,在权限管理领域有着独特的优势。本文将详…

面试实战,问题二十二,Java JDK 17 有哪些新特性,怎么回答

Java JDK 17 新特性面试回答指南 作为一名Java开发者,了解JDK 17的新特性是面试中的关键点。JDK 17(Java SE 17)于2021年9月发布,是一个长期支持(LTS)版本,引入了多项改进以提升开发效率、安全性…

【MySQL安全】什么是SQL注入,怎么避免这种攻击:前端防护、后端orm框架、数据库白名单

基本概念SQL注入是OWASP Top 10安全风险之一,它利用了应用程序对用户输入数据的不当处理。当应用程序直接将用户输入拼接到SQL查询中而没有进行适当的过滤或转义时,就可能发生SQL注入攻击。攻击原理假设有一个登录表单的SQL查询:SELECT * FRO…

pyqt5显示任务栏菜单并隐藏主窗口,环境pyqt5+vscode

环境 pyqt5vscode 环境搭建见 https://blog.csdn.net/huiaifen/article/details/125175261 新建一个QMainWindow 1 在VSCode的资源管理器中,右键选择 PYQT:New Form,打开Qt Designer2 在打开的窗口中选 “Main Window”,然后选“创建”3 直接…

SpringBoot项目数据脱敏(自定义注解)

文章目录前言一.配置1.脱敏类型枚举:DesensitizeType2.注解:Desensitize3.序列化类:DesensitizeJsonSerializer4.工具类:DesensitizeUtil二、测试:DesensitizeTest三、效果展示总结前言 在互联网应用中,用户…

PSO-TCN-BiLSTM-MATT粒子群优化算法优化时间卷积神经网络-双向长短期记忆神经网络融合多头注意力机制多特征分类预测/故障诊断Matlab实现

基本介绍 1.Matlab实现PSO-TCN-BiLSTM-MATT粒子群算法优化时间卷积神经网络-双向长短期记忆神经网络融合多头注意力机制多特征分类预测,PSO-TCN-BiLSTM-Multihead-Attention; 多头自注意力层 (Multihead-Self-Attention):Multihead-Self-Atte…

第一篇:Linux 运维入门:虚拟机部署与基础环境配置

目录 一、准备工作与环境规划 二、虚拟机网络配置 1、虚拟网络编辑器设置 2、系统网络配置 3、主机名配置 三、Hosts 文件与 SSH 免密配置 配置 hosts 文件编辑/etc/hosts文件实现主机名解析: 分发 hosts 文件到其他节点 SSH 免密登录配置在 zhangsan101 上…

(一)全栈(react配置/https支持/useState多组件传递/表单提交/React Query/axois封装/Router)

文章目录 项目地址 一、基础配置 1.1 支持https 1. 安装所需要的包 2. 配置 1.2 常用 1. 字符串拼接 二、组件 2.1 useState组件传递 1. App里初始化useState 2. useState和方法的传递 3. 接收传递来的状态和方法 2.2 表单提交 1. 表单组件处理用户输入数据 2. App传来的submit…

【abc417】E - A Path in A Dictionary

Problem StatementYou are given a simple connected undirected graph G with N vertices and M edges. The vertices of G are numbered vertex 1, vertex 2, …, vertex N, and the i-th (1≤i≤M) edge connects vertices Ui​ and Vi​.Find the lexicographically smalle…

linux火焰图

火焰图简介火焰图是一种性能分析的可视化工具,它将CPU的调用栈(Call Stack)信息以矩形火焰的形式展现出来。Y轴:代表调用栈的深度(函数A调用了函数B,B就叠在A上面)。X轴:代表CPU的抽…

解剖 .NET 经典:从 Component 到 BackgroundWorker

1️⃣ 背景与定位在 .NET Framework 2.0 时代,微软引入了 BackgroundWorker 来解决 WinForm/WPF 场景下“耗时操作阻塞 UI 线程”的问题;而 Component 早在 1.0 就已存在,是所有可视化/非可视化设计器的“基类”。理解这两者的源码与机制&…

桌面端界面设计 |货物 TMS 系统 - SaaS UI UX 设计:审美积累之境

在物流数字化的浪潮中,货物 TMS 系统的 SaaS 化与 UI/UX 设计正构建着独特的审美坐标系。这不仅是技术与功能的融合,更是一场关于效率美学的深度探索,为行业审美积累注入了鲜活的实践样本。SaaS 模式赋予货物 TMS 系统轻盈而强大的特质&#…

多架构镜像整合全攻略:在Docker中实现单一镜像支持同时支持amd64和arm64架构

多架构支持的挑战 :随着异构计算(如 ARM、x86、RISC-V 等)的普及,开发者需要为不同硬件平台提供对应的镜像,传统方式需维护多个版本(如 image:v1-amd64 和 image:v1-arm64 ),导致版本…

Linux730 tr:-d /-s;sort:-r,-n,-R,-o,-t,-k,-u;bash;cut:-d,-c;tee -a;uniq -c -i

回顾 sort sort [选项] 文件-u:唯一,去除重复 -r:按数字大小,倒序排序,大到小 -o:输出文件 -n:按数字大小,顺序排序,小到大 -t: -t后加分割符,按分割符为标准,进行筛选 -k:k后加数字…

力扣457:环形数组是否存在循环

力扣457:环形数组是否存在循环题目思路代码题目 存在一个不含 0 的 环形 数组 nums ,每个 nums[i] 都表示位于下标 i 的角色应该向前或向后移动的下标个数: 如果 nums[i] 是正数,向前(下标递增方向)移动 |nums[i]| 步…

在 Elasticsearch 中落地 Learning to Rank(LTR)

1 为什么要引入 LTR? 常规检索(BM25、语义检索、Hybrid、RRF …)往往只能基于少量信号(关键词命中、向量相似度)排序。 Learning-to-Rank 通过机器学习模型把多维度特征(文档属性、查询属性、查询-文档相关…