数据截至 (上游 commit 081bc084a5bc)
LLMWare —— 总览:这是什么 / 全景图 / 主线 / 阅读地图
30 秒导读: LLMWare 是一个本地优先的 RAG(检索增强生成,Retrieval-Augmented Generation)框架,给"有一堆企业文档、想让小模型基于这些文档准确回答问题"的场景用。 本套文档只讲它两大件里的一件——RAG 流水线(rag-retrieval 这条线), 追一份 PDF 从入库到被当证据回答问题的全过程。
1. LLMWare 是什么(零基础也能懂)
一句话定义: LLMWare 是一个把"文档知识"接到"生成式 AI 模型"的中间件(middleware), 让你在自己的笔记本 / 边缘设备上,就能搭出一个基于私有文档回答问题的知识库应用。
这不是我的概括,是它自己写的定位:
"The llmware package aspires to be a middleware in LLM applications ... it provides the infrastructure between the components, such as the models, the prompts, the text databases, and the vector databases." ——
llmware/__init__.py:18-21
它有两大组件(据 README.md:11-17 的『two main components』段落):
| 组件 | 干什么 | 本套文档 是否覆盖 |
|---|---|---|
| Model catalog(模型目录) | 300+ 预打包量化模型 + 50+ 自研 RAG 小模型(SLIM/Bling/Dragon),统一 ModelCatalog 查找加载 | 否(不是本套主题) |
| RAG Pipeline(RAG 流水线) | 文档解析、入库、建知识库、嵌入、检索、带源提示的全生命周期组件 | 是(本套 01–05 章) |
本套文档聚焦第二件:RAG 流水线(area: rag-retrieval)。 模型目录那条线是另一个主题,这里不展开。
给谁用、解决什么问题
设想你在一家公司,手里有几百份 PDF 合同、财报、HR 政策。你想问:"这份发票总额是多少?" 而且要求:(1) 答案必须基于这些文档、不能瞎编;(2) 数据不上云、跑在本地。 LLMWare 就是把这套流程标准化的工具箱——你只需把文件夹指给它,剩下的解析、切块、嵌入、 检索、组装提示,它都有现成部件。
用起来什么样(最小真实示例)
下面这段直接摘自 README(README.md:65-83),是入库知识库的最短路径:
from llmware.library import Library
# 1. 建一个 library —— 知识库容器
lib = Library().create_new_library("my_library")
# 2. add_files 是万能入库函数:指向一个文件夹,混合格式都行
# 文件 按扩展名路由到对应解析器,解析、切块、索引进文本集合 DB
lib.add_files("/folder/path/to/my/files")
# 3. 给这个 library 装一个嵌入(挑一个嵌入模型 + 一个向量库)
lib.install_new_embedding(embedding_model_name="mini-lm-sbert", vector_db="milvus", batch_size=500)
一句话直觉: 把 Library 当成一个带索引的文件柜——add_files 是把文件塞进去并
自动贴好标签(文本集合 DB),install_new_embedding 是再给每页内容按"语义相似度"排一遍座(向量库),
之后 Query 就能又快又准地把相关那几页翻出来。
本节不出现底层代码细节;目标是让你先知道"这东西是干嘛的"。下钻实现请沿阅读地图往后走。
2. 顶层全景(它大概怎么转)
怎么读这张图
从左到右是数据流:一份文件进来,被解析成一个个文本块(block),落进两类存储, 再被嵌入、被查询、最后组装成给模型的提示。注意底部两类存储分家—— 文本和元数据进"文本集合 DB",原始文件和抽出来的图片进"文件资源目录"。
┌─────────────────────────────────────────────────────────┐
一个文件夹 │ RAG 流水线 │
(PDF/DOCX/…) │ │
│ │ add_files │
└──────────►│ (按扩展名路由) │
│ │ │
│ ▼ │
│ ┌────────┐ 一块块 block ┌──────────────────┐ │
│ │ Parser │ ───────────────► │ 文本集合 DB │ │
│ │ 解析+ │ │ (mongo/pg/sqlite)│ │
│ │ 分块 │ │ 文本+元数据 │ │
│ └───┬────┘ └────────┬─────────┘ │
│ │ 原始文件/抽出的图片 │ │
│ ▼ │ 取文本 │
│ ┌────────────────┐ ▼ │
│ │ 文件资源目录 │ ┌──────────────┐ │
│ │ llmware_data/ │ │ Embedding │ │
│ │ accounts/{lib}/ │ │ Handler │ │
│ │ uploads,images │ │ (向量化) │ │
│ └────────────────┘ └──────┬───────┘ │
│ ▼ │
│ ┌───── ─────────┐ │
│ │ 向量库 │ │
│ │ (milvus/faiss │ │
│ │ /chroma…) │ │
│ └──────┬───────┘ │
│ │ │
│ 用户提问 ──► ┌────────┐ 文本/语义/双通道 │ │
│ │ Query │◄────────────────┘ │
│ └───┬────┘ │
│ │ 命中的 block(证据) │
│ ▼ │
│ ┌────────┐ 带源提示 ┌─────────┐ │
│ │ Prompt │ ───────────► │ LLM │──►答案 │
│ │ 打包+ │ │ 推理 │ +核查 │
│ │ 核查 │◄──────────── └─────────┘ │
│ └────────┘ evidence_check │
└─────────────────────────────────────────────────────────┘
部件一句话职责
| 部件 | 一句话职责 | 在哪个文件(符号) |
|---|---|---|
Library | 知识库容器:建库、add_files 入库、装嵌入、发库卡,统管双存储 | llmware/library.py:38 class Library |
Parser | 按文件类型解析并切成文本块(block),写进文本集合 DB | llmware/parsers.py:60 class Parser |
EmbeddingHandler | 嵌入总控:把 block 向量化并路由到选中的向量库,做增量同步 | llmware/embeddings.py:78 class EmbeddingHandler |
Query | 检索引擎:文本 / 语义 / 双通道查询,把命中的 block 取回 | llmware/retrieval.py:43 class Query |
Prompt | 把检索到的 block 打包成"带源上下文"喂给模型,并做事后核查 | llmware/prompts.py:44 class Prompt |
两类存储(容易混,先分清)
据 LLMWareConfig._supported(llmware/configs.py:84-86),LLMWare 的存储分三档,
本套主要涉及前两档:
- 文本集合 DB(collection_db) —— 存文本块与元数据,可选
mongo/postgres/sqlite。 - 向量库(vector_db) —— 存嵌入向量,可选 11 种(见 §第 03 章)。
- 文件资源目录 —— 磁盘上的
llmware_data/accounts/{account}/{library_name}/, 下有uploads(原始文件副本)、images(抽出的图)等子目录 (llmware/library.py:171-180)。