基于 RAG 与 Agent 协作的智能面试助手开发指南
Published in:2025-11-28 |
Words: 1.5k | Reading time: 5min | reading:

实战:如何让 AI “读懂”我的博客?——基于 RAG 与 Agent 协作的智能面试助手开发指南

摘要:在大模型时代,如何让 AI 不仅具备通用知识,还能利用我们私有的数据(如个人博客、技术笔记)进行回答?本文将拆解一个真实项目 JD_Agent 的实现过程。我们利用 FastAPI + LangChain 构建了一个智能体,它不仅能分析岗位 JD,还能通过 RAG 技术 检索我的本地 Markdown 博客,生成结合了我个人技术积累的专属面试指南。


一、 为什么要做这个?(痛点与思路)

在准备面试时,我们经常遇到两个问题:

  1. JD 分析太累:每个岗位的技术栈不同,需要针对性复习。
  2. 知识遗忘:明明以前写过关于 Docker 或 Redis 的博客笔记,但面试时一时想不起来细节。

我的解决方案
构建一个 AI Agent

  1. 它能自动分析我投递的 JD(岗位描述),提取核心技术栈。
  2. 它拥有一个外挂大脑(知识库),存储了我所有的博客文章。
  3. 在生成面试题时,它会优先参考我的博客内容,并告诉我:“这个问题你可以复习你写的这篇文章。”

二、 核心原理:RAG 与 Agent 的协作

在本项目中,我们采用了 RAG (Retrieval-Augmented Generation) 架构。

1. 什么是 RAG?

如果把大模型(LLM)比作一个“超级学霸”,那 RAG 就是给了学霸一本“开卷考试的书”。

  • LLM:负责逻辑推理、语言组织。
  • Knowledge Base:负责提供精准的、私有的事实数据(我的博客)。

2. 协作流程图

整个系统的运作流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
graph TD
User[用户输入 JD] -->|1. 提交| Agent[智能体核心 (Service)]

subgraph Analysis [阶段一: 意图识别]
Agent -->|2. 解析 JD| Parser[LLM 解析器]
Parser -->|提取关键词: Python, Docker| Keywords[技术栈列表]
end

subgraph Retrieval [阶段二: RAG 检索]
Keywords -->|3. 查询向量库| VectorDB[(FAISS 向量库)]
VectorDB -->|4. 返回博客片段 + 来源| Context[知识库上下文]
end

subgraph Generation [阶段三: 增强生成]
Context -->|5. 注入 Prompt| Generator[LLM 生成器]
Generator -->|6. 生成面试题 & 引用来源| Output[最终报告]
end

三、 关键技术实现

1. 构建知识库 (The Embedding Pipeline)

这是 RAG 的地基。我们需要把 Markdown 格式的博客文章转换成计算机能理解的“向量”。

技术栈LangChain + BGE-Small-zh + FAISS

  • 数据清洗 (ETL)
    使用 MarkdownHeaderTextSplitter 按章节切分文章,保证语义完整性。
  • 向量化 (Embedding)
    我们选用了 BAAI/bge-small-zh-v1.5 模型。它能将一段文字转换为 512 维的浮点数组。

    原理:语义相近的句子(如“Docker容器”和“容器化部署”),在向量空间中的距离非常近。

  • 存储结构
    存入 FAISS 的不仅是向量,还包含 Payload(原文)和 Metadata(元数据,如文件名)。
1
2
3
4
5
6
7
8
9
10
11
# 核心代码片段:入库逻辑
def build_index():
# 1. 加载博客 Markdown
docs = load_and_split_markdown("source/_posts")

# 2. 初始化 BGE 模型 (使用国内镜像)
embedding_model = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")

# 3. 向量化并存入 FAISS
vector_store = FAISS.from_documents(docs, embedding_model)
vector_store.save_local("blog_faiss_index")

2. Agent 的大脑:异步编排 (Orchestration)

为了让用户体验达到极致(快!),后端不能串行处理。我们利用 Python Asyncio 实现了并行任务流。

  • 技术挑战:如何同时进行“公司背景调查”和“知识库检索”?
  • 解决方案asyncio.gather
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 核心代码片段:并行编排
async def generate_interview_guide(request):
# 1. 先解析 JD (前置依赖)
jd_meta = await parse_jd_async(request.jd_text)

# 2. 构造查询:用 JD 里的技术栈去查博客
query = " ".join(jd_meta.tech_stack)

# 3. 并行执行:(查博客) & (查公司背景) & (出通用题)
task_rag = kb_engine.search(query)
task_research = research_company(jd_meta.company_name)

# 并发等待结果
rag_result, company_info = await asyncio.gather(task_rag, task_research)

# 4. 将查到的博客内容注入 Prompt
final_report = await generate_final_report(context=rag_result['context'])

3. 上下文注入 (Context Injection)

这是让 AI “读懂”博客的关键一步。我们动态构建了 Prompt Template。

1
2
3
4
5
6
7
8
9
prompt_template = """
你是一个资深技术面试官。
请根据以下【参考知识库】(这是用户的个人博客笔记)来生成面试题。

【参考知识库】:
{kb_context}

请在生成题目时,明确指出用户在博客中对该知识点的理解。
"""

四、 遇到的坑与优化 (Troubleshooting)

在开发过程中,我们解决了几个典型的工程问题:

  1. 模型下载卡顿

    • 问题:HuggingFace 国内无法直连。
    • 解决:在代码顶部设置 os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' 强制走镜像。
  2. Pydantic 数据校验错误

    • 问题:有时候 RAG 没查到数据,返回 None,导致接口报错。
    • 解决:在 Schema 定义中使用 Optional[List[str]] = [],增强系统的鲁棒性。
  3. 大模型“幻觉”

    • 问题:AI 编造博客里没有的内容。
    • 解决:在 Prompt 中加入约束——“仅依据参考知识库回答,如果知识库未提及,请忽略”。

五、 最终效果

当用户输入一个包含 “Python, Docker” 的 JD 时:

  1. 后端 迅速定位到本地博客中的 Docker部署笔记.mdPython并发编程.md
  2. AI 生成的面试指南中写道:

    Q1: 请谈谈 Docker 的隔离机制?
    参考回答要点:根据你的博客 Docker部署笔记.md,你曾总结过 Namespace 负责资源隔离,Cgroups 负责资源限制…

  3. 前端 界面底部会展示:

    📚 知识库引用

    • 📄 Docker部署笔记.md

这不仅是一个面试题生成器,更是一个唤醒沉睡知识的第二大脑


六、 总结

本项目通过 FastAPI 构建高性能后端,LangChain 处理复杂的 LLM 逻辑,FAISS 实现毫秒级知识检索。它展示了 LLM Ops (大模型工程化) 的核心思路:不仅要会调 API,更要懂得如何管理数据流和上下文。

如果你也想为自己的知识库装上 AI 引擎,欢迎参考我的 GitHub 仓库:[https://github.com/caozhaoqi/jd_agent]

Prev:
从零构建全栈 AI 简历助手:复刻 DeepSeek 交互与长期记忆实现
Next:
基于 FastAPI + LangChain 的简单agent实现