AI智能体项目实战记录(07):RAG项目实战之文档内容向量化入库
1. 引言在上一篇实战记录中我们已经完成了上传文档的解析工作将 PDF、Word、TXT 等格式的文档内容提取为纯文本。然而仅仅解析出文本还不够——要让 AI 智能体能够读懂并检索这些内容还需要将文本转换为向量并存入向量数据库。本篇是 RAG检索增强生成项目实战的第七篇核心任务是将解析后的文档内容进行切割、向量化并写入 Milvus 向量数据库为后续的语义检索和问答环节打好数据基础。2. 整体流程概览文档从上传到入库整体流程如下上传文档文档解析文本切割向量化 Embedding写入 Milvus可供语义检索本篇聚焦 C、D、E 三个环节文本切割、向量化、入库。3. 环境配置3.1 .env 文件新增参数在项目根目录的.env文件中新增以下配置# 文本切割长度配置 CHUNK_SIZE500 CHUNK_OVERLAP50 # 本地模型驱动cpu:cpugpu:cuda互联网:remote DEVICEcpu # 向量模型地址可以从前面第4篇提到的国内模型官网上面下载一个向量模型放到指定的文件夹下 EMBEDDING_MODEL_PATHD:/AI_Model/modelscope/AI-ModelScope/bge-base-zh-v1.5 # 向量数据库配置 MILVUS_URLhttp://192.168.4.77:19530 MILVUS_USERroot MILVUS_PASSWORD****** # 向量库集合索引 MILVUS_COLLECTION_WEBSITEai_demo_website MILVUS_COLLECTION_DOCai_demo_doc说明以上配置中数据库地址、用户名、密码等敏感信息已做脱敏处理实际部署时请替换为真实值。3.2 settings.py 新增参数在settings.py中将上述环境变量映射为配置字段# 文本切割长度配置chunk_size:intchunk_overlap:int# 模型驱动device:str# 向量模型embedding_model_path:str# 知识向量库milvus_url:strmilvus_user:strmilvus_password:str# 向量库索引milvus_collection_website:strmilvus_collection_doc:str4. 文档解析后切割这个操作实际在上一篇的内容已有文档解析得到完整文本后需要根据配置的chunk_size进行切割。切割的目的是将长文本拆分为适合向量化的片段避免单条文本过长导致向量化效果变差。# 小于文本字数时无需切割iflen(doc_str)setting.chunk_size:splits[doc_str]else:# 创建文本切割器text_splitterRecursiveCharacterTextSplitter(chunk_sizesetting.chunk_size,chunk_overlapsetting.chunk_overlap)splitstext_splitter.split_text(doc_str)4.1 切割参数说明chunk_size500每个文本块的最大字符数。过大会导致向量化精度下降过小则会丢失上下文语义。chunk_overlap50相邻文本块之间的重叠字符数。重叠部分可以保留跨块的上下文信息避免语义断裂。4.2 为什么使用 RecursiveCharacterTextSplitterRecursiveCharacterTextSplitter是 LangChain 提供的递归式文本切割器它会优先按照段落、句子、标点等自然边界进行切割尽量保持语义完整性而不是简单粗暴地按固定长度硬切。5. 文档切割后入库这个操作实际在上一篇的内容已有文本切割完成后将每个文本块向量化并写入 Milvus# 确保文档集合存在且 schema 正确doc_str 为文本字段、vector 为向量字段milvus_service.ensure_doc_collection(setting.milvus_collection_doc)# 写入向量库milvus_service.batch_save_update(collection_namesetting.milvus_collection_doc,document_list[{id:str(uuid4()),name:file.filename,doc_str:split}forsplitinsplits],embedding_column_namedoc_str,saveTrue)5.1 入库逻辑说明ensure_doc_collection确保目标集合存在且 schema 正确doc_str为文本字段、vector为向量字段。batch_save_update批量写入向量库。每个文本块生成一个 UUID 作为主键并携带文件名和文本内容。embedding_column_name‘doc_str’指定对doc_str字段进行向量化。saveTrue表示执行插入操作若为False则执行 upsert更新或插入。6. 用于操作 Milvus 的 Service下面是与 Milvus 交互的核心 Service 层代码封装了集合管理、数据写入、查询、删除等常用操作。#!/usr/bin/env python# -*- coding: utf-8 -*-# File : milvus_service.py# Author: hqg# Date : 2024/9/6# Desc : 用于操作milvus的servicefromtypingimportList,Dict,UnionfrompymilvusimportMilvusClient,CollectionSchema,FieldSchema,DataTypefromloguruimportloggerfromapp.configimportsettingfromapp.service.systemimportembedding_service logger.info(连接Milvus...)milvus_clientMilvusClient(urisetting.milvus_url,usersetting.milvus_user,passwordsetting.milvus_password)logger.info(Milvus连接成功)defbatch_save_update(collection_name:str,document_list:List[Dict],embedding_column_name:strtext,save:boolTrue):text_list[doc[embedding_column_name]fordocindocument_list]embedding_listembedding_service.embedding_text(text_list)foriinrange(len(text_list)):document_list[i][vector]embedding_list[i]ifsaveisTrue:milvus_client.insert(collection_namecollection_name,datadocument_list)else:milvus_client.upsert(collection_namecollection_name,datadocument_list)defdelete_by_filter(collection_name:str,ids:Union[list,str,int]None,filter:str)-Dict:returnmilvus_client.delete(collection_namecollection_name,filterfilter,idsids)defbuild_filter_by_dict(filter_dict:Dict)-str: 将字典条件转换为字符串条件 :param filter_dict: 字典条件 :return: 字符串条件 filter_parts[]forkey,valueinfilter_dict.items():ifvalueisNone:continue# if value is str, add double quotesifisinstance(value,str):filter_parts.append(f{key} {value})# if value is list, use inelifisinstance(value,list):in_str, .join([f{v}forvinvalue])filter_parts.append(f{key}in [{in_str}])else:raiseValueError(fUnsupported filter value type:{type(value)})filter_parts[(part)forpartinfilter_parts]return and .join(filter_parts)defquery(collection_name:str,filter:strNone,limit20,output_fields:List[str][text])-List[Dict]:returnmilvus_client.query(collection_namecollection_name,filterfilter,limitlimit,output_fieldsoutput_fields)defsearch(collection_name:str,embedding:List[float],limit:int,filter:strNone,output_fields:List[str][vector])-List[Dict]:resmilvus_client.search(collection_namecollection_name,data[embedding],limitlimit,filterfilter,output_fieldsoutput_fields)return[eforeinres[0]]defcheck_collection(collection_name:str): 检查集合是否存在 :param collection_name: 集合名称 :return: returnmilvus_client.has_collection(collection_name)defcreate_collection(collection_name:str,schema:CollectionSchema,primary_field_name:strid,id_type:strstring,vector_field_name:strvector,properties:DictNone): 创建集合 :param collection_name: 集合名称 :param schema: 集合结构 :param primary_field_name: 主键名字 :param id_type: id类型 :param vector_field_name: 向量字段名 :param properties: 集合属性 # 创建集合的具体实现pass6.1 核心方法说明方法功能说明batch_save_update批量向量化并写入/更新数据是入库的核心方法delete_by_filter按条件或 ID 删除数据build_filter_by_dict将字典条件转换为 Milvus 过滤表达式字符串query按条件查询数据search向量相似度检索返回最相似的 Top-K 结果check_collection检查集合是否存在create_collection创建集合入库后可以看到7. 小结本篇完成了 RAG 项目中文档向量化入库这一关键环节配置层在.env和settings.py中新增了文本切割、模型驱动、向量模型、Milvus 连接等配置。切割层使用RecursiveCharacterTextSplitter对解析后的长文本进行智能切割兼顾语义完整性与向量化效果。入库层通过milvus_service.batch_save_update将切割后的文本块批量向量化并写入 Milvus。Service 层封装了 Milvus 的增删查改与向量检索能力供上层业务调用。至此文档数据已经以向量的形式存储在 Milvus 中。下一篇实战记录我们将基于这些向量数据实现语义检索与 RAG 问答让 AI 智能体真正读懂文档内容。

