从零搭建私人 RAG 实战:用 Markdown 沉淀技术决策与业务决策

从零搭建私人 RAG 实战:用 Markdown 沉淀技术决策与业务决策
1. 为什么需要私人 RAG在日常工作和学习中我们每天都会产生大量决策——技术选型、架构设计、业务方案、问题排查记录。这些决策散落在 Markdown 笔记、飞书文档、Notion 页面甚至聊天记录中当需要回顾某个历史决策时往往要翻遍多个文档才能找到。私人 RAGRetrieval-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, encodingutf-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_onheaders_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 chunks5. 构建向量存储将切分后的 Chunk 向量化并存入 Chroma 向量数据库from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import Chroma def build_vector_store(chunks, persist_directory./chroma_db): 构建并持久化向量存储 embeddings HuggingFaceEmbeddings( model_nameshibing624/text2vec-base-chinese ) vector_store Chroma.from_documents( documentschunks, embeddingembeddings, persist_directorypersist_directory ) vector_store.persist() return vector_store6. 检索增强生成结合检索结果与 LLM 生成回答from langchain.chains import RetrievalQA from langchain.llms import OpenAI def create_rag_chain(vector_store): 创建 RAG 问答链 retriever vector_store.as_retriever( search_typesimilarity, search_kwargs{k: 4} ) llm OpenAI(temperature0, model_namegpt-3.5-turbo) qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever, return_source_documentsTrue ) 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/飞书机器人