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() : 合并过短的块

分块策略 :

  1. 按段落分割
  2. 段落过长时按字符数切分(确保UTF-8边界)
  3. 短段落合并,避免碎片化
  4. 相邻块保留重叠,保证上下文连贯

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)

文件处理流程 :

  1. 格式验证(仅支持txt/md)
  2. 大小限制(5MB)
  3. 编码检测(UTF-8)
  4. BOM头清理
  5. 非法字符过滤(控制字符等)
  6. 分块解析
  7. 批量写入数据库

三、知识检索流程(与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.上传知识文档

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进行增强检索

posted @ 2026-08-11 11:30  wssheng  阅读(1)  评论(0)    收藏  举报