当前位置: 首页 > article >正文

企业知识库RAG到底有多难:实战3:向量化与存储

文章目录零项目位置一整体功能介绍二程序入口与参数三向量数据库初始化四文档 node 构建流程五为什么 debug 模式非常重要六metadata 统计分析七观察最大和最小 node八最终索引构建九整个代码的核心思路文章索引《企业知识库RAG到底有多难理论知识部分》《企业知识库RAG到底有多难实战1原始文档处理》《企业知识库RAG到底有多难实战2数据内容分块》《企业知识库RAG到底有多难实战3向量化与存储》零项目位置我的项目Repo https://github.com/ShionWakanae/Llamarkdown。现在讲的是./src/index_cli.py。这篇比较水因为没什么技术含量。一整体功能介绍这段代码本质上是一个“文档索引构建工具”作用是把 Markdown 文档读取进来处理成适合向量检索的 node然后生成 embedding最后写入向量数据库供后续 RAG 检索使用。代码并没有和某一个具体的向量数据库强绑定而是通过 LlamaIndex 的VectorStore抽象层来接入数据库。也就是说业务层其实只需要面对VectorStoreIndex至于底层到底是ChromaQdrantMilvusPGVectorWeaviate其实都可以替换。比如这里当前使用的是:ChromaVectorStore(chroma_collectionchroma_collection)然后交给:StorageContext.from_defaults(vector_storevector_store)最后统一进入VectorStoreIndex(...)。整个索引流程就建立完成了。这种结构有个很实际的好处就是后续迁移数据库成本会低很多。开发阶段可以先使用本地 Chroma甚至只用LlamaIndex的默认存储。部署阶段再切换 Milvus 或 Qdrant而大部分业务代码其实都不用改。所以这里的重点其实不是“用了 Chroma”而是“LlamaIndex 已经帮我们把向量数据库抽象统一了。”二程序入口与参数程序入口部分比较简单两个参数文档目录调试标识--debug。调试实际上非常照耀因为真实项目里大量 RAG 问题并不是 embedding 模型的问题也不是向量数据库的问题而是最前面的数据处理阶段已经出了问题。比如markdown 结构异常node 长度失控metadata 丢失标题层级错乱某些 section 没有被正确解析文档格式特殊导致 parser 崩溃这些问题如果不提前发现数据一旦入库后面检索质量会非常差而且问题会变得很难定位。所以这里 debug 模式的设计目标其实是“先人工确认 node 正常再允许入库。”是的是的没有前面辛苦的人工就无法带来后面的智能。三向量数据库初始化这里初始化的是 Chromachromadb.PersistentClient(path./storage/chroma_db)这是一个本地持久化数据库。也就是说即使程序退出向量数据仍然会保存在./storage/chroma_db目录里。接着get_or_create_collection(docs)创建 collection可以理解成“向量表”。后面metadata{hnsw:space: cosine}表示使用 cosine 相似度。随后通过ChromaVectorStore(...)包装成 LlamaIndex 的统一 vector store 接口。再交给StorageContext.from_defaults(...)这样后续VectorStoreIndex(...)就不需要知道底层数据库细节了。这里正体现了 LlamaIndex 是一个“统一的数据接入层”。后续如果你想切换MilvusQdrantPGVector通常只需要替换vector_store xxxVectorStore(...)这一层。而 node 构建、embedding、索引流程基本都不用改。四文档 node 构建流程真正的数据处理部分在这里builder IndexBuilder()然后final_nodes builder.build_nodes(doc_path, debug_mode)会把 markdown 文档转换成 node上篇文章的内容。node 可以理解成“最终进入向量数据库的最小检索单元”每个 node 通常包含textmetadatametadata 里可能包含标题路径topicblock_type是否包含 SQL是否包含 API是否包含错误码后续检索时其实大量能力都依赖 metadata。比如过滤某类文档限制某种 block_type优先召回 API 文档按 topic 检索所以 metadata 的质量其实非常重要。这里还有一个小处理meta[merged_headers] .join(meta[merged_headers])因为有些数据库不喜欢直接存 list 类型 metadata会报错。所以这里会提前转成一级标题 二级标题 三级标题这样的字符串结构。五为什么 debug 模式非常重要因为我发现数据问题会特别多就算是自己精心编写的文档到了RAG系统里也会有结构不合理的问题。再说我一直是做运营商软件的怀疑一切是我的习惯。就算是正式文档写了我也会怀疑它不生效。同时用友商文档和中国移动标准帮助工程上的同事回怼友商也是工作的一部分。呃总之这部分其实是我自己现在经常用到的因为你根本不知道最终生成了多少 nodenode 长度是否合理metadata 是否完整有没有大量空 chunk有没有超长 chunkmarkdown 是否解析失败所以这里我专门写了Show_debug_info_and_exit(final_nodes)在 debug 模式下只分析 node。不索引不入库。最后打印日志后直接中断程序。这样做的目的就是把问题尽量提前暴露。最近才调试发现一个问题node合并跨文档了离谱……如果这些 node 一旦进入向量数据库会出现神奇的bug再去定位问题会非常麻烦。六metadata 统计分析debug 模式下首先会执行print_metadata_stats(final_nodes)这里会统计 metadata 信息。例如topicblock_typehas_sqlhas_apihas_error_code比如stats[has_sql][true] 1最后会打印总 node 数量每种 metadata 的数量占比百分比这个步骤其实也容易发现问题如果你足够了解你的文档。例如“为什么 SQL 文档数量为 0”或者“为什么 API 类型异常少”这通常意味着parser 有问题metadata enrich 失败markdown 结构异常某类 block 没识别出来这些问题如果提前发现修复成本很低。但如果已经完成 embedding 并入库再去查问题会困难很多。七观察最大和最小 node另一个我经常使用的调试方式是直接观察最长和最短 node。代码会遍历for i, node in enumerate(final_nodes):然后记录最大 node最小 node最后输出print([min node], final_nodes[node_min_index])以及print([max node], final_nodes[node_max_index])这个步骤其实非常有效。因为很多格式问题一眼就能看出来。例如最短 node 如果只有-或者通常说明 markdown 被错误切碎了。而最长 node 如果突然达到几万字符通常意味着标题层级失效section 没切开parser 出错merge 逻辑异常这些问题会直接影响 embedding 质量。因为向量模型并不擅长处理极短垃圾文本超长混乱文本所以我现在基本已经形成习惯先 debug 看 node确认node 数量合理node 长度正常metadata 正确文档结构正常之后才允许真正入库。八最终索引构建最后才是真正建立索引VectorStoreIndex(...)这里会传入final_nodesstorage_contextembed_model也就是说node - embedding - vector store 整个流程由 LlamaIndex 自动完成。这里show_progressTrue我一般都会打开。因为真实项目里文档量可能非常大。不开进度条时很容易误以为程序卡死。并且这里其实是默认用的CUDA如果没有N卡暂时只能改代码换成CPU但是会慢10多倍……九整个代码的核心思路这份代码其实没有特别复杂的算法。重点更多在于使用 LlamaIndex 解耦向量数据库在正式入库前先观察数据质量提前发现 markdown 与 metadata 问题尽量避免低质量 node 进入向量数据库因为实际 RAG 项目里很多召回质量问题本质上都来自“数据本身已经坏了”。而 debug 阶段其实是最容易发现这些问题的时候。

