十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于RAG与向量数据库构建个人阅读知识库:WorkBuddy+微信读书实践

基于RAG与向量数据库构建个人阅读知识库:WorkBuddy+微信读书实践 1. 项目概述当AI成为你的阅读知己“用 WorkBuddy 接入微信读书AI 读懂了我 8 年的阅读人生”这个标题听起来像是一个科技与人文交汇的浪漫故事。作为一名长期关注效率工具与知识管理的从业者我第一眼就被它吸引了。这不仅仅是一个简单的工具联动教程它背后指向的是一个更深层的需求在信息爆炸的时代我们如何让那些沉睡在数字角落里的阅读数据“活”起来真正内化为我们认知的一部分WorkBuddy 作为一个新兴的 AI 智能体平台与微信读书这个国民级阅读应用的结合恰好为我们提供了一个绝佳的实践样本。简单来说这个项目就是通过技术手段将你在微信读书里长达八年积累的阅读记录——包括读过的书、划过的线、写过的想法——安全地导出并喂给一个由你定制的 AI 智能体WorkBuddy。这个 AI 不再是冷冰冰的通用模型它会基于你独一无二的阅读历史成为你的“阅读知己”。你可以向它提问“我去年对心理学感兴趣都看了哪些相关的书核心观点是什么”、“帮我总结一下我这几年在个人成长类书籍中学到的最重要的三个方法论。” 甚至可以让它基于你的阅读偏好为你推荐下一本可能爱不释手的好书。这个过程解决了几个核心痛点第一数据沉睡。微信读书的笔记功能很好但回顾和串联困难大量的高亮和想法散落在数百本书中难以形成体系。第二记忆模糊。读过的书时间一长只留下模糊印象具体观点和案例想不起来。第三知识孤岛。阅读与其他工作流如写作、思考、决策割裂无法有效调用。这个项目正是通过 AI 的“理解”与“连接”能力试图打通从数据到知识再到个人智慧的最后一步。无论你是重度阅读者、内容创作者、研究者还是单纯希望从过往阅读中汲取更多养分的学习者这套方法都能为你打开一扇新的大门。2. 核心思路与方案选型为什么是 WorkBuddy 微信读书要实现“AI读懂阅读人生”这个目标我们需要拆解为三个核心环节数据获取、数据处理与投喂、AI智能体构建与交互。每个环节都有多种技术路径我们的选型直接决定了最终体验的流畅度、效果深度以及可维护性。2.1 为什么选择微信读书作为数据源微信读书几乎是中文互联网世界最理想的个人阅读数据源没有之一。首先它的用户基数庞大产品生态成熟提供了相对稳定和结构化的数据出口。其次其数据维度非常丰富不仅包括“已读”书单更核心的是你的划线、你的想法、你的笔记这些是体现你个人思考与吸收程度的“热数据”远比一个冷冰冰的书单更有价值。最后微信读书支持通过网页端或官方有限的接口需登录获取这些数据虽然并非完全开放但通过合规的技术手段如模拟浏览器操作获取渲染后的数据进行采集是可行的这为自动化提供了基础。注意任何数据获取操作都必须严格遵守平台的使用条款尊重数据隐私和版权。我们讨论的技术方法仅限于个人出于学习与研究目的对自己账户内数据的备份与处理严禁用于爬取他人数据或商业用途。2.2 为什么选择 WorkBuddy 作为 AI 载体市面上 AI 平台很多为何独选 WorkBuddy这源于它对“智能体”Agent概念的深度贯彻。与单纯调用一个 ChatGPT API 不同WorkBuddy 允许你创建一个专属的、可长期维护的 AI 角色。你可以为这个角色设定系统指令System Prompt定义它的身份、能力和对话风格。例如你可以将它设定为“一位熟知我所有阅读历史的私人知识库管理员”。更重要的是WorkBuddy 通常支持长文本上下文和向量数据库Vector Database接入这对于处理动辄数十万字的阅读笔记和想法至关重要。通过向量数据库我们可以将书籍摘要、核心观点、个人笔记等文本块转换成向量Embeddings并存储起来。当用户提问时AI 会先在向量库中进行语义搜索找到最相关的阅读片段然后将这些片段作为上下文提供给大模型从而生成精准、有据可依的回答。这个过程被称为“检索增强生成RAG”它能有效解决大模型“幻觉”胡编乱造和知识截止日期的问题让 AI 的回答牢牢扎根于你真实的阅读历史中。WorkBuddy 简化了 RAG 的集成流程使得非专业开发者也能构建出强大的知识库问答系统。2.3 整体技术架构设计基于以上选型我们的项目架构清晰起来数据采集层使用自动化脚本如 Python 的 Selenium 或 Playwright模拟登录微信读书网页版遍历“我的书架”、“笔记与想法”等页面解析 HTML 结构抓取书籍元数据书名、作者、封面和用户生成内容划线、想法、笔记。将数据清洗后以结构化的格式如 JSON 或 CSV保存到本地。数据处理与嵌入层对抓取的文本内容进行预处理去重、清洗、分段。调用文本嵌入模型如 OpenAI 的text-embedding-3-small或开源模型如BGE-M3将每个文本分段转换为高维向量。将这些向量连同原始文本、元数据所属书籍、创建时间一并存入一个本地的向量数据库例如ChromaDB或Qdrant。它们轻量、易用非常适合个人项目。智能体构建层在 WorkBuddy 中创建一个新的智能体。在它的系统指令中清晰地定义其角色和任务边界。最关键的一步是将本地的向量数据库通过 WorkBuddy 提供的连接方式通常是 API 或插件与其关联起来使智能体具备检索私有知识的能力。应用交互层用户通过 WorkBuddy 的聊天界面与智能体对话。智能体在收到问题后将其转换为查询向量在向量数据库中检索出最相关的几个阅读片段然后将“问题检索到的上下文”组合成最终的提示词Prompt发送给大模型如 GPT-4生成回答。这套架构的优势在于解耦和可扩展。数据采集和处理可以独立运行和优化向量数据库作为核心知识存储可以随时更新智能体平台可以切换或升级只要支持 RAG 即可。这为我们后续的迭代和维护提供了便利。3. 实操全流程解析从数据抓取到智能体对话理论清晰后我们进入实战环节。我将以 macOS/Linux 环境为例使用 Python 作为主要工具详细拆解每一步。Windows 用户只需注意路径和个别命令的差异即可。3.1 第一步环境准备与基础工具安装工欲善其事必先利其器。我们首先需要配置一个干净的 Python 环境。# 1. 创建并激活一个独立的虚拟环境避免包冲突 python3 -m venv reading_ai_env source reading_ai_env/bin/activate # Windows 用 reading_ai_env\Scripts\activate # 2. 安装核心依赖包 pip install selenium webdriver-manager # 用于网页自动化抓取 pip install beautifulsoup4 lxml # 用于解析HTML pip install pandas # 用于数据处理和存储 pip install chromadb # 轻量级向量数据库 pip install openai # 用于调用嵌入模型和ChatGPT如需 pip install tiktoken # 用于文本分词和计数实操心得一虚拟环境是必须的。特别是当你需要同时维护多个不同 Python 版本或依赖版本的项目时虚拟环境能帮你隔绝冲突。我习惯为每个中型项目都创建一个用完后deactivate即可退出。关于浏览器驱动Selenium 需要浏览器驱动。webdriver-manager这个包可以自动下载和管理 Chrome Driver非常省心。确保你的系统上安装了 Google Chrome 浏览器。3.2 第二步自动化抓取微信读书数据这是最具挑战性的一步因为微信读书没有公开API我们需要模拟用户行为。核心思路是登录 - 跳转到“笔记导出”页面或遍历“我的笔记” - 解析数据。由于直接抓取涉及复杂的登录态维护和动态页面处理这里我提供一个更稳健、也更推荐给新手的思路利用微信读书客户端的“导出笔记”功能。最新版的微信读书App和网页版都支持将单本书的笔记导出为 Markdown 或文本文件。我们可以先手动或半自动地导出核心书籍的笔记作为数据源。对于想挑战自动化的朋友以下是基于 Selenium 的模拟登录和页面抓取框架from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service import time, json def fetch_wechat_read_data(): # 自动管理ChromeDriver service Service(ChromeDriverManager().install()) options webdriver.ChromeOptions() # 可选无头模式不打开浏览器窗口 # options.add_argument(--headless) driver webdriver.Chrome(serviceservice, optionsoptions) try: driver.get(https://weread.qq.com/) print(请扫描页面二维码登录微信读书...) # 等待用户手动扫码登录这里可以增加一个循环检测登录成功的元素 WebDriverWait(driver, 120).until( EC.presence_of_element_located((By.CLASS_NAME, wr_avatar)) # 假设头像出现代表登录成功 ) print(登录成功) # 跳转到我的笔记页面 driver.get(https://weread.qq.com/web/mynotes) time.sleep(5) # 等待页面加载 # 这里开始是解析页面的难点。微信读书的页面是动态渲染的笔记可能分页加载。 # 你需要仔细分析其HTML结构使用 driver.find_elements 来定位书籍列表和笔记内容。 # 例如遍历每个 .book_item点击进入详情页再抓取划线文本。 # 这是一个需要耐心调试的过程可能随着网站改版而失效。 # 伪代码示例 # book_elements driver.find_elements(By.CSS_SELECTOR, .book-item) # all_notes [] # for book in book_elements: # book_title book.find_element(By.CLASS_NAME, title).text # book.click() # time.sleep(2) # # 在新页面抓取笔记... # highlights driver.find_elements(By.CLASS_NAME, highlight) # for h in highlights: # note {book: book_title, text: h.text} # all_notes.append(note) # driver.back() # time.sleep(1) # 将抓取的数据保存为JSON # with open(wechat_read_notes.json, w, encodingutf-8) as f: # json.dump(all_notes, f, ensure_asciiFalse, indent2) finally: driver.quit() print(浏览器已关闭。) # 注意由于微信读书反爬机制和页面复杂性上述代码仅为框架需要你根据实际页面结构进行大量调整和填充。实操心得二尊重平台优先使用官方导出。对于绝大多数用户我强烈建议直接使用微信读书 App 内的“导出笔记”功能。虽然一本本导出有点麻烦但它稳定、合规、数据格式干净。你可以定期比如每季度将新读的书的笔记导出放入一个统一的文件夹。然后我们写一个 Python 脚本来批量读取和处理这些 Markdown 文件这比逆向网页要简单和可靠得多。这是本项目的推荐数据获取方案。3.3 第三步数据处理与向量数据库构建假设我们已经通过官方导出获得了多本图书的 Markdown 笔记文件。每个文件通常包含书籍信息、章节和具体的划线及想法。import os, json from pathlib import Path import chromadb from chromadb.config import Settings import tiktoken # 用于计算token和文本分块 # 1. 读取并解析所有Markdown笔记文件 notes_dir Path(./exported_notes/) all_documents [] all_metadatas [] all_ids [] def parse_markdown_note(file_path): 解析单本图书的Markdown笔记文件返回文档块列表和元数据列表 with open(file_path, r, encodingutf-8) as f: content f.read() # 这里需要根据你导出文件的格式进行解析。 # 一个简单的示例假设文件以# 《书名》开头划线以‘’或‘-’标记。 lines content.split(\n) book_title current_chapter documents [] metadatas [] for i, line in enumerate(lines): if line.startswith(# 《) and line.endswith(》): book_title line[2:-1] # 提取书名 elif line.startswith(## ): current_chapter line[3:] elif line.strip().startswith() or line.strip().startswith(-): # 这是一个划线或想法 note_text line.strip().lstrip(- ).strip() if note_text and book_title: # 创建一个文档块 doc_id f{book_title}_{i} all_documents.append(note_text) all_metadatas.append({book: book_title, chapter: current_chapter, source: str(file_path)}) all_ids.append(doc_id) return # 遍历文件夹 for md_file in notes_dir.glob(*.md): parse_markdown_note(md_file) print(f共解析出 {len(all_documents)} 条笔记片段。) # 2. 文本分块与清洗 # 有些想法可能很长需要进一步分块以适应模型的上下文窗口。 def split_text(text, max_tokens500): 使用tiktoken将长文本按token数分块 encoding tiktoken.get_encoding(cl100k_base) # GPT-4/GPT-3.5使用的编码 tokens encoding.encode(text) chunks [] for i in range(0, len(tokens), max_tokens): chunk_tokens tokens[i:imax_tokens] chunk_text encoding.decode(chunk_tokens) chunks.append(chunk_text) return chunks processed_docs [] processed_metas [] processed_ids [] for doc, meta, id_ in zip(all_documents, all_metadatas, all_ids): chunks split_text(doc) for idx, chunk in enumerate(chunks): processed_docs.append(chunk) # 为每个块复制元数据并添加块索引 new_meta meta.copy() new_meta[chunk_index] idx processed_metas.append(new_meta) processed_ids.append(f{id_}_chunk{idx}) # 3. 初始化ChromaDB向量数据库 client chromadb.PersistentClient(path./my_readin_g_db) # 数据持久化到本地目录 collection client.create_collection(namewechat_reading_notes) # 4. 生成嵌入向量并存入数据库 # 这里需要嵌入模型。我们可以使用OpenAI的API也可以使用本地模型。 # 方案A使用OpenAI API (需要API Key) import openai openai.api_key your-openai-api-key # 请替换为你的密钥 def get_embedding_openai(text): response openai.embeddings.create( modeltext-embedding-3-small, inputtext ) return response.data[0].embedding # 分批处理避免请求过快 batch_size 100 for i in range(0, len(processed_docs), batch_size): batch_docs processed_docs[i:ibatch_size] batch_ids processed_ids[i:ibatch_size] batch_metas processed_metas[i:ibatch_size] # 生成嵌入向量 embeddings [get_embedding_openai(doc) for doc in batch_docs] # 添加到集合 collection.add( embeddingsembeddings, documentsbatch_docs, metadatasbatch_metas, idsbatch_ids ) print(f已处理 {ilen(batch_docs)} / {len(processed_docs)} 个文档块。) print(向量数据库构建完成)实操心得三分块策略是 RAG 效果的关键。分块太大检索可能不精准分块太小上下文可能不完整。对于阅读笔记一条完整的“划线想法”通常是一个自然的语义单元可以直接作为一块。但如果你的想法写得特别长比如超过500字就需要按语义或固定长度进行分割。max_tokens500是一个比较通用的起点你可以根据实际效果调整。实操心得四元数据Metadata是宝藏。在存入向量数据库时务必把书籍名、章节、导出时间等信息作为元数据存进去。未来在检索时你不仅可以按语义搜索还可以让 AI 进行过滤例如“只在我2023年读过的历史类书籍中找相关观点”。这极大地提升了问答的精准度和可控性。3.4 第四步在 WorkBuddy 中创建并配置智能体现在我们拥有了一个存储了所有阅读记忆的向量数据库。接下来就是让 WorkBuddy 学会使用它。创建智能体登录 WorkBuddy 平台点击“创建智能体”。给它起一个名字比如“我的阅读智库”。编写系统指令System Prompt这是智能体的灵魂。你需要清晰地告诉它你是谁它该做什么如何做。一个高质量的指令模板如下你是一位专业的个人知识库助手专门管理和分析我的微信读书笔记库。你的核心能力是基于我提供的检索结果来自我的私人读书笔记向量数据库来回答问题。 工作流程 1. 当用户提出问题时你会收到一个“检索结果”上下文其中包含从我的笔记库中找出的最相关的文本片段。 2. 你**必须严格依据**提供的检索结果来组织答案。如果检索结果中没有相关信息请如实告知“根据你的读书笔记暂时没有找到相关信息”不要编造答案。 3. 答案应清晰、有条理并注明观点或引文的出处来自哪本书的哪个章节。 4. 你可以对检索结果中的信息进行总结、对比、关联但所有推论都需基于提供的文本。 你的性格严谨、细致、乐于助人像一位熟知我阅读品味的私人图书管理员。 请用中文与用户交流。连接向量数据库这是最关键的一步。在 WorkBuddy 的智能体配置中找到“知识库”或“向量存储”相关的选项。你需要将上一步构建的 ChromaDB 暴露出来。通常有两种方式方式一通过 API 连接。你需要写一个简单的 FastAPI 服务部署在本地或云端提供搜索接口。WorkBuddy 可以配置 Webhook 或调用这个 API 进行检索。方式二使用 WorkBuddy 原生集成。更先进的平台如一些基于 LangChain 的框架可能直接支持连接 ChromaDB、Pinecone 等。你需要按照平台文档提供数据库的连接信息如主机、端口、集合名。 由于 WorkBuddy 的具体实现各异这里无法给出通用代码。但核心逻辑是当用户提问时WorkBuddy 会先将问题转换成向量然后调用你配置的检索接口在你的wechat_reading_notes集合中进行相似性搜索返回前 K 个比如5个最相关的文档块及其元数据最后将这些内容作为上下文插入到给大模型的提示词中。测试与调优创建完成后问它几个问题测试一下比如“我读过的书里关于‘习惯养成’最有启发的观点是什么”。观察它的回答是否基于你的笔记引用是否准确。根据效果调整系统指令和检索参数如返回的文档块数量K。4. 效果优化与高级玩法基础功能跑通后我们可以从“能用”向“好用”、“聪明”进化。4.1 提升检索质量不止于语义搜索单纯的向量相似度搜索有时会“跑偏”。我们可以结合**混合搜索Hybrid Search**来提升精度。ChromaDB 支持同时进行向量搜索和基于关键词的全文搜索并将两者的结果按权重合并。# 在查询时使用混合搜索 results collection.query( query_texts[如何应对焦虑], # 同时用于向量化和关键词匹配 n_results5, # where{book: 《被讨厌的勇气》} # 可以添加元数据过滤条件 # where_document{$contains: 课题分离} # 文档内容过滤 )此外在将文档存入向量库前可以尝试为每个文档块生成一个摘要性标题或提取几个关键词作为元数据的一部分。在检索时这些信息也能被利用起来提高命中率。4.2 让 AI 主动思考设计提示词工程系统指令决定了 AI 的“行为模式”而每次提问的**用户提示词User Prompt**则决定了 AI 的“思考路径”。我们可以设计更复杂的提示词来激发 AI 的深层分析能力。总结归纳型“请根据我过去两年所有关于‘经济学’的阅读笔记总结出三个最常出现的核心主题并为每个主题列举1-2个我最赞同的具体观点。”对比分析型“对比一下我在《思考快与慢》和《超越智商》这两本书中关于‘理性决策’的笔记找出它们观点的异同点。”创意发散型“基于我读过的科幻小说和科技史类书籍的笔记帮我构思一个关于未来人机融合的短故事开头。”实操心得五好的问题胜过盲目的搜索。教会用户也就是你自己如何向 AI 提问是发挥其价值的关键。问题越具体、越有场景AI 给出的答案就越有深度。例如不要问“我读了什么心理学书”而是问“在我读过的心理学书籍中关于如何克服拖延症有哪些不同的理论流派和实操方法”4.3 数据维护与更新打造活的数字大脑你的阅读人生是持续进行的这个 AI 大脑也需要持续喂养。定期更新可以每月或每季度运行一次数据抓取和向量化脚本将新产生的笔记增量添加到向量数据库中。ChromaDB 支持增量添加只需注意避免添加重复的文档 ID。数据清洗定期回顾如果发现某些早期笔记质量不高比如只是简单的划线没有想法可以考虑在重新处理时过滤掉或者为其生成更好的文本表示比如用 AI 概括一下这条划线的意义再存入。多源融合这个框架的威力在于其扩展性。你不仅可以接入微信读书未来还可以将 Kindle 笔记、得到笔记、甚至是你在 Notion 或 Obsidian 中写的读书摘要都通过类似的流程整合进同一个向量数据库。这样你就拥有了一个真正统一的、跨平台的个人阅读知识中枢。5. 常见问题与排查技巧实录在实际搭建和使用的过程中你肯定会遇到各种“坑”。以下是我在实践和与同行交流中总结的一些典型问题及解决方案。问题现象可能原因排查与解决思路AI 回答“根据你的笔记没有相关信息”但明明有。1. 检索到的文档块相关性低。2. 系统指令未强制要求基于检索结果回答。3. 向量数据库连接失败或未命中。1.检查检索结果在 WorkBuddy 调用检索后先查看实际返回了哪些文本片段。可能是查询语句太模糊尝试换更具体的关键词提问。2.强化系统指令在指令中明确强调“必须严格依据检索结果”并设定惩罚性语句如“禁止虚构信息”。3.测试向量搜索直接写脚本用相同问题查询向量数据库看是否能返回正确结果以隔离问题。AI 的回答泛泛而谈像通用知识不像来自我的笔记。1. 检索返回的文档块数量K值太少或太多。2. 检索结果未正确嵌入到最终提示词中。3. 大模型如GPT的“知识”覆盖了你的私有知识。1.调整K值增加 K 值如从3调到5以获得更多上下文或者减少 K 值并提高相似度阈值以获得更精准的片段。2.检查提示词结构确保 WorkBuddy 的提示词模板正确地将{检索结果}放在了用户问题之前。格式通常是“基于以下上下文\n{检索结果}\n\n请回答{用户问题}”。3.使用更强调上下文的模型在系统指令中再次强调“请仅使用以下上下文”或尝试使用对指令遵循更好的模型如 Claude-3 系列。处理长笔记时AI 的回答丢失了部分信息。1. 文本分块不合理割裂了语义。2. 大模型的上下文窗口有限检索到的总文本过长被截断。1.优化分块策略尝试按段落、按章节分块而不是简单按固定长度。对于长想法可以尝试用 AI 先进行摘要再存储摘要和原文链接。2.实施“重排序”先检索出较多的候选片段如10个然后用一个更小的、专门做相关性排序的模型对它们进行重排只将最相关的3-5个喂给大模型。这能提升信息密度。运行 Selenium 脚本时无法登录或抓不到数据。1. 微信读书网页版结构已更新。2. 登录态失效或有验证码。3. 页面动态加载未处理。1.更新元素选择器使用浏览器开发者工具重新检查页面元素更新代码中的 CSS 选择器或 CLASS NAME。2.考虑备用方案这是自动化抓取最大的痛点。再次强调优先使用官方导出功能。如果必须自动化可以考虑使用更稳定的“请求Cookie”方式但获取Cookie本身也需要手动登录或者寻找维护良好的开源爬虫项目注意合规性。3.增加等待和滚动在关键操作后增加time.sleep或使用WebDriverWait等待特定元素出现。对于滚动加载用driver.execute_script(“window.scrollTo(0, document.body.scrollHeight)”)模拟滚动。向量数据库检索速度慢。1. 本地 ChromaDB 未做索引优化。2. 文档数量过多超过10万条。1.对于本地小规模使用ChromaDB 的性能通常足够。确保你的查询是批量进行而不是单条循环。2.如果数据量巨大可以考虑使用性能更强的向量数据库如 Qdrant 或 Weaviate它们支持分布式和更高效的索引。但对于个人阅读笔记通常不超过几万条ChromaDB 完全够用。最后的个人体会这个项目做下来最深的感触不是技术有多复杂而是它迫使我去系统地回顾和整理了自己散乱多年的阅读记录。当 AI 第一次准确地说出“你在《XX》书中第X章标注的关于YY的观点与你在《ZZ》书中的想法可以联系起来……”时那种感觉非常奇妙。它像是一个数字化的“第二大脑”不仅帮我记忆更在帮我建立连接。技术是冰冷的管道但流淌其中的是你独一无二的思想印记。搭建的过程本身就是一次对个人知识体系的深度梳理其价值甚至可能超过最终那个能对答如流的 AI 伙伴。如果你也积攒了多年的阅读数据不妨花一个周末的时间亲手搭建这个属于你自己的“阅读知己”开启一场与过去自己的深度对话。
返回列表