LangChain 面试八股文

共勉

来源:综合多个技术博客和面试资料整理(博客园、CSDN、卡码笔记等) 整理时间:2026-06-22 总题数:20 道高频面试题,含完整答案、深入解析、常见追问、代码示例


目录

  1. [Graph 结构三要素是什么?职责边界怎么划分?](#Graph 结构三要素是什么?职责边界怎么划分?)
  2. [什么是 Conditional Edge?和普通 Edge 有什么区别?](#什么是 Conditional Edge?和普通 Edge 有什么区别?)
  3. [什么是 LangChain?它的核心设计理念是什么?](#什么是 LangChain?它的核心设计理念是什么?)
  4. [什么是 LCEL?它有什么优势?](#什么是 LCEL?它有什么优势?)
  5. [什么是 RAG?完整链路是什么?](#什么是 RAG?完整链路是什么?)
  6. [LangChain 中 Memory 是如何工作的?](#LangChain 中 Memory 是如何工作的?)
  7. [什么是 LangChain Agent?和 Chain 有什么区别?](#什么是 LangChain Agent?和 Chain 有什么区别?)
  8. [LangChain 的整体架构设计包括哪几层?](#LangChain 的整体架构设计包括哪几层?)
  9. [LLMChain、SequentialChain 有何异同?](#LLMChain、SequentialChain 有何异同?)
  10. [如何在 LangChain 中集成自定义工具?](#如何在 LangChain 中集成自定义工具?)
  11. [LangChain 如何处理错误与重试?](#LangChain 如何处理错误与重试?)
  12. [RAG 的幻觉怎么处理?](#RAG 的幻觉怎么处理?)
  13. 纯向量检索有什么问题?为什么需要混合检索?
  14. [Rerank 是什么?为什么检索之后还要重排序?](#Rerank 是什么?为什么检索之后还要重排序?)
  15. [Chunk 怎么切?切大了切小了各有什么问题?](#Chunk 怎么切?切大了切小了各有什么问题?)
  16. [Embedding 模型怎么选?中文场景选什么?](#Embedding 模型怎么选?中文场景选什么?)
  17. [LangChain 与 LangGraph 的关系是什么?](#LangChain 与 LangGraph 的关系是什么?)
  18. [LangGraph 如何编排多个 Agent?](#LangGraph 如何编排多个 Agent?)
  19. [什么是 Agentic RAG?和普通 RAG 有什么区别?](#什么是 Agentic RAG?和普通 RAG 有什么区别?)
  20. [RAG 检索效果不好怎么优化?](#RAG 检索效果不好怎么优化?)

一、Graph 结构三要素是什么?职责边界怎么划分?

问题

LangGraph 里的 StateGraph 是怎么运转的?Node、Edge、State 各自的职责边界在哪?

标准答案

Graph 结构由 Node(执行单元)、Edge(控制流)、State(共享状态) 三要素组成。

要素 职责 类比
Node 接收当前 State,执行具体逻辑,返回更新后的 State 工厂里的工人,只干一件活
Edge 决定 Graph 的走向:顺序执行、条件分支、循环 传送带 + 分拣员
State 存储所有关键信息,每个 Node 返回更新而非直接修改 共享的工作台记录本

深入解析

Node 不是简单的函数封装------在架构层面,它是一个执行单元,有明确的输入输出契约,还要考虑重试、超时、错误处理等机制。

Edge 条件路由的能力让 Agent 具备了"判断力":

python复制

复制代码
graph.add_conditional_edges(
    start_node="review",
    condition=review_condition,
    mapping={
        True: END,
        False: "write"
    }
)

def review_condition(state) -> str:
    if state["is_approved"]:
        return END
    else:
        return "write"

State 的不可变性保证状态流转的可追溯性,是现代框架的核心设计。

常见追问

Q: State 设计不当会导致什么问题? A:字段臃肿 → 每次执行传递大量冗余数据;混入临时变量 → 不同 Node 间产生隐式依赖。

Q: Node 粒度怎么划分? A:太粗(意图识别+槽位填充+回答生成写在一个 Node) → 难以复用和调试;太细(每个 API 调用一个 Node) → 结构复杂、State 链路过长。建议按职责划分。


二、什么是 Conditional Edge?和普通 Edge 有什么区别?

问题

LangGraph 中 Conditional Edge 是什么?它解决了什么问题?

标准答案

普通 Edgegraph.compile() 时确定目标节点,是编译期决策Conditional Edge 的目标节点由 condition 函数在运行时根据当前 State 决定,是运行时决策

深入解析 --- 编译期 vs 运行时

python复制

复制代码
# 普通 Edge:编译期固定
graph.add_edge("node_a", "node_b")  # 永远从 A 到 B

# Conditional Edge:运行时动态
graph.add_conditional_edges(
    "router",
    lambda state: "pass" if state["score"] > 0.5 else "fail",
    {"pass": "approve_node", "fail": "reject_node"}
)

复杂分支场景示例:内容审核 Agent,三个子检查(色情/暴力/广告),任一拒绝则拒绝:

python复制

复制代码
def moderation_condition(state) -> str:
    if state["porn_check"] == "fail" or state["violence_check"] == "fail":
        return END
    if state["ad_check"] == "fail":
        return "manual_review_node"
    return "publish_node"

常见追问

Q: condition 函数里能不能调用工具? A:理论上可以,但工程上不推荐。condition 职责应保持单一:读取 State → 做判断 → 返回节点名。

Q: 循环路径上如何设置终止条件? A:1. 在 condition 里确保终止条件一定能触发;2. 在 graph.compile(max_steps=10) 设最大循环次数;3. 捕获超限异常做降级处理。


三、什么是 LangChain?它的核心设计理念是什么?

问题

请解释什么是 LangChain,它的核心价值是什么?

标准答案(30秒面试版)

LangChain 是一个用于开发由大语言模型驱动的应用程序的框架。它的核心设计理念是通过**"可组合性"**将多个模块链接在一起,构建复杂而强大的应用。就像 React 用于构建用户界面一样,LangChain 是用于构建大模型应用界面的工具链。

核心价值

  • 降低开发门槛:提供现成的 Chain、Agent、Memory 等组件
  • 增强大模型能力:通过检索增强、工具调用拓展应用边界
  • 提升开发灵活性:支持多模型集成、多数据源对接

6 大核心概念

概念 作用
Models 与各类 LLM 交互的抽象层(LLM + ChatModel + Embedding)
Prompts 提示词模板管理,动态生成,Few-shot
Indexes 文档加载 → 切分 → 向量化 → 检索
Memory 对话历史管理,状态持久化
Chains 组件串联,LCEL 声明式构建
Agents 由 LLM 驱动,动态决定工具调用步骤

四、什么是 LCEL?它有什么优势?

问题

请解释 LCEL 是什么,以及它的优势。

标准答案

LCEL(LangChain Expression Language)是一种声明式的、可组合的语法 ,用 | 管道符将组件串联。

优势

  • 统一接口:所有组件实现 Runnable 接口,统一 invoke/batch/stream
  • 可组合性:管道符串联,代码简洁
  • 自动优化:支持并行执行、流式输出、异步调用
  • 类型安全:更好的类型提示

代码示例

python复制

复制代码
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

model = init_chat_model("openai:gpt-4o-mini")
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的大模型应用开发助手。"),
    ("human", "请用通俗语言解释:{topic}")
])

# LCEL 链式调用
chain = prompt | model | StrOutputParser()
answer = chain.invoke({"topic": "LangChain 是什么"})

Runnable 接口提供的调用方式

方法 说明
invoke 单次调用
batch 批量调用
stream 流式输出
astream 异步流式
with_retry 自动重试
with_fallbacks 降级备用

五、什么是 RAG?完整链路是什么?

问题

什么是 RAG?在 LangChain 中如何实现检索增强生成?

标准答案

RAG(Retrieval-Augmented Generation)就是一句话:在 LLM 生成回答前,先从外部知识库检索相关信息,把检索结果塞进 Prompt,让 LLM 基于事实回答。

LLM 的三大知识缺陷

  1. 知识截止:训练数据有截止日期,昨天的事不知道
  2. 私有数据无法触达:公司内部文档、客户数据从未见过
  3. 容易幻觉:不确定时编造看似合理但错误的信息

RAG 七步链路

code复制

复制代码
Query → 文档处理 → Chunking → Embedding → 检索 → Rerank → 生成
步骤 做什么 关键决策
文档处理 解析 PDF/Word/Markdown,提取文本 PDF 表格怎么处理?要不要 OCR?
Chunking 把长文档切成小块 切多大?overlap 多少?
Embedding 把文本块转成向量 用什么模型?维度多少?
检索 根据问题检索最相关文本块 纯向量还是混合检索?Top-K 多少?
Rerank 对检索结果重排序 用什么 Rerank 模型?
生成 检索结果 + 问题喂给 LLM Prompt 怎么写?幻觉怎么约束?

代码示例

python复制

复制代码
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS

splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=30)
docs = splitter.create_documents(texts)
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

六、LangChain 中 Memory 是如何工作的?

问题

LangChain 中的 Memory 有哪些类型?短期历史和长期记忆怎么区分?

标准答案

Memory 保存对话状态,让模型理解之前聊过什么。为什么不能把全部历史塞进 prompt?三个原因:上下文窗口有限、Token 成本高、旧信息干扰。

记忆类型

类型 特点 适用场景
ConversationBufferMemory 直接保存全部对话历史 短期简单对话
ConversationSummaryMemory 自动摘要历史对话 长对话,节省 Token
ConversationBufferWindowMemory 只保留最近 k 轮 Token 预算有限
VectorStoreRetrieverMemory 向量检索历史 长期跨会话记忆
EntityMemory 跟踪特定实体信息 需要记住人物/事物
ConversationSummaryBufferMemory 摘要 + 完整混合 综合场景

工程优化手段

  • 窗口裁剪:只保留最近 N 轮
  • 摘要压缩:对历史做摘要
  • 向量检索记忆:按需检索历史
  • 过期淘汰:自动清理过期对话

短期 vs 长期记忆

类型 内容 判断标准
短期历史 最近几轮消息、临时工具结果 不稳定、很快过期
长期记忆 用户偏好、项目背景、常用术语 稳定、高频复用

七、什么是 LangChain Agent?和 Chain 有什么区别?

问题

什么是 LangChain Agent?它和普通 Chain 有什么区别?

标准答案

普通 Chain :输入进来,模型直接生成输出(线性流程)。 Agent:先判断任务需要什么工具 → 调用工具 → 观察工具结果 → 继续决策 → 完成或停止。

Agent 核心组件

组件 作用
LLM 提供推理和决策能力
Tools 连接外部世界的接口(搜索、数据库、API 等)
Prompt 告诉 Agent 规则、输出格式、约束
Memory 保存对话历史和任务状态
Executor 执行控制器,驱动循环

协作流程

code复制

复制代码
用户输入 → Agent(理解意图,选择工具)
  ↓
LLM(生成工具调用)
  ↓
Tools(执行工具)
  ↓
Memory(更新状态)
  ↓
返回用户

Agent 类型对比

Agent 类型 特点 适用场景
Zero-shot ReAct 不需示例,直接推理和行动 通用任务
ReAct Docstore 专门文档检索 文档问答
Self-Ask-with-Search 自我提问并搜索 多步搜索任务
Conversational 支持多轮对话 对话型应用

LangChain Agent vs 原生 Agent

特性 LangChain Agent 原生 Agent (OpenAI Function Calling)
复杂性 高,框架封装 低,直接调用
工具生态 ✅ 丰富,内置大量工具 ❌ 有限,需自行实现
扩展性 ✅ 模块化,易于扩展 ❌ 需自定义
性能 有框架开销 轻量高效
适用场景 快速构建复杂 Agent 简单工具调用、低延迟场景

八、LangChain 的整体架构设计包括哪几层?

问题

LangChain 的整体架构设计包括哪几层,分别起什么作用?

标准答案

LangChain 整体架构可划分为 基础层、核心层、应用层 三大层级:

层级 包含内容 作用
基础层 模型接口、外部工具集成 对接各类 LLM(云端/本地),统一调用接口
核心层 Prompts、Chains、Memory、Agents、Tools 提供可组合的核心组件和标准化接口
应用层 文档问答、智能客服、数据分析助手等 基于核心层构建具体应用

基础层:既支持 OpenAI、Google PaLM 等云端 API 模型,也兼容 Llama、ChatGLM 等本地部署模型。

核心层:通过 LCEL 将各组件串联,提供统一的 Runnable 接口。

应用层:RAG 知识库问答、SQL Agent、数据分析助手等。


九、LLMChain、SequentialChain 有何异同?

问题

LLMChain、SequentialChain 和 SimpleSequentialChain 有哪些异同?

标准答案

Chain 类型 特点 输入/输出 适用场景
LLMChain 最基础,直接调用 LLM 单一输入 → 单一输出 简单问答、文本生成
SimpleSequentialChain 顺序执行,前一个输出自动成为下一个输入 单输入/单输出,自动传递 简单多步串联
SequentialChain 顺序执行,可指定多个输入/输出 多输入/多输出,需显式映射 复杂多步任务

代码示例

python复制

复制代码
# SimpleSequentialChain:自动传递
chain1 = LLMChain(llm=llm, prompt=prompt1)
chain2 = LLMChain(llm=llm, prompt=prompt2)
simple_chain = SimpleSequentialChain(chains=[chain1, chain2])

# SequentialChain:显式映射
chain1 = LLMChain(llm=llm, prompt=prompt1, output_key="step1_result")
chain2 = LLMChain(llm=llm, prompt=prompt2, output_key="step2_result")
seq_chain = SequentialChain(
    chains=[chain1, chain2],
    input_variables=["input"],
    output_variables=["step1_result", "step2_result"]
)

十、如何在 LangChain 中集成自定义工具?

问题

如何在 LangChain 中集成自定义工具?

标准答案

集成自定义工具有四个步骤:

  1. 定义工具函数:实现具体功能、定义输入输出格式、处理错误
  2. 创建 Tool 对象 :用 Tool 类包装函数,定义名称和描述
  3. 注册到 Agent:将工具添加到工具列表,在 Agent 初始化时传入
  4. 测试工具:单独测试 + 集成测试

代码示例

python复制

复制代码
from langchain.agents import Tool

def search_function(query: str) -> str:
    """调用搜索引擎"""
    return search_api(query)

tools = [
    Tool(
        name="Search",
        func=search_function,
        description="搜索工具,输入搜索关键词返回结果"
    ),
    Tool(
        name="Calculator",
        func=calculator_function,
        description="数学计算工具,输入数学表达式返回计算结果"
    )
]

agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent="zero-shot-react-description"
)

工具设计要点

  • 工具名称要清晰,让模型能区分
  • 工具描述要详细,包含输入格式和使用场景
  • 参数定义要精确(使用 Pydantic 做 Schema 校验)
  • 错误处理要完善(返回友好错误信息而非抛异常)

十一、LangChain 如何处理错误与重试?

问题

LangChain 中如何处理错误、重试和降级?

标准答案

LangChain 调用链路很长:用户输入 → 输入验证 → LLM 调用 → 工具调用 → 输出解析 → 返回结果。每一步都可能出错。

三种错误处理机制

1. with_retry 自动重试

python复制

复制代码
from langchain_core.runnables import Runnable

model_with_retry = model.with_retry(
    retry_if_exception_type=(RateLimitError, TimeoutError),
    wait_exponential_jitter=True,
    stop_after_attempt=3
)

2. with_fallbacks 降级备用

python复制

复制代码
primary_chain = prompt | claude_model | output_parser
fallback_chain = prompt | gpt4_model | output_parser

chain_with_fallback = primary_chain.with_fallbacks(
    fallbacks=[fallback_chain]
)

3. 自定义异常处理

python复制

复制代码
class RetryOutputParser(BaseOutputParser):
    """解析失败时自动重试"""
    def parse(self, text: str):
        try:
            return self._parse(text)
        except OutputParserException:
            return self._retry_with_fix(text)

常见错误类型

错误类型 解决方案
LLM API 超时/限流 (429) with_retry + 指数退避
工具调用格式不对 输出 Parser 校验 + 重试
模型输出非期望格式 with_fallbacks 降级
网络抖动 with_retry 自动重试

十二、RAG 的幻觉怎么处理?

问题

RAG 检索到了正确信息,LLM 还是编造了不存在的内容,怎么办?

标准答案

幻觉是 RAG 项目最大的工程挑战,面试必问。

幻觉的两种类型

类型 说明 示例
内在幻觉 和检索结果矛盾 检索说 91%,LLM 说 95%
外在幻觉 生成了检索结果没有的内容 检索只提 A,LLM 编了 B

六种处理策略

1. Prompt 约束

python复制

复制代码
prompt = """
你是一个基于检索结果回答问题的AI助手。
请严格按照以下规则:
1. 只使用提供的参考资料来回答问题
2. 如果资料中没有相关信息,请回答"无法确定"
3. 不要编造任何信息

参考资料:{context}
问题:{question}
"""

2. 输出自校验

python复制

复制代码
VERIFICATION_PROMPT = """
请检查以下回答是否每一条都能在参考资料中找到依据。
对于每条声明,标注:✅ 有依据 / ❌ 无依据 / ⚠️ 部分依据

回答:{answer}
参考资料:{context}
"""

3. 引用标注:要求 LLM 标注每条信息的来源 chunk

4. 温度调低:temperature 设 0.1-0.3,降低随机性

5. 检索-生成对齐:生成后把回答和检索结果做相似度对比

6. 兜底回答:检索结果相似度低于阈值时,直接返回"未找到相关信息"


十三、纯向量检索有什么问题?为什么需要混合检索?

问题

纯向量检索有什么问题?为什么需要混合检索?

标准答案

纯向量检索的三个致命问题

  1. 精确匹配不行:搜"RFC 7231"可能返回"HTTP 协议规范"
  2. 专业术语召回差:"K8s HPA 配置"和"Kubernetes 自动扩缩容"向量距离很远
  3. 专有名词遗漏:产品名、人名、缩写容易丢失

混合检索 = 向量检索 + 关键词检索

code复制

复制代码
向量检索(语义 + 模糊匹配)→ http协议、性能优化
关键词检索(精确匹配)→ RFC 7231、HPA 配置
                            ↓
                    RRF 合并排名
                            ↓
                    最终结果

RRF(Reciprocal Rank Fusion)合并策略

python复制

复制代码
def rrf_merge(vector_results, bm25_results, k=60):
    scores = {}
    for rank, doc in enumerate(vector_results):
        scores[doc.id] = scores.get(doc.id, 0) + 1 / (k + rank + 1)
    for rank, doc in enumerate(bm25_results):
        scores[doc.id] = scores.get(doc.id, 0) + 1 / (k + rank + 1)
    return sorted(scores.items(), key=lambda x: x[1], reverse=True)

k 通常设 60,排名越靠前贡献分数越高。RRF 不需要调权重,更稳健。

面试核心点

能说清楚纯向量检索的三个问题,以及混合检索为什么能解决、合并策略用 RRF,这就是面试官想听的深度。


十四、Rerank 是什么?为什么检索之后还要重排序?

问题

你已经用了混合检索,为什么还要 Rerank?

标准答案

检索是粗筛 ,Rerank 是精排

维度 检索 Rerank
模型 Bi-Encoder Cross-Encoder
速度 快,可预计算 慢,需逐对计算
精度 近似相关 精确相关
数据处理 百万级 → Top-20 Top-20 → Top-5

Bi-Encoder vs Cross-Encoder

向量检索(Bi-Encoder):问题和文档分别编码成向量,算相似度。互不知道对方存在,只能算"大概相关"。

Rerank(Cross-Encoder):把问题和文档拼在一起送进模型,模型同时看到双方内容,做更精确的相关性判断。代价是慢,只能对少量候选做精排。

效果数据

指标 检索后(无 Rerank) Rerank 后
Top-5 召回率 71% 89%
Top-3 准确率 65% 84%

常用 Rerank 模型

模型 特点
BGE-Reranker (bge-reranker-v2-m3) 中文效果好,开源免费
Cohere Rerank API 调用,英文为主
bce-reranker-base_v1 中文场景,轻量级

十五、Chunk 怎么切?切大了切小了各有什么问题?

问题

你们 Chunk 策略怎么设计的?chunk_size 设多少?为什么?

标准答案

切大了 → 信息稀释:相关片段被无关内容淹没,相似度降低 切小了 → 上下文丢失:断章取义,LLM 无法理解完整含义

三种主流 Chunk 策略

① 固定长度切分:每 512 token 切一块。简单但不顾语义边界。

② 递归切分(生产环境最常用):

python复制

复制代码
from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=200,
    separators=["\n\n", "\n", "。", "!", "?", ";", ",", " ", ""]
)

③ 语义切分:用 Embedding 计算相邻句子的语义相似度,在语义断点处切分。效果好但计算量大。

Overlap 的作用

相邻 chunk 之间重叠一部分文字,避免关键信息正好在切割点被截断。通常设 chunk_size 的 10%-20%。

不同文档类型的处理策略

文档类型 处理策略
Markdown 按标题层级切分,保留层级信息
PDF 先解析表格和图片,再按段落
代码 按函数/类切分,保留完整代码块
FAQ 每个问答对作为一个 chunk

十六、Embedding 模型怎么选?中文场景选什么?

问题

你们用什么 Embedding 模型?为什么选它?

标准答案

选型看三个维度:语言支持、向量维度、检索效果

中文场景主流模型

模型 维度 特点
bge-large-zh-v1.5 1024 中文效果最好,开源,本地部署
bge-m3 1024 多语言,支持稠密+稀疏+多向量三种检索
text-embedding-3-large (OpenAI) 3072 效果好但 API 调用有成本
text-embedding-3-small (OpenAI) 1536 便宜,英文场景首选

维度越高越好吗?

不是。维度高 → 表达能力强但存储和检索成本也高。1024 维是当前性价比最好的选择,3072 维效果提升有限但存储翻 3 倍。

面试答法

"中文场景选 bge-large-zh,因为 MTEB 中文榜单排名靠前,开源可本地部署。英文场景或对延迟不敏感,OpenAI 的 embedding 更方便。"


十七、LangChain 与 LangGraph 的关系是什么?

问题

LangChain 和 LangGraph 有什么区别?它们是怎么配合的?

标准答案

方面 LangChain LangGraph
核心能力 封装单个 Agent 的能力 多 Agent 工作流编排
类比 造"干活的人"的模具 定"干活的规矩"的流水线
多 Agent 编排 勉强能,用嵌套,没有可视化 核心功能,支持分支/循环/并行
状态管理 简单链式传递 有向图 + StateGraph 状态机

简单说:LangChain 造 Agent,LangGraph 编排 Agent。

第二层:LangGraph 的核心定位

LangGraph 将智能体及其交互抽象为"图"(Graph),其中节点代表智能体或功能,边定义控制流和数据流。支持:

  • 分支(condition-based routing)
  • 循环(retry、iterative refinement)
  • 汇合(多 Agent 写入共享状态)
  • 条件路由(根据执行结果动态决定后续流程)

第三层:生产环境的典型分工

code复制

复制代码
LangChain
  ├─ 定义 Agent(ReAct、Plan-and-Execute)
  ├─ 定义 Tools(搜索、数据库、API)
  └─ 定义 Memory(对话历史、向量记忆)

LangGraph
  ├─ StateGraph 定义工作流拓扑
  ├─ Node 添加 Agent 节点
  ├─ Edge 定义流转逻辑
  └─ Conditional Edge 实现分支决策

十八、LangGraph 如何编排多个 Agent?

问题

LangGraph 如何编排多个 Agent?比如 Agent A/B/C 怎么协作?

标准答案

用 LangGraph 可以像"画流程图"一样定义协作逻辑。核心是:将每个 Agent 作为 Node 加入 StateGraph,用 Edge 定义流转规则。

示例:智能数据分析助手

假设需要 3 个 Agent 协作:

  • Agent A:判断问题类型(查数据?画图?写报告?)
  • Agent B:数据查询 Agent
  • Agent C:可视化 Agent

python复制

复制代码
from langgraph.graph import StateGraph, END

workflow = StateGraph(AgentState)

# 添加 Agent 节点
workflow.add_node("classifier", agent_a)   # 判断问题类型
workflow.add_node("query", agent_b)         # 数据查询
workflow.add_node("visualize", agent_c)     # 数据可视化

# 设置入口
workflow.set_entry_point("classifier")

# 条件路由:根据分类结果走不同分支
workflow.add_conditional_edges(
    "classifier",
    lambda state: state["question_type"],
    {
        "query": "query",
        "visualize": "visualize",
        "report": "report"
    }
)

workflow.add_edge("query", END)
workflow.add_edge("visualize", END)

app = workflow.compile()
app.invoke({"question": "帮我查下本月销售额并画个柱状图"})

LangGraph 实现的编排能力

模式 说明 适用场景
顺序编排 Agent A → Agent B → Agent C 流水线处理
条件分支 不同结果走不同 Agent 路由、分类
循环 条件不满足时重复执行 反思、重试
并行 多个 Agent 同时执行 多维度分析
汇合 多 Agent 结果合并 投票、汇总

多 Agent 架构模式

1. 监督者模式(Supervisor)

code复制

复制代码
用户 → Supervisor Agent
         ├── Research Agent
         ├── Code Agent
         └── QA Agent

2. 分层团队(Hierarchical Teams)

code复制

复制代码
Team Leader
  ├── 子团队 A
  │     ├── Agent A1
  │     └── Agent A2
  └── 子团队 B
        ├── Agent B1
        └── Agent B2

3. 协作型多智能体 通过共享的消息暂存区通信,每个 Agent 能查看其他 Agent 的工作。


十九、什么是 Agentic RAG?和普通 RAG 有什么区别?

问题

你了解 Agentic RAG 吗?它和普通 RAG 有什么区别?

标准答案

普通 RAG 的局限

普通 RAG 是固定流程:用户问 → 检索一次 → 生成回答。如果第一次检索结果不好,不会自己纠正。

Agentic RAG:让 RAG 自己决定怎么检索

维度 普通 RAG Agentic RAG
检索次数 固定 1 次 动态,LLM 决定
检索策略 固定 pipeline LLM 自主选择
结果不满意 直接生成 换策略重新检索
复杂问题 容易答偏 拆解子问题分步检索
Token 消耗 高(多次推理)

Agentic RAG 工作流程

code复制

复制代码
用户问题 → Agent 规划:需要检索什么?
  → 第一次检索
  → Agent 判断:结果够不够?
    → 不够 → 换个 query 再检索
    → 够了 → 生成回答

面试核心判断力

Agentic RAG 适合复杂知识问答场景(法律、医疗、金融),简单问答用普通 RAG 就够了,别过度设计。


二十、RAG 检索效果不好怎么优化?

问题

你们 RAG 项目的检索准确率是多少?效果不好怎么优化的?

标准答案

从链路的每一步找问题:

优化思路

阶段 问题 优化方向
文档处理 PDF 表格提取不准 专业表格提取工具 + OCR
Chunk chunk_size 不合理 按文档类型调参,设置 overlap
检索 纯向量召回差 混合检索 + Rerank
生成 幻觉 Prompt 约束 + 自校验

四种高级优化策略

1. Query 改写

code复制

复制代码
原始问题:怎么调优?
改写后:RAG 系统中向量检索准确率低,有哪些优化方法?

2. 多路召回 同一问题用多种方式检索:原问题、改写问题、提取关键词、拆分子问题,最后合并。

3. Parent-Child 检索

  • 检索时用小 chunk(精确匹配)
  • 返回时用大 chunk(保留上下文)
  • 每个小 chunk 关联一个父 chunk,命中后返回父 chunk 完整内容

4. 上下文窗口扩展 检索到一个 chunk 后,把它前后的 chunk 也带上。

面试加分

能说出实际用过的优化策略和量化效果,比如:

  • "加了 Rerank 后 Top-5 召回率从 71% 提到 89%"
  • "混合检索比纯向量在专业术语场景下准确率提升 25%"

附录:大厂真实面试追问汇总

检索策略类

Q:混合检索权重怎么调?向量和 BM25 各占多少? A:两种做法。一是手动调权重(向量 0.7 + BM25 0.3);二是用 RRF 合并,更稳健。生产环境推荐 RRF。

Q:Top-K 设多少?设大了设小了各有什么问题? A:设小了(K=3)可能漏掉相关文档;设大了(K=20)太多无关信息干扰。通常 K=5-10 是平衡点。

Q:用户问题很模糊,检索效果差,怎么办? A:Query 改写 + 多路召回 + Agent 追问确认。

工程落地类

Q:RAG 系统端到端延迟怎么优化? A:vLLM 推理、KV Cache 复用、流式输出、Prompt 压缩、HNSW 索引优化(50ms 以下)。

Q:文档更新了,向量索引怎么更新? A:全量重建(日级)、增量更新(实时)、双写(零停机切换)。

Q:Token 成本怎么控制? A:Prompt 压缩 + 上下文窗口管理 + 模型路由(简单问题用小模型)+ 缓存。

场景设计类

Q:设计一个面向 10 万用户的 RAG 知识库系统,怎么设计? A:从五个维度展开:

  • 数据层:文档解析 → Chunk → Embedding → 向量库 + ES 双写
  • 检索层:混合检索 + Rerank,Top-20 检索 + Top-5 精排
  • 生成层:vLLM 部署 + Prompt 模板 + 幻觉约束
  • 工程层:Redis 缓存、异步处理、监控
  • 安全层:文档权限隔离、Prompt Injection 防御、敏感信息过滤

总结

本文整理了 20 道 LangChain/LangGraph/RAG 面试高频题,覆盖:

模块 题数 核心知识点
LangGraph 核心 2 题 Node/Edge/State、Conditional Edge
LangChain 基础 7 题 核心概念、LCEL、Agent、Memory、Chain 类型
RAG 专题 6 题 完整链路、幻觉处理、混合检索、Rerank、Chunk、Embedding
LangGraph 编排 2 题 LangChain vs LangGraph、多 Agent 协作
高级优化 3 题 Agentic RAG、检索优化、大厂面试追问

每道题都包含标准答案、深入解析和常见追问,建议结合自己的项目经验,把"踩过的坑"变成面试加分项。

PS:本文八股皆为QClaw整合转载,并非本人自创,本人仅把控八股相关性与质量。