摘要:本文是 VeapAI 企业 AI 知识库实战系列的第三篇,聚焦知识主题与召回参数。文章先厘清知识主题在链路中的三重职责(组织层级、绑定字段标准、承接问答召回参数),再拆解两张核心表的设计要点,随后演示页面操作流程,并走读前后端源码入口。最后指出「参数外置」这一最值得借鉴的设计思路,以及 enabled 字段类型等容易抄错的细节,并给出可复现的两级主题与召回参数配置步骤。
# 从零打通企业 AI 知识库全链路:VeapAI 实战(三)知识主题与召回参数
> 关键词:开源知识库、知识主题、RAG 召回参数 | 首发:CSDN | 同步:知乎 / 掘金
![本系列 8 步流程总览(当前:③ 创建知识主题)]

## 主题这层,到底管什么
知识主题在链路里是个"分类器",但只做分类就浅了。VeapAI 里主题同时干了三件事:组织层级(父子主题)、绑定字段标准(standard_code)、承接问答的召回参数(通过配置表)。第三件最容易被低估,放最后说。
## 表设计
`ai_knowledge_topic` 关键字段:
| 字段 | 说明 |
| ---- | ---- |
| `parent_id` | 上级主题,默认 0。预算评审项目 → 类别清单 → 费用明细项就是多级主题的用法 |
| `code` / `title` | 主题编码和标题 |
| `standard_code` | 绑定的元数据标准编码 |
| `status` / `approval_status` / `open_status` | 状态、审核状态、开放状态三件套 |
注意 `standard_code` 是编码不是主键。标准本身有版本概念,主题绑定编码比绑定 ID 稳,标准的版本演进不影响主题这一侧的引用语义。
主题和知识点是一对多(`ai_knowledge_entry.topic_id`),知识点留到第 5 篇讲。
第二张表是 `ai_app_topic_knowledge_config`,应用主题和知识主题之间的桥:
| 字段 | 说明 |
| ---- | ---- |
| `app_topic_id` / `knowledge_topic_id` | 两侧主键 |
| `query_limit` | 该知识主题最大召回条数,必须正整数 |
| `min_score` | 最低匹配度阈值,decimal(10,4),建议范围 0.0000–1.0000 |
| `prepend_title` | 命中知识点展示的前置标题 |
| `sort` | 同一应用主题下多个知识主题的追加顺序,越小越靠前 |
| `weight_factor` / `permission_factor` | 权重系数、权限系数 |
| `enabled` | 0 停用 1 启用 |
表上有条索引值得注意:`idx_app_topic_enabled_sort(app_topic_id, enabled, sort)`。问答选知识主题时就是按这个顺序取,索引和查询路径对上了。
顺带看两个容易被略过的字段:`weight_factor`(权重系数)和 `permission_factor`(权限系数)。这是两个方向的扩展位——权重管"多个知识主题谁更权威",召回后按系数调整排序;权限管"不同用户群看到的知识面",配合租户和行权限做过滤。V1 里这两个字段先留在表里,但"加一个检索维度不用改表结构"这件事,已经提前安排好了。检索参数外置的价值不止是改数不改代码,更是给未来的排序和权限维度留了座位。
## 页面操作
![知识主题列表]

「AI 知识库 → 知识主题」建主题,选上级主题、填编码标题、绑元数据标准编码。
![应用知识配置]

再到「AI 知识库 → 应用知识配置」把应用主题(比如"政策问答")和知识主题绑上,填召回条数、匹配度阈值、前置标题。一个应用挂多个知识主题时,用排序字段控制先后。
"政策问答"最后能答得好不好,一半在模型,一半就在这里这几个数。min_score 设高了召回空,设低了噪音多,下一篇解析完资料后,第 7 篇调试搜索就是用来现场调这几个值的。
## 源码走读
两个入口都在 `veap-ai` 模块:
- `com.veap.ai.controller.AiKnowledgeTopicController`,basePath `/knowledgeTopic`,标准 CRUD;
- `com.veap.ai.controller.AiAppTopicKnowledgeConfigController`,basePath `/appTopicKnowledgeConfig`。
前端封装在 `veap-ui/src/api/ai/knowledgeTopic.js` 和 `appTopicKnowledgeConfig.js`,页面在 `veap-ui/src/views/ai/knowledgeTopic/`、`appTopicKnowledgeConfig/`。
## 一个容易抄错的点
`query_limit`、`min_score` 这类召回参数,很多实现是直接写在问答代码里的,改一次发一次版。这里拆成配置表,一行记录改完立刻生效,而且每个知识主题各配各的,不用互相迁就。这套"参数外置"的思路,比参数本身更值得抄。
顺带说一句,`enabled` 是 char(1) 不是 tinyint,查代码时别按数字处理。字段类型不一致在这种混合设计里是常见的坑,SQL 里写清楚比注释管用。
还有一个人性化字段:`prepend_title`。它给命中的知识点加展示前置标题,问答结果列表里每个命中项前面先给一行标题。用户看结果时是先扫标题再点进去的,标题给对了,命中列表的可读性好一大截。这个字段小,但问答页的第一眼体验就在它身上。
## 复现
在第 2 篇的基础上建一个两级主题(父主题 + 子主题),再到应用知识配置里绑定一个应用主题,query_limit 填 5、min_score 填 0.6,后面第 6、7、8 篇会反复用到这组参数。
下一篇讲最重的一环:附件上传与文档解析,统一 PDF 预览和页级片段是怎么来的。
项目与源码:https://gitee.com/mindock/veap
知识主题与召回参数&spm=1001.2101.3001.5002&articleId=164096865&d=1&t=3&u=4f67c1c51798454c8811c64afeff5b80)
4968

被折叠的 条评论
为什么被折叠?



