第一步:只保留可以公开的事实

原始简历包含教育、实习、项目、技能,也包含电话和邮箱。进入 RAG 前,我建立公开字段白名单:保留职业信息,去掉电话、邮箱、年龄和民族。

RESUME_DOCUMENTS = [
    {
        "source": "resume/project-linter-ai",
        "title": "Linter+AI 应用平台",
        "content": "担任 AI 算法负责人及队长,集成大模型与 Agent……",
    },
]

第二步:转成 LangChain Document

每段内容保留 sourcetitle。未来展示引用时,前端可以说明答案来自哪一段简历。

from langchain_core.documents import Document

documents = [
    Document(
        page_content=item["content"],
        metadata={"source": item["source"], "title": item["title"]},
    )
    for item in RESUME_DOCUMENTS
]

第三步:设计轻量中文分词

import re

def tokenize(text: str) -> list[str]:
    return re.findall(
        r"[a-zA-Z0-9+#.]+|[\u4e00-\u9fff]",
        text.lower(),
    )

这一步让我意识到:RAG 的质量首先取决于文档边界、元数据和检索策略,并不只是“选一个向量数据库”。