<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Python - Tag - 傲来说的博客</title><link>https://aolaishuo.cc/tags/python/</link><description>Python - Tag - 傲来说的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 27 May 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://aolaishuo.cc/tags/python/" rel="self" type="application/rss+xml"/><item><title>我用纯 Python 手搓了一个 RAG 知识库：不用 LangChain，也能让文档开口说话</title><link>https://aolaishuo.cc/posts/%E6%88%91%E7%94%A8%E7%BA%AFpython%E6%89%8B%E6%90%93%E4%BA%86%E4%B8%80%E4%B8%AArag%E7%9F%A5%E8%AF%86%E5%BA%93/</link><pubDate>Wed, 27 May 2026 00:00:00 +0800</pubDate><author>傲来说</author><guid>https://aolaishuo.cc/posts/%E6%88%91%E7%94%A8%E7%BA%AFpython%E6%89%8B%E6%90%93%E4%BA%86%E4%B8%80%E4%B8%AArag%E7%9F%A5%E8%AF%86%E5%BA%93/</guid><description><![CDATA[<h1 id="我用纯-python-手搓了一个-rag-知识库不用-langchain也能让文档开口说话">我用纯 Python 手搓了一个 RAG 知识库：不用 LangChain，也能让文档开口说话</h1>
<blockquote>
<p>全文约 3000 字，阅读需要 6 分钟</p></blockquote>
<hr>
<h2 id="起因">起因</h2>
<p>最近工作里有个很具体的痛点：文档太多，而且太杂。</p>
<p>合同扫描件、行业报告、内部资料、会议截图、Word、Markdown、PDF，格式五花八门。真正要用的时候，最麻烦的不是“有没有这份资料”，而是“我到底在哪份资料里见过这句话”。</p>
<p>我想要的东西其实很简单：</p>
<p>把这些文档丢进一个系统里，以后直接用自然语言提问，它能从资料里找依据、给答案、贴出处。</p>
<p>市面上当然有很多方案。但试了一圈，总觉得不完全合适：</p>
<ul>
<li>有的太重，依赖链很长，调一个小功能要理解一堆抽象；</li>
<li>有的太贵，OCR、Embedding、LLM 全走 API，文档量一大成本就上来了；</li>
<li>有的隐私边界不够清楚，公司资料直接传第三方服务器，这事很难放心。</li>
</ul>
<p>于是我干脆自己写了一个。</p>
<p>项目名叫 <strong>RagLite</strong>：轻量、透明、尽量把重计算放在自己手里。</p>
<hr>
<h2 id="它能干什么">它能干什么？</h2>
<p>一句话：<strong>把你的文档变成一个可对话的知识库。</strong></p>
<p>比如扔进去 35 张截图，或者一本 459 页的扫描版 PDF，等它完成 OCR、分块、向量化和入库之后，就可以直接问：</p>
<blockquote>
<p>“将军崖岩画是什么？”</p></blockquote>
<p>它会先从知识库里检索相关片段，再调用大模型生成回答，并把来源一起贴出来。这样你既能快速得到结论，也能回到原文核对。</p>
<p>目前支持这些文件：</p>
<ul>
<li>Markdown / 纯文本</li>
<li>Word（<code>.docx</code>）</li>
<li>PDF，包括纯图片扫描件</li>
<li>图片截图（PNG / JPG）</li>
</ul>
<p>我最看重的是两点：</p>
<p>第一，原始文件不必交给第三方平台。OCR 和向量化默认都可以在本机完成。</p>
<p>第二，代码路径足够短。出了问题，你能直接打开对应文件看懂它在做什么。</p>
<hr>
<h2 id="为什么不用-langchain">为什么不用 LangChain？</h2>
<p>不是 LangChain 不好。</p>
<p>它解决的是“快速搭建复杂 LLM 应用”的问题，生态、集成、抽象都很完整。但我的需求没有那么复杂：文档解析、OCR、分块、Embedding、检索、生成，链路清楚，能跑稳就行。</p>
<p>很多时候，框架的抽象层会在前期让你觉得省事，到了调试阶段又把问题藏起来。链条、Agent、Tool、Memory，每个概念都包了一层。检索结果不对时，你可能要一路穿过好几层封装，才能找到真正影响结果的那个参数。</p>
<p>RagLite 的思路更朴素：</p>
<p><strong>每个模块自包含，能少一层就少一层。</strong></p>
<p>项目结构大概是这样：</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-text">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">config.py          # 配置，一个 dataclass
</span></span><span class="line"><span class="cl">ingest/
</span></span><span class="line"><span class="cl">  ocr.py           # OCR，调用本地 Ollama
</span></span><span class="line"><span class="cl">  chunker.py       # 文档分块
</span></span><span class="line"><span class="cl">  embed.py         # 向量化，支持多种模式
</span></span><span class="line"><span class="cl">  pipeline.py      # 入库流水线
</span></span><span class="line"><span class="cl">serve/
</span></span><span class="line"><span class="cl">  store.py         # ChromaDB 存储
</span></span><span class="line"><span class="cl">  retriever.py     # 混合检索
</span></span><span class="line"><span class="cl">  api.py           # FastAPI 接口
</span></span><span class="line"><span class="cl">  mcp_server.py    # MCP 协议</span></span></code></pre></div></div>
<p>没有太多魔法。哪一步出问题，就看哪一个文件。</p>]]></description></item></channel></rss>