14.板端Qwen3-VL知识库实现
一、整体架构

二、核心组件
1. ChunkParser(文档分块器)
职责 :将上传的文本文档切割成合适大小的知识块
关键参数 :
- min_chunk_size_ : 最小块大小,默认150字符
- max_chunk_size_ : 最大块大小,默认250字符
- overlap_size_ : 重叠字符数,默认30字符
核心方法 :
- parse_text() : 解析文本内容为块
- get_utf8_boundary() : 确保在UTF-8字符边界分割 (解决中文乱码关键)
- merge_short_chunks() : 合并过短的块
分块策略 :
- 按段落分割
- 段落过长时按字符数切分(确保UTF-8边界)
- 短段落合并,避免碎片化
- 相邻块保留重叠,保证上下文连贯
2. KnowledgeStore(知识存储)
职责 :知识的持久化存储与检索

检索算法 :IDF加权包含相似度
核心思想:用查询的n-gram在文档中查找匹配,按IDF加权计算得分
1. 将查询和文档都转为2-gram集合
2. 统计每个gram在所有文档中的出现频率(df)
3. 计算每个gram的IDF权重: log((总文档数+1)/df)
4. 匹配得分 = 匹配到的gram权重之和 / 查询所有gram权重之和
5. 阈值过滤(默认0.3),取Top-K(默认5)
3. rag_server(Web服务)
职责 :提供HTTP接口供用户上传文档
技术栈 :cpp-httplib(轻量级C++ HTTP库)
接口 :
- POST /upload : 上传文档(支持.txt和.md)
- GET / : 上传页面(upload.html)
文件处理流程 :
- 格式验证(仅支持txt/md)
- 大小限制(5MB)
- 编码检测(UTF-8)
- BOM头清理
- 非法字符过滤(控制字符等)
- 分块解析
- 批量写入数据库
三、知识检索流程(与LLM集成)
在 main.cpp 中,用户提问时的处理流程:

关键判断逻辑 :
- 相似度 >= 0.3 时使用知识库
- 相似度 >= 0.3 时使用记忆库
- 知识库优先,记忆库补充
四、技术选型决策

五、关键问题与解决方案

六、文件清单
deploy/src/
├── knowledge_store.h # 知识存储接口定义
├── knowledge_store.cpp # 知识存储实现(含检索算法)
├── chunk_parser.h # 分块器接口
├── chunk_parser.cpp # 分块器实现(UTF-8处理)
├── rag_server.cpp # Web上传服务
├── main.cpp # 主程序(集成知识+记忆+LLM)
└── memory_store.h # 对话记忆(已有)
七.使用方式
1.启动文档上传服务
./rag_server --db knowledge.db --port 8080 --web ./web
2.上传知识文档
- 浏览器访问 http://ip:8080
- 选择txt/md文件上传
3.启动对话程序
./demo demo.jpg ../models/qwen3-vl_vision_rk3588.rknn ../models/qwen3-vl-2b-instruct_w8a8_rk3588.rkllm 2048 4096 3 "<|vision_start|>" "<|vision_end|>" "<|image_pad|>"
4.查看知识库
sqlite3 knowledge.db
> SELECT * FROM knowledge_base LIMIT 5;
> SELECT * FROM documents;
八.边界情况处理
- 空文档 :上传时检测并拒绝
- 非UTF-8编码 :检测编码,提示用户转换
- 超大文件 :5MB限制,防止内存溢出
- 知识库为空 :检索时直接返回空结果
- 并发访问 :使用 std::mutex 保护数据库操作
八.实际运行结果
1.文档上传

2.知识库查看

3.RK3588 使用RAG进行增强检索

浙公网安备 33010602011771号