RAGDemo — 一个学习示例(Demo)

RAGDemo --- 一个学习示例(Demo)

说明:本仓库是一个轻量级的演示项目,用来说明如何在本地用 ONNX 模型生成嵌入并做简单的向量检索。它并不是一个生产就绪的系统,主要用于学习、验证思路与原型开发。

如果你的目标是构建可在生产环境运行的 RAG 平台,请把本项目当作起点或参考,后续还需要完善性能、安全性、持久化和运维方面的工作。

Github: https://github.com/wosledon/RAGDemo

这是什么(简短)

  • 一个示例:展示如何把文本分段、通过本地 ONNX 模型生成嵌入,并在简单的向量存储中检索相似段落。
  • 目标是学习与快速试验,而不是替代成熟的向量数据库或商业服务。

我能帮你快速做什么

  • 演示如何在本地运行一个端到端的小型 RAG 流程
  • 提供可读的示例代码,方便你在此基础上扩展或替换组件

限制(请注意)

  • 不适合直接用于生产:缺少完善的并发控制、持久化策略、索引压缩、分布式支持与监控
  • 模型与 tokenizer 的兼容性需用户自行确认(不同模型可能输出不同维度或需要不同的预处理)
  • 性能与规模受限于本地实现和示例向量存储

快速上手(示例)

  1. 克隆并构建:
pwsh 复制代码
git clone <your-repo-url>
cd RAGDemo
dotnet build RAGDemo.slnx
  1. 准备好示例模型(项目自带 models/all-MiniLM-L6-v2/):

将 ONNX 模型及 tokenizer 相关文件放入 models/ 对应目录,并在 RAGDemo/Config.cs 中确认路径。

  1. 运行演示:
pwsh 复制代码
dotnet run --project RAGDemo/RAGDemo.csproj

运行后程序会用 test_data/ 中的示例文本构建一个小型索引并演示一次检索流程。

代码中关键点(快速导航)

  • 文档加载:RAGDemo/IO/DocumentLoader.cs
  • 嵌入实现:RAGDemo/Embeddings/OnnxEmbeddings.cs
  • Tokenizer 桥接:RAGDemo/Embeddings/TokenizerBridge.cs
  • 检索器:RAGDemo/Retriever.cs
  • 向量存储示例:VectorStore/IVectorStore.cs, VectorStore/InMemoryVectorStore.cs

如果你想把 demo 推向生产(建议起点)

  1. 把向量存储替换为成熟后端(如 Qdrant、Milvus、FAISS 服务化等)
  2. 增加并发、安全(认证/授权)与监控能力
  3. 为模型推理引入批处理、GPU/加速库或服务化部署
  4. 添加单元测试与集成测试,完善 CI/CD 流程

运行

bash 复制代码
RAGDemo --- 本地向量化与检索演示
[TokenizerBridge] Loaded tokenizer from: ./models/all-MiniLM-L6-v2\tokenizer.json
ONNX model loaded. Input metadata:
 - input_ids: System.Int64 -1x-1
 - attention_mask: System.Int64 -1x-1
 - token_type_ids: System.Int64 -1x-1
Using model path: ./models/all-MiniLM-L6-v2\model.onnx
输入 'help' 查看可用命令。

rag> help
可用命令:
  import <dir>         --- 从目录导入并索引所有支持的文档(txt, md, html, pdf, docx, xlsx)。
  index <file>         --- 对单个文件解析并索引(支持同上扩展名)。
  query <text>         --- 对查询文本向量化并检索 top-K 文档。返回 id, score, metadata。
  save <path>          --- 将当前索引保存到磁盘(默认 ./index.json)。
  load <path>          --- 从磁盘加载索引(默认 ./index.json)。
  help                 --- 显示此帮助。
  exit | quit          --- 退出程序。

索引说明:
  文档会被分块(chunk),默认 chunk size= 800, overlap= 200。
  每个 chunk 会单独向量化并存为 id: <filename>#chunk-i,metadata 为原始文件路径。
rag> load
Index loaded from ./index.json
rag> query 劳斯莱斯
[TokenizerBridge] Loaded tokenizer from: ./models/all-MiniLM-L6-v2\tokenizer.json
Top results:
Result #1 --- id=新建 文本文档 (2).txt#chunk-0 score=0.8838
  source: C:\Users\BSI\Desktop\doc\新建 文本文档 (2).txt
  chunk: 0
  snippet:
劳斯莱斯是英国的豪华汽车品牌,经常被用来比喻极致的品质。
Result #2 --- id=新建 文本文档 (3).txt#chunk-0 score=0.8770
  source: C:\Users\BSI\Desktop\doc\新建 文本文档 (3).txt
  chunk: 0
  snippet:
科目, 科目余额, 科目是什么, 啊啊啊啊科目
Result #3 --- id=chinese_notes.txt#chunk-0 score=0.7866
  source: C:\Users\BSI\Desktop\doc\chinese_notes.txt
  chunk: 0
  snippet:
记账 报表 这是一些测试文本,用于验证记账查询是否能够匹配。 账目分类:资产、负债、收入、费用。 记账原则:借贷平衡,分录清晰。
rag> query 记账
[TokenizerBridge] Loaded tokenizer from: ./models/all-MiniLM-L6-v2\tokenizer.json
Top results:
Result #1 --- id=chinese_notes.txt#chunk-0 score=0.7685
  source: C:\Users\BSI\Desktop\doc\chinese_notes.txt
  chunk: 0
  snippet:
记账 报表 这是一些测试文本,用于验证记账查询是否能够匹配。 账目分类:资产、负债、收入、费用。 记账原则:借贷平衡,分录清晰。
Result #2 --- id=新建 文本文档 (2).txt#chunk-0 score=0.8682
  source: C:\Users\BSI\Desktop\doc\新建 文本文档 (2).txt
  chunk: 0
  snippet:
劳斯莱斯是英国的豪华汽车品牌,经常被用来比喻极致的品质。
Result #3 --- id=新建 文本文档 (3).txt#chunk-0 score=0.8618
  source: C:\Users\BSI\Desktop\doc\新建 文本文档 (3).txt
  chunk: 0
  snippet:
科目, 科目余额, 科目是什么, 啊啊啊啊科目
rag>

贡献与反馈

这个项目欢迎改进与讨论。如果你有补丁、想法或发现问题,请提交 Issue 或 PR。