数据处理
面对企业里最常见的“表格数据”(Excel、数据库表),大模型(LLM)其实很难直接“理解”或“检索”它们。
为了让大模型能用上这些数据,工程师们总结出了这两条完全不同的技术路线:
一是将部分关键字段按照特定的文本模板拼成一个text段落,去构建文本知识库:这样可以模糊语义搜索,但是丢失精确性:你没法问“GPA 大于 3.5 的人有多少个?”这种数学问题
二是利用Text2SQL的技术,直接去查询结构化数据库表进行生成。不移动数据,而是教大模型写 SQL 语句,让它直接去指挥数据库干活。为了“精确统计”和“逻辑运算”。但是对于复杂表大模型写的SQL可能就会报错或者查不出数据。
- 检索时:用小切片(Chunk),因为它语义聚焦,更容易匹配到准确的锚点。
- 生成时:用扩展后的长文本(Context),因为它包含前因后果,LLM 读起来更连贯,幻觉更少。
在建立支持双层检索(Milvus + PostgreSQL)的系统时,数据处理和清洗通常分为结构化数据(PostgreSQL)和非结构化数据(Milvus)两条不同的链路。结合你项目目录中的 DatabaseInitializer.java、ProductChunkTypeConstant.java 等文件,典型的数据处理流程如下:
1. 结构化数据 (PostgreSQL) 的清洗与入库
这部分数据主要用于 Text2SQL 的精准查询(如商品库存、订单状态、用户信息)。
- 格式标准化: 将不同源提取的数据统一格式。例如,统一时间戳格式(ISO 8601)、统一金额单位(全部转为分或元)、统一状态码枚举。
- 异常与缺失值处理: 清理冗余字段,填补或过滤关键字段(如
item_id、price)为空的脏数据。 - 约束与索引: 通过
DatabaseInitializer.java等脚本,在建表时建立主键、外键约束以保证数据完整性,并为高频查询条件打上 B-Tree 索引。
2. 非结构化语义数据 (Milvus) 的清洗与切分 (Chunking)
这部分数据是 RAG 的核心语料(产品手册、客服话术、退换货政策等)。
- 文本清洗 (Text Cleaning):
- 去除 HTML 标签、不可见特殊字符、多余的空格和换行。
- 去除无意义的停用词或干扰信息(如网页底部的法律声明)。
- 语义切块 (Chunking):
项目中的ProductChunkTypeConstant.java表明系统实施了数据分块策略。大型文档不能直接向量化,必须进行切分。- 规则分块: 按段落、句号或固定字数(如 500 Token)进行滑动窗口切分(保留一定比例的 Overlap/重叠片段以上下文衔接)。
- 语义分块: 针对 QA 库,按“问题+答案”对进行强制打包切分,确保完整性。
- 元数据打标 (Metadata Tagging):
为切分好的文本块附加结构化标签(如所属item_id、category、doc_type),这正是支持 Milvus 标量过滤(Scalar Filtering)和混合检索的基础。
3. 向量化 (Embedding) 与双写
- 将清洗和切分好的 Text Chunk 调用大语言模型的 Embedding 接口(推测由项目中的
pipeline/控制或自定义 Client 处理)转化为浮点向量。 - 将原始文本块及其元数据存入关系型库(或 MongoDB),并将“向量 + 对应记录的 ID + 标量元数据”存入 Milvus。******
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Comments