相关文章:

企业知识库RAG到底有多难:实战3:向量化与存储

文章目录(零)项目位置(一)整体功能介绍(二)程序入口与参数(三)向量数据库初始化(四)文档 node 构建流程(五)为什么 debug 模式非常重要…...

Transformer注意力机制数据流优化与MMEE方法实践

1. 注意力机制数据流优化概述在Transformer架构和大型语言模型(LLM)中,注意力机制的计算开销通常占整体工作负载的60%以上。随着模型处理序列长度的不断增加,注意力计算面临的性能瓶颈日益凸显——其计算复杂度与序列长度呈二次方关系。这种特性使得传统…...

Java版Dify SDK:构建AI应用的高效开发指南

1. 项目概述:为什么我们需要一个Java版的Dify SDK?如果你正在用Java构建AI应用,并且已经接触过Dify这个开源的LLM应用开发平台,那你大概率会遇到一个痛点:官方SDK主要面向Python和JavaScript生态。当你想在Spring Boot…...

2026年,想要靠谱美缝团队?看完这篇你就知道选哪家!

在高端住宅、别墅装修中,美缝是彰显整体质感的关键环节。选对美缝团队,不仅能提升家居美观度,还能确保美缝效果长效耐用。2026年,如果你正在寻找靠谱的美缝团队,不妨看看长沙匠心徐师傅美缝团队,以下将为你…...

手机端数据恢复神器,值得收藏

