夜雨聆风学习资料网

ARTICLE · 1119795

零代码文档驱动大模型开发---AI办公助手系列-多知识库管理-一个进多个库

零代码文档驱动大模型开发---AI办公助手系列-多知识库管理-一个进多个库
之前做「本地知识库」时,一个文档只能打一个标签,知识库靠这个标签来区分。比如把《微积分讲义》标成「高等数学」,它就只能待在那个标签下。但实际上,一份资料常常同时属于好几个主题——《微积分讲义》既想放进「高等数学」,又想放进「期末复习重点」。之前的标签方案,没有兼顾到这个。这一篇,就把"标签"升级成真正的"多知识库"。
一、项目需求
一个文档,可能同时属于多个库;一个库,要能容纳一堆文档。实际要的是:
• 建多个库,能增、能删、能改名;
• 一个文档能进多个库,而不是二选一;
• 在哪个库问,就只在哪个库里检索答案,互不串味。
而且底线不变:全程本地,数据不出本机。
二、项目功能
• 多知识库管理:AiPanel 里一个「管理」按钮,弹窗里建库、重命名、删库,还能看每个库里有哪些文档、把文档从库里移出去。
• 一个文档进多个库:加入知识库时选库(也能新建库),同一个文档可以反复加到不同库。
• 按库检索:知识库问答时,下拉选一个库,只在这个库里检索。

三、功能优化背后的思考

决策一:为什么不"改老表",而是"加关联表"?

缺点:老的知识库表里,一个文档是唯一的一行。要做"一个文档进多个库",最直接的想法是"把这行的唯一约束去掉"。但这一改,数据库里外键约束会崩,而且已经算好的那一堆向量要么丢、要么重算,成本巨大。

优化方案:不动老表,新增两张表——一张存"库",一张存"文档和库的对应关系"。老数据一行不动,多库靠新表"多打几个对勾"来实现。

思维沉淀:能"加"就别"改"。增量改动,保住了已经算好的资产;动老结构,等于把之前的成果推倒重来。升级一个系统,最省事也最安全的姿势,是"在边上加一张表",而不是"把现有的表翻个底朝天"。

决策二:一个文档进多个库,chunks 为什么不复制?

缺点:一个文档进了两个库,直觉上"两个库各存一份内容"。但这份内容里最贵的是那串向量——同一个文档,在两个库里向量是完全一样的,存两份就是纯浪费,还得算两遍。

优化方案:把文档的内容(chunks + 向量)只存一份,挂在"文档"身上;"它属于哪个库"只靠关联表多记几行。这样进十个库,内容也还是那一份。

思维沉淀:内容和"它属于哪",是两件正交的事。别把不该绑死的绑在一起。内容变了是内容的事,归属变了是归属的事,分开存,两边都能独立演化。

决策三:迁移旧数据,为什么 tag 回填要先"去重"?

缺点:我手里已经有一批"标签"数据,升级时要把标签变成库。可老数据里可能有"数学"和" 数学 "这种看着一样、实际带个空格的重名标签。如果直接建库,建到第二个"数学"时就会撞上"库名唯一"的约束,升级直接卡死,连软件都打不开。

优化方案:回填之前,先做一步"规范化 + 去重"——把空格、空标签先规整,重名的合成一个库,再往下建。

思维沉淀:迁移最怕的不是丢数据,是"卡死在半路"。老数据是脏的,什么怪值都可能有。升级前先想清楚这些边角情况,别让一个带空格的重名,把整个升级流程堵死。

决策四:删库、删文档,孤儿数据怎么清?

缺点:一个文档同时属于 A、B 两个库。删 A,不能把文档也删了——B 还在用它。可要是 A、B 都删了,这个文档就成"没人要的孤儿",留在库里就是垃圾数据。

解法:删库只删"库和文档的对应关系",删完之后再查一句——"还有没有别的库要这个文档?"没有,才把文档连同它的向量一起清掉。同理,把文档从某个库里移出去,也要先看它是不是"最后一个归属",是才真删。

思维沉淀:删除的难点,不在"删"这个动作,在"什么时候才真的该删"。数据库里最脏的数据,就是那些"表面删了、其实还赖着"的孤儿。删之前多问一句"还有没有人要它",才不会留一堆没人要的垃圾。

相关学习资料