第38讲|构建个人 AI 编程知识库:把每次学习沉淀为资产

1 阅读1分钟

金句:没有沉淀的学习是漏斗,有沉淀的学习是水库。AI 编程的真正护城河,不是你用过多少工具,而是你积累了多少可复用的知识资产。


一、为什么需要个人知识库?

现实困境

  • 学了一个很好的提示词技巧,下次遇到类似问题又想不起来
  • 解决了一个复杂的 Bug,半年后遇到类似问题又从头排查
  • 每次和 AI 协作,都要重新描述项目规范和个人偏好

知识库的价值

  • 把每次学习转化为可检索的资产
  • 让 AI 工具随时获取你的个人最佳实践
  • 随时间积累,形成真正的竞争优势

二、个人 AI 编程知识库的结构设计

~/my-ai-knowledge-base/
├── prompts/                  # 提示词库
│   ├── code-review.md       # 代码审查提示词
│   ├── debug.md             # 调试提示词
│   ├── architecture.md      # 架构设计提示词
│   └── refactor.md          # 重构提示词
│
├── solutions/               # 问题解决方案
│   ├── database/
│   │   ├── n-plus-one.md   # N+1 查询解决方案
│   │   └── migration.md    # 数据库迁移方案
│   ├── performance/
│   │   └── caching.md      # 缓存策略
│   └── security/
│       └── sql-injection.md # SQL 注入防范
│
├── snippets/               # 代码片段
│   ├── auth/
│   │   └── jwt-middleware.ts
│   ├── api/
│   │   └── rate-limiter.ts
│   └── utils/
│       └── retry-with-backoff.ts
│
├── cursorrules/            # 各类项目的 .cursorrules 模板
│   ├── nextjs-fullstack.md
│   ├── python-fastapi.md
│   └── react-component.md
│
└── learnings/              # 每日学习记录
    ├── 2025-01/
    └── 2025-02/

三、自动化知识捕获系统

方法一:Git Hook 自动记录解决方案

#!/bin/bash
# .git/hooks/commit-msg
# 当提交包含 "fix:" 关键词时,提示记录解决方案

commit_message=$(cat "$1")

if echo "$commit_message" | grep -q "^fix:"; then
    echo ""
    echo "💡 检测到 Bug 修复提交,是否要记录到知识库?"
    echo "   运行:kb-add-solution '问题描述'"
fi

方法二:CLI 快速记录工具

#!/usr/bin/env python3
# ~/bin/kb - 知识库命令行工具

import sys
import os
import anthropic
from datetime import datetime
from pathlib import Path

KB_ROOT = Path.home() / "my-ai-knowledge-base"

def add_prompt(prompt_name: str, prompt_content: str):
    """添加提示词到知识库"""
    filepath = KB_ROOT / "prompts" / f"{prompt_name}.md"
    filepath.parent.mkdir(parents=True, exist_ok=True)
    
    with open(filepath, 'w', encoding='utf-8') as f:
        f.write(f"# {prompt_name}\n\n")
        f.write(f"*添加时间:{datetime.now().strftime('%Y-%m-%d')}*\n\n")
        f.write(prompt_content)
    
    print(f"✅ 提示词已保存:{filepath}")

def add_learning(content: str):
    """添加今日学习记录"""
    today = datetime.now()
    dir_path = KB_ROOT / "learnings" / today.strftime("%Y-%m")
    dir_path.mkdir(parents=True, exist_ok=True)
    
    filepath = dir_path / f"{today.strftime('%Y-%m-%d')}.md"
    
    # 如果文件已存在,追加;否则创建
    mode = 'a' if filepath.exists() else 'w'
    with open(filepath, mode, encoding='utf-8') as f:
        if mode == 'w':
            f.write(f"# {today.strftime('%Y-%m-%d')} 学习记录\n\n")
        
        timestamp = today.strftime("%H:%M")
        f.write(f"\n## {timestamp}\n\n{content}\n")
    
    print(f"✅ 学习记录已添加:{filepath}")

