这是我整理出来的一份建筑领域 RAG 问答服务代码快照。
我这套实现的目标,是把建筑规范、图文资料和结构化文本整理成可检索知识库,再通过向量检索、BM25、重排模型和大语言模型,生成面向用户的问题回答。
这次公开的是我保留下来的核心代码,不是完整运行环境。我主要保留了服务入口、建库流程、检索流程、模型接入层和示例资源,方便展示项目思路、代码结构和关键实现。
- 文本知识库构建流程
- 图片知识库构建与图片问答检索流程
- FAISS + BM25 的混合召回逻辑
- 基于正负样本的 reject 阈值更新逻辑
- reranker 重排逻辑
- Flask 问答接口
- 本地模型与远程模型的统一接入层
在 main.py 里,如果配置里的 is_init = 1,程序会先执行初始化流程。
- 文本部分会扫描
repodir,对文档做预处理、切分,并构建db_response和db_reject - 图片部分会基于
new_id_text_mapping.pkl里的文本映射,构建picture_db_response和picture_db_reject resources/里的正负样本 JSON 会被用来更新文本问答和图片问答的 reject 阈值
服务启动后,核心入口是 /ask。
- 先用 LLM 判断问题是否属于建筑领域
- 如果属于建筑领域,再做问题抽取或改写
- 文本检索和图片检索会并发执行
- 文本检索会合并 FAISS 结果和 BM25 结果,再交给 reranker 重排
- 如果命中图片结果,会把文本结果映射成图片文件名
- 最后把检索材料和用户问题一起交给 LLM 生成回答
rag/
├─ README.md
├─ config.example.ini
├─ main.py
├─ requirements.txt
├─ ragsearch/
│ ├─ __init__.py
│ ├─ feature_store.py
│ ├─ file_operation.py
│ ├─ llm_servers.py
│ ├─ openai_servers.py
│ └─ retriever.py
└─ resources/
├─ bad_picture_question.json
├─ bad_question.json
├─ good_picture_question.json
└─ good_question.json
这是服务入口。
我在这里做了几件事:
- 读取配置
- 在需要时执行初始化建库
- 初始化文本检索器、图片检索器、映射文件和 LLM 服务
- 提供
/ask、/index、/images/<filename>三个接口 - 串联问题判断、并发检索、LLM 生成和结果返回
这是建库核心模块。
这里负责:
- 文档预处理
- Markdown 和普通文本切分
- 构建文本 response/reject 向量库
- 构建图片 response/reject 向量库
代码里默认使用了中文切分逻辑,文本块大小和 overlap 也已经在这里固定下来。
这是检索核心模块。
这里包含:
- FAISS 向量库加载
- BM25 检索器构建和持久化
- reject 判定
- FAISS 与 BM25 结果合并
- reranker 重排
- 检索器缓存
文本检索走的是混合召回,图片检索也复用了相同的整体框架,只是数据来源不同。
这是文件扫描和读取模块。
当前代码里明确处理了这些类型:
- Markdown
- TXT / TEXT
- Excel / CSV
- HTML
另外我保留了 Word / PPT 的类型识别入口,但这部分读取逻辑在当前发布版本里没有真正展开。
这是模型接入层。
我在这里统一封装了:
- 本地模型调用
- Kimi
- DeepSeek
- 智谱
- OpenAI 兼容接口
- 一些带重试或限频控制的远程调用方式
配置项在 config.example.ini 里可以看到,包括本地模型开关、远程模型开关、模型名、最大文本长度和 API Key 占位符。
这个文件是我保留的 OpenAI 兼容服务脚本,用来把本地模型包装成兼容 /v1/chat/completions 的接口,方便接到上层问答逻辑里。
这份仓库不是完整交付环境,我有意去掉了运行期资源和敏感配置。
当前仓库里没有包含:
- 真实
config.ini - API Key
- 本地模型权重
workdir下的 FAISS 索引- BM25 的 pickle 文件
- 图片资源和映射产物
- 原始数据目录
所以这份代码更适合看结构、看实现和做二次整理,不适合直接拉下来就启动。
仓库里提供的是 config.example.ini,不是我实际使用的运行配置。
从示例配置可以直接看出,这套代码当前依赖这些关键配置:
repodirwork_dirnew_id_text_mappingembedding_model_pathreranker_model_pathreject_throttlepicture_reject_throttle- 远程模型类型、模型名和 API Key
如果你是看项目实现,这份代码适合用来:
- 快速理解我这套 RAG 问答服务的结构
- 梳理建库、召回、重排和生成之间的衔接方式
- 作为后续重构、迁移或复刻时的参考
如果你要恢复成可运行版本,需要你自己补齐数据、索引、映射文件、配置和模型环境。