今天给大家推荐一款好用的安卓端数据恢复工具,非常好用的,还有一款Wifi信号检测工具,有需要的小伙伴及时下载收藏! 软件介绍 第一款:数据恢复大师dumpster 提到数据恢复大师,之前好像也有推荐过&#xff0…...

IDEA(2021.3.2)模块右侧Maven中不显示Dependencies问题

前言:今天在B站大学上想学点东西的时候,发现了这个问题,根目录中有两个模块,分别是01,02我嫌麻烦就复制了一份为03,在刷新maven的过程中报错(主要就是不展示Dependencies)然后百思不得其解&…...

猫瘟爆发季,我为什么把全院空气消毒换成了净博阳?宠物医生手记

先说背景:我经营一家中型宠物医院,3个诊室、1个手术室、1个输液区、1个住院部(15个笼位),日均接诊量30-40例。干过临床的同行都知道,宠物医院有一个隐形的生死线——院内交叉感染。你这边刚抢救回来一只猫瘟…...

AI编程工具实战指南:从Claude Code到Cursor的深度技巧与工作流设计

1. 项目概述:一份写给实干派开发者的AI编程工具实战手册 如果你和我一样,是个在一线写代码写了十来年的老程序员,那你肯定已经感受到了,这两年AI编程工具的出现,彻底改变了我们写代码的方式。从最开始GitHub Copilot那…...

Anthropic研究院议程:不止做AI大模型,更要定义AI时代的全球规则

当大模型竞赛进入白热化,多数科技公司都在比拼参数、速度、模型能力时,OpenAI竞品Anthropic走出了一条完全不同的路。 近期,Anthropic 正式公布 Anthropic Institute(Anthropic研究院)全新研究议程,不再只埋头做模型研发,而是站在行业顶层视角,深度拆解AI对经济、安全、…...

Windows下CLion配置NDK的CMake项目,为什么你的Android.toolchain.cmake总报错?一篇讲清所有参数

Windows下CLion配置NDK的CMake项目:破解android.toolchain.cmake报错全指南 当你第一次在CLion中尝试配置NDK的CMake项目时,那个看似简单的android.toolchain.cmake文件可能成了噩梦的开始。明明按照教程一步步操作,却在编译时遭遇各种莫名其…...

企业团队如何利用Taotoken统一管理API密钥与下载用量报告

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业团队如何利用Taotoken统一管理API密钥与下载用量报告 在团队协作开发与使用大模型API的过程中,如何安全、高效地管…...

奇点不是预言,是进度条:SITS 2026公布的87项技术里程碑中,已有23项进入工信部信创适配目录(附完整清单速查表)

更多请点击: https://intelliparadigm.com 第一章:CSDN主办SITS 2026:2026奇点智能技术大会亮点全解析 SITS 2026(Singularity Intelligence Technology Summit)由CSDN联合中国人工智能学会、中科院自动化所共同主办&…...

智能体工程:从氛围编程到结构化AI辅助开发方法论

1. 项目概述:从“氛围编程”到“智能体工程”如果你和我一样,在过去一年里深度使用过 Claude Code、Cursor 或者 GitHub Copilot 来写代码,大概率经历过两种极端状态:一种是“哇,这 AI 太神了,我动动嘴皮子…...

告别明文传输:手把手教你为open62541 OPC UA服务器配置OpenSSL加密(附证书生成避坑指南)

工业物联网安全实战:基于open62541与OpenSSL构建OPC UA加密通信体系 在工业控制系统与物联网设备的数据交互中,明文传输就像在公共场所用明信片传递商业机密。想象一下工厂里的PLC控制器将生产参数以原始文本形式发送到SCADA系统,或者智能传感…...

FiveM服务器全栈运维指南:从零搭建到高效管理的结构化技能体系

1. 项目概述与核心价值如果你正在运营一个基于 FiveM 的 GTA V 角色扮演服务器,那么你肯定对“服务器炸了”、“脚本冲突了”、“玩家卡得动不了”这些日常运维噩梦深有体会。我自己从零开始搭建、维护一个中等规模的 FiveM 服务器,到后来管理一个拥有数…...

Godot 4项目模板实战:模块化架构与工程化开发指南

1. 项目概述与核心价值最近在社区里看到不少朋友对 Godot 引擎跃跃欲试,但往往卡在第一步:如何快速搭建一个结构清晰、易于维护的初始项目?很多新手会直接从官方文档的“Hello World”开始,但随着功能增加,代码很快就变…...