def search_kb(query: str):
    """搜索知识库(使用 AI 语义搜索)"""
    # 先用 grep 快速搜索
    import subprocess
    result = subprocess.run(
        ['grep', '-r', '-l', query, str(KB_ROOT)],
        capture_output=True, text=True
    )
    
    files = result.stdout.strip().split('\n')
    
    if files and files[0]:
        print(f"找到 {len(files)} 个相关文件:")
        for f in files:
            print(f"  📄 {f}")
        print("\n使用 'kb read <文件路径>' 查看内容")
    else:
        print("未找到相关内容,尝试使用 AI 搜索...")
        ai_search(query)

def ai_search(query: str):
    """使用 AI 语义搜索知识库"""
    # 获取所有知识库内容摘要
    summaries = []
    for md_file in KB_ROOT.rglob("*.md"):
        with open(md_file, 'r', encoding='utf-8') as f:
            content = f.read()[:500]  # 只取前500字
        rel_path = md_file.relative_to(KB_ROOT)
        summaries.append(f"文件:{rel_path}\n内容:{content}\n")
    
    client = anthropic.Anthropic()
    message = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=1024,
        messages=[{
            "role": "user",
            "content": f"""在以下知识库文件中,找出与查询最相关的内容:

查询:{query}

知识库文件摘要:
{'---'.join(summaries[:20])}

请列出最相关的 3-5 个文件路径和相关原因。"""
        }]
    )
    
    print(message.content[0].text)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("用法:kb [add-prompt|add-learning|search|read] ...")
        sys.exit(1)
    
    command = sys.argv[1]
    
    if command == "add-prompt" and len(sys.argv) >= 4:
        add_prompt(sys.argv[2], sys.argv[3])
    elif command == "add-learning" and len(sys.argv) >= 3:
        add_learning(' '.join(sys.argv[2:]))
    elif command == "search" and len(sys.argv) >= 3:
        search_kb(' '.join(sys.argv[2:]))
    else:
        print("参数不正确,请检查用法")

四、知识库与 AI 工具的集成

在 Cursor 中引用知识库

# .cursorrules 中添加知识库引用

## 个人最佳实践
请在生成代码前,参考以下知识库文件中的最佳实践:
@~/my-ai-knowledge-base/cursorrules/nextjs-fullstack.md

## 已知解决方案
遇到数据库相关问题,请参考:
@~/my-ai-knowledge-base/solutions/database/

构建个人 RAG 系统

# personal_rag.py - 将个人知识库接入 RAG
from langchain_community.document_loaders import DirectoryLoader
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

def build_personal_kb_rag():
    """将个人知识库构建为 RAG 系统"""
    loader = DirectoryLoader(
        str(Path.home() / "my-ai-knowledge-base"),
        glob="**/*.md"
    )
    documents = loader.load()
    
    vectorstore = Chroma.from_documents(
        documents=documents,
        embedding=OpenAIEmbeddings(),
        persist_directory=str(Path.home() / ".kb-vectorstore")
    )
    
    return vectorstore

# 查询个人知识库
def ask_personal_kb(question: str) -> str:
    vectorstore = Chroma(
        persist_directory=str(Path.home() / ".kb-vectorstore"),
        embedding_function=OpenAIEmbeddings()
    )
    
    docs = vectorstore.similarity_search(question, k=3)
    context = "\n\n".join([doc.page_content for doc in docs])
    
    # 基于知识库回答
    ...

五、知识库维护的 5 个习惯

  1. 每天记录:用 kb add-learning 记录当天学到的新技巧(5 分钟)
  2. 解决 Bug 后立即记录:解决方案趁热打铁记下来
  3. 提示词迭代更新:每次改进了一个提示词,更新到知识库
  4. 月度清理:每月回顾,删除过时内容,提炼精华
  5. 与团队共享:把通用的知识上传到团队共享仓库

章节小结:个人 AI 编程知识库是你在 AI 时代最有价值的资产之一。提示词、解决方案、代码片段、学习记录——这些零散的知识经过系统化沉淀,会成为你与其他工程师真正的差异化竞争力。今天就建立你的第一个知识库条目。