尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Project NOMAD RAG原理拆解:Qdrant向量检索如何实现离线语义搜索

Project NOMAD RAG原理拆解:Qdrant向量检索如何实现离线语义搜索 Project NOMAD RAG原理拆解Qdrant向量检索如何实现离线语义搜索【免费下载链接】project-nomadProject NOMAD is an offline-first knowledge and education server. Wikipedia, thousands of books, courses, maps, and optional local AI, all running on hardware you own with no internet required.项目地址: https://gitcode.com/GitHub_Trending/pr/project-nomadProject NOMAD是一个离线优先的知识与教育服务器维基百科、成千上万本书籍、课程、地图以及可选的本地 AI 助手全部运行在你自己的硬件上完全不需要互联网。它最吸引人的能力之一是让本地大模型读懂你的私有文档——这正是 RAG检索增强生成技术的舞台。本文将拆解 NOMAD 如何用Qdrant 向量数据库 本地嵌入模型实现一套完整的离线语义搜索流水线。先认识一下 Project NOMAD ️NOMAD 把整套知识基础设施打包成 Docker 容器Ollama 负责跑本地大语言模型Qdrant 负责存向量索引Kiwix 负责离线维基百科内容而管理面板则提供上传文档、管理知识库、与 AI 对话等入口。RAG 的核心思路一句话概括把文档切成小块 → 用嵌入模型转成向量 → 存进 Qdrant → 提问时检索最相关的块 → 塞给大模型当参考资料。NOMAD 全程离线完成没有任何数据离开你的机器。第一步把文档变成 768 维向量RAG 的起点是嵌入Embedding。NOMAD 选用本地模型nomic-embed-text v1.5它把任意文本压缩成一个768 维的浮点数组定义见 admin/constants/ollama.ts。语义相近的文本向量在空间里距离也更近——这就是语义搜索的数学基础。几个关键工程细节藏在核心服务 admin/app/services/rag_service.ts 中参数取值作用分块目标大小约 1500 token/块平衡检索精度与模型上下文分块重叠约 150 token避免关键信息被切在两块之间前缀区分search_document:/search_query:nomic 模型的任务提示文档与查询用不同前缀提升区分度批量嵌入8 块/批照顾低配硬件纯 CPU的显存/内存最大安全长度1600 token防止超出模型 2K 上下文窗口在嵌入之前还要把各种格式喂成纯文本PDF 用pdf-parse抽取文本太少时自动逐页转图片做 OCRtesseract.jsEPUB 解包按阅读顺序拼接章节DOCX 用 mammoth 解析图片先灰度化、锐化、放大到 2000px 再 OCR。扫描件、照片笔记都能进入知识库。Qdrant 里怎么存一个集合 丰富的 Payload所有文本块最终写入 Qdrant 的nomad_knowledge_base集合配置为768 维 余弦距离Cosine。每个向量点point除了向量本身还带着一份信息密集的 payloadtext块原文chunk_index/total_chunks块在文档中的位置keywords去停用词后提取的关键词用于后续混合打分source来源文件路径document_id同一篇文章的所有块共享便于结果分组article_title/full_title/hierarchyZIM 文章的结构化标题层级维基百科内容专属collection用户自定义的主题标签如recipes、survival见 admin/constants/kb_collections.ts这些字段不是摆设——source、content_type、collection都建了keyword 类型 payload 索引让只搜某个来源/主题这类过滤查询毫秒级完成。而文件列表、主题列表等界面数据则直接调用 Qdrant 的facet 聚合 API一次拿回全部唯一值避免了遍历上百万向量点的做法。后台的入库由 admin/app/jobs/embed_file_job.ts 驱动上传后文件进入 BullMQ 队列异步处理大型 ZIM 维基百科档案按批切分处理纯 CPU 机器上每批之间还会让出 1 秒给系统其他进程——离线设备性能友好设计的一个缩影。检索全流程从提问到 Top 5 结果当你在前台 AI 聊天框见 admin/app/controllers/ollama_controller.ts提问时检索流水线依次执行五步① 查询改写Query Rewriting多轮对话中那它能用多久这种话无法独立检索。NOMAD 默认用轻量模型qwen2.5:3b把最新问题结合历史改写成独立、可搜索的完整问句。② 查询预处理内置的领域缩写词典会把MRE展开为meal ready to eat、SHTF展开为完整含义——这是针对生存类知识库的贴心优化让口语化、缩写化的提问也能命中。③ 语义检索改写后的查询加上search_query:前缀做嵌入然后向 Qdrant 发起余弦相似度搜索取Top 15目标结果的 3 倍、相似度阈值0.3。多取 3 倍是故意留出的重排序弹药。④ 混合打分重排Hybrid Reranking这是 NOMAD 检索质量的灵魂rerankResults。最终分数 语义分 三重加成且每一重都有质量门质量门语义分低于 0.35 的结果不做任何加成防止碰巧撞上关键词的垃圾结果被抬分关键词重叠加成查询关键词与块内keywords或正文命中比例越高加分越多用平方根做边际递减上限约为原分的 10%直接词匹配加成最高 7.5%与标题命中加成最高 10%查询词出现在文章/章节标题中是强相关信号纯正文匹配往往会漏掉这一点⑤ 来源多样性惩罚同一条结果全部来自同一篇文章会让回答偏科。NOMAD 对同一来源的重复结果施加0.85ⁿ指数衰减确保 Top 5 覆盖多个来源。最后一环按模型身材注入上下文检索到的块要注入给大模型时NOMAD 会根据模型参数量动态限流RAG_CONTEXT_LIMITS1–3B 小模型只喂 2 条、上限 1000 token4–8B 喂 4 条、2500 token13B 以上不限量、最多 5 条。小模型喂太多上下文反而会晕菜这是很实用的工程经验。上下文以系统消息形式插入配套的rag_context提示词明确要求模型先默默判断参考资料是否真的相关不相关就忽略、绝不硬套也不许在回答里暴露检索过程——用户看到的只是一个仿佛早就知道答案的流畅回复。关键源码索引 模块路径RAG 核心分块/嵌入/检索/重排admin/app/services/rag_service.ts对话入口与 RAG 上下文注入admin/app/controllers/ollama_controller.ts嵌入后台作业admin/app/jobs/embed_file_job.ts知识库上传与管理 APIadmin/app/controllers/rag_controller.ts嵌入模型与上下文限流常量admin/constants/ollama.ts主题标签定义admin/constants/kb_collections.ts入库状态机admin/app/models/kb_ingest_state.ts总结离线条款下的完整 RAG 栈Project NOMAD 的 RAG 实现堪称本地化最佳实践样板nomic-embed-text 本地嵌入 Qdrant 向量库 混合重排 自适应上下文注入每一步都为无互联网、低配硬件做了专门取舍——从批量嵌入的保守批大小到 CPU 机器上的批间让时再到小模型的上下文限流。理解这套流水线你也能在自己的项目里搭起一个完全离线的语义搜索引擎。【免费下载链接】project-nomadProject NOMAD is an offline-first knowledge and education server. Wikipedia, thousands of books, courses, maps, and optional local AI, all running on hardware you own with no internet required.项目地址: https://gitcode.com/GitHub_Trending/pr/project-nomad创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表