从零到一:基于iSYSTEM winIDEA与IC5000的嵌入式程序烧写与调试实战指南

1. 环境准备:搭建你的嵌入式开发工作台 第一次接触iSYSTEM工具链时,我完全被各种专业术语搞懵了。后来才发现,只要把环境搭好,后面的操作就像拼乐高一样简单。这里我会手把手带你配置好winIDEA和IC5000调试器,避开那些…...

避坑指南:Quartus II 18.1中Platform Designer配置Nios II软核的5个关键细节与常见错误

Quartus II 18.1中Platform Designer配置Nios II软核的深度避坑指南 在FPGA开发中,Nios II软核处理器的配置看似简单,实则暗藏诸多细节陷阱。许多开发者在Platform Designer(原QSYS)中按部就班完成配置后,往往会遇到各…...

Switch游戏安装终极指南:Awoo Installer 让你的游戏体验更简单高效

Switch游戏安装终极指南:Awoo Installer 让你的游戏体验更简单高效 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 还在为Switch游戏安…...

深入解析poll函数:高效I/O多路复用技术

引言在上一篇文章中,我们详细讲解了 select 函数的使用。select 作为最基础的 I/O 多路复用机制,虽然简单易用,但存在两个明显的局限性:文件描述符数量限制:默认最多只能监控 1024 个描述符每次调用需要重新构建集合&a…...

终极指南:Awoo Installer - 快速安装Switch游戏的完整教程

终极指南:Awoo Installer - 快速安装Switch游戏的完整教程 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer Awoo Installer是一款专为Ni…...

【深度解析】Hermes Agent:持久记忆、自学习闭环与桌面化 Autonomous AI 工作流实践

摘要 Hermes Agent 的核心价值不只是“带工具的聊天机器人”,而是面向长期运行的自主智能体系统。本文从持久记忆、自学习技能、工具编排和桌面化管理角度,解析其架构思想,并给出一个可落地的 Python 实战示例。背景介绍:从 Chatb…...

ViGEmBus完全指南:轻松解决Windows游戏手柄兼容性难题

ViGEmBus完全指南:轻松解决Windows游戏手柄兼容性难题 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过这样的困扰:在…...

从零构建AI编程助手:Groundhog项目解析与Rust实现

1. 项目概述:一个从零开始理解AI编程助手的教学项目如果你和我一样,对Cursor、GitHub Copilot这类AI编程助手背后的工作原理感到好奇,甚至有点“黑盒”恐惧,那么这个叫Groundhog的项目,可能就是为你量身打造的。它不是…...

抖音无水印下载器完整指南:5分钟快速上手免费批量下载

抖音无水印下载器完整指南:5分钟快速上手免费批量下载 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppo…...

PyCharm直连Spark集群:一站式配置与避坑指南

1. 为什么需要PyCharm直连Spark集群? 作为数据工程师,我经常需要在本地开发Spark应用,然后部署到远程集群执行。传统方式是本地写完代码后,手动上传到服务器再用spark-submit提交,这个过程既繁琐又容易出错。直到发现P…...

douyin-downloader:抖音内容获取的技术架构与实践应用

douyin-downloader:抖音内容获取的技术架构与实践应用 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppo…...

别再复制粘贴了!手把手教你从零搭建STM32F429 MDK5工程模板(附完整源码包)

从零构建STM32F429工程模板:避开新手90%的踩坑点 第一次拿到STM32F429开发板时,我盯着满屏的英文文档和零散的教程发愣——网上能找到的要么是过时的Keil4配置指南,要么直接丢给你一个现成工程文件。这种"复制粘贴式"的学习让我在后…...

开源营销技能图谱:构建个人与团队的数字化能力体系

1. 项目概述:一个营销人的开源技能库如果你在营销行业摸爬滚打过几年,大概率会和我有一样的感受:这个领域变化太快了。今天还在研究信息流广告的OCPM出价,明天可能就要琢磨AIGC内容生成;刚把SEO的站内优化搞明白&#…...

WelsonJS:基于Windows原生WSH的现代JavaScript桌面应用开发框架

1. 项目概述:WelsonJS,一个被低估的Windows原生JavaScript框架如果你是一名Windows平台的开发者,或者经常需要处理一些自动化、脚本任务,你可能对Node.js、Electron甚至PowerShell都很熟悉。但今天我想聊一个有点“复古”却又极其…...