从零搭建私人 RAG 实战:用 Markdown 沉淀技术决策与业务决策
2026/7/28 17:13:01 网站建设 项目流程

1. 为什么需要私人 RAG

在日常工作和学习中,我们每天都会产生大量决策——技术选型、架构设计、业务方案、问题排查记录。这些决策散落在 Markdown 笔记、飞书文档、Notion 页面甚至聊天记录中,当需要回顾某个历史决策时,往往要翻遍多个文档才能找到。

私人 RAG(Retrieval-Augmented Generation)系统可以解决这个问题:将你的 Markdown 笔记作为知识库,通过向量检索 + 大语言模型生成,让你用自然语言就能快速定位到曾经做过的决策和思考过程。

2. 系统架构概览

本实战搭建的私人 RAG 系统包含以下核心组件:

  • 文档解析层:读取 Markdown 文件,提取标题、正文、代码块等结构化内容
  • 文本切分层:将长文档按语义边界切分为合适大小的 Chunk
  • 向量化层:使用 Embedding 模型将 Chunk 转换为向量
  • 向量存储层:存储向量并支持相似度检索(如 Chroma、FAISS)
  • 检索增强生成层:结合检索结果与 LLM 生成回答

3. 环境准备与依赖安装

推荐使用 Python 3.10+,创建虚拟环境后安装以下依赖:

pip install langchain langchain-community chromadb sentence-transformers pip install markdown beautifulsoup4 pip install openai # 或其他 LLM 接口

4. Markdown 文档解析与切分

首先实现一个 Markdown 解析器,将文档按标题层级拆分为语义块:

import os import markdown from bs4 import BeautifulSoup from langchain.text_splitter import MarkdownHeaderTextSplitter def load_markdown_files(directory): """加载指定目录下所有 Markdown 文件""" docs = [] for root, _, files in os.walk(directory): for file in files: if file.endswith(".md"): filepath = os.path.join(root, file) with open(filepath, "r", encoding="utf-8") as f: content = f.read() docs.append({"source": filepath, "content": content}) return docs def split_markdown_docs(docs): """按标题层级切分 Markdown 文档""" headers_to_split_on = [ ("#", "H1"), ("##", "H2"), ("###", "H3"), ] splitter = MarkdownHeaderTextSplitter( headers_to_split_on=headers_to_split_on ) chunks = [] for doc in docs: doc_chunks = splitter.split_text(doc["content"]) for chunk in doc_chunks: chunk.metadata["source"] = doc["source"] chunks.append(chunk) return chunks

5. 构建向量存储

将切分后的 Chunk 向量化并存入 Chroma 向量数据库:

from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import Chroma def build_vector_store(chunks, persist_directory="./chroma_db"): """构建并持久化向量存储""" embeddings = HuggingFaceEmbeddings( model_name="shibing624/text2vec-base-chinese" ) vector_store = Chroma.from_documents( documents=chunks, embedding=embeddings, persist_directory=persist_directory ) vector_store.persist() return vector_store

6. 检索增强生成

结合检索结果与 LLM 生成回答:

from langchain.chains import RetrievalQA from langchain.llms import OpenAI def create_rag_chain(vector_store): """创建 RAG 问答链""" retriever = vector_store.as_retriever( search_type="similarity", search_kwargs={"k": 4} ) llm = OpenAI(temperature=0, model_name="gpt-3.5-turbo") qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True ) return qa_chain def ask_question(qa_chain, question): """向 RAG 系统提问""" result = qa_chain({"query": question}) print(f"问题:{question}") print(f"回答:{result['result']}") print("\n参考来源:") for doc in result["source_documents"]: print(f"- {doc.metadata['source']}")

7. 实战:用 Markdown 沉淀决策

为了让 RAG 系统发挥最大价值,建议在写 Markdown 笔记时遵循以下规范:

  • 统一标题层级:每个决策文档使用 H1 作为标题,H2 作为决策背景、方案对比、最终结论等章节
  • 标注关键信息:在决策结论前加上**决策:****结论:**标签,便于检索时精准命中
  • 记录时间与上下文:在文档开头记录决策日期、参与人、业务背景,方便后续回溯
  • 关联相关文档:使用 Markdown 链接将相关决策文档互相引用,形成知识网络

示例决策笔记结构:

# 2024-03-15 数据库选型决策 背景 项目需要支持高并发写入和实时查询,数据量预计 500 万条/月。 方案对比 MySQL:成熟稳定,但分库分表运维成本高 PostgreSQL:支持 JSON 和全文检索,扩展性好 MongoDB:写入性能优秀,但事务支持较弱 决策 结论: 选择 PostgreSQL,利用其 JSONB 字段存储非结构化数据,配合 GIN 索引实现高效查询。 后续行动 搭建 PgBouncer 连接池 配置流复制实现读写分离

8. 运行与测试

将上述代码整合后,运行以下命令启动 RAG 系统:

if __name__ == "__main__": # 1. 加载 Markdown 文档 docs = load_markdown_files("./notes") print(f"加载了 {len(docs)} 个文档") # 2. 切分文档 chunks = split_markdown_docs(docs) print(f"切分为 {len(chunks)} 个 Chunk") 3. 构建向量存储 vector_store = build_vector_store(chunks) 4. 创建 RAG 链 qa_chain = create_rag_chain(vector_store) 5. 提问 ask_question(qa_chain, "我们之前为什么选择了 PostgreSQL?")</code></pre> 9. 总结与扩展 通过本实战,你从零搭建了一个基于 Markdown 笔记的私人 RAG 系统。核心收获包括: 掌握了 Markdown 文档的解析与语义切分方法 理解了向量数据库的构建与检索流程 学会了将检索结果与 LLM 结合生成上下文相关的回答 后续可以进一步优化: 使用更强大的 Embedding 模型(如 bge-large-zh)提升检索精度 引入重排序(Re-ranking)机制过滤低相关结果 支持 PDF、飞书文档等多格式输入 添加 Web 界面或接入 Slack/飞书机器人

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询