相关新闻

RustFS 该跟 stable 还是 nightly?两条版本线的分工、风险与回退,一张表说清

RustFS 该跟 stable 还是 nightly?两条版本线的分工、风险与回退,一张表说清

9 月 16 日装的 1.0.0,10 月 3 日 release 页冒出 1.0.1,同页每个平台还多挂了一个 -latest.zip;另一条线上,每天北京时间 0 点 07 分 CI 会打出一个按日期命名的 nightly 包。跟版本号、跟 latest 别名、跟 nightly,三…

2026/10/19 2:04:29 阅读更多 →
等了六年,IDEA 2026.3终于要实现这个新特性了

等了六年,IDEA 2026.3终于要实现这个新特性了

我虽然用了5年多的IDEA,但是今天先说一个我忍了idea很久的小事 我用 IDEA 写代码的时候,有个习惯:眼睛时不时往右下角瞟一眼,看看当前 Git 分支是什么。这个动作我一天要做几十次,纯属肌肉记忆。 结果有一次 IDEA 升级…

2026/10/19 2:04:29 阅读更多 →
猫狗图像分类实战:CNN/DNN/RNN对比与训练调优全指南

猫狗图像分类实战:CNN/DNN/RNN对比与训练调优全指南

简介:基于Python实现猫狗图像分类的完整项目资源,面向深度学习与计算机视觉入门者,围绕CNN、DNN、RNN三种网络结构,系统演示图像分类任务从数据预处理、模型搭建、训练评估到保存部署的完整链路。CNN部分借助卷积、池化与全连接层…

2026/10/19 2:04:29 阅读更多 →

最新新闻

手把手教你制作每日AI研究简报:信息筛选与追踪方法

手把手教你制作每日AI研究简报:信息筛选与追踪方法

经常看到有人问:AI 领域更新这么快,一天不看是不是就跟不上了?我的回答是,确实会跟不上,但没人能把一天内所有论文和动态都看完,所以才需要“每日 AI 研究简报”这种东西来兜底。2026 年 3 月 28 号这一期&…

2026/10/19 2:42:49 阅读更多 →
从DVWA到实战:文件包含漏洞原理、绕过与防御全解析

从DVWA到实战:文件包含漏洞原理、绕过与防御全解析

文件包含漏洞这几年在Web安全实战里一直没消停过,从早期到处是的任意文件读取,到配合日志投毒、伪协议直接打进内网,这个看起来不起眼的漏洞类型,实际上比SQL注入更容易被忽视,但危害一点不低。我最早认真研究它是在某…

2026/10/19 2:42:49 阅读更多 →
用Markdown与Git构建个人知识库:纯文本、静态站点与本地搜索的工程实践

用Markdown与Git构建个人知识库:纯文本、静态站点与本地搜索的工程实践

1. 项目到底在做什么:从一个占位符说起的知识库需求“11111111”这个编号看起来特别随意,但它确实是我手头一个折腾了快两个月的项目的代号。项目本身不是二进制数,也不是什么密码学研究,而是一套以 Markdown 为核心的个人知识库管…

2026/10/19 2:42:49 阅读更多 →
智能车MATLAB仿真完全指南:运动学模型与路径跟踪控制

智能车MATLAB仿真完全指南:运动学模型与路径跟踪控制

简介:这是一份智能车MATLAB仿真代码更新版资源包,面向智能车竞赛参赛者与仿真建模初学者,帮助读者通过模块化代码快速搭建车辆运动学与控制算法仿真环境。相比旧版,代码按车身、电机、转向、摄像头、控制等部件分类封装&#xff0…

2026/10/19 2:42:49 阅读更多 →
物理AI世界模型:扩散迭代与一步生成的权衡之道

物理AI世界模型:扩散迭代与一步生成的权衡之道

物理AI 世界模型这两年突然成了热词,不管做机器人的、搞自动驾驶的,还是做视频生成的,都在往这条赛道上挤。但真正动手搭过这套东西的人,心里多半都有笔账:扩散模型那套迭代去噪生成质量确实好,可推理延迟高…

2026/10/19 2:42:49 阅读更多 →
Redis常用命令实战:从基础操作到线上排查避坑

Redis常用命令实战:从基础操作到线上排查避坑

Redis装完,redis-cli一敲,能ping通,然后呢?说句实话,很多人对redis基础常用命令的了解,就停在SET一个值、GET一个值。真实业务里一踩坑,连查一个key还剩多久过期都要翻半天文档。这篇文章就想把…

2026/10/19 2:41:48 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →