62 lines
3.9 KiB
Markdown
62 lines
3.9 KiB
Markdown
---
|
||
id: ai.langchain.interview
|
||
title: LangChain 面试题
|
||
type: interview
|
||
domain: ai
|
||
stack: [langchain]
|
||
tags: [LangChain, LCEL, 结构化输出, 面试]
|
||
level: intermediate
|
||
related: [ai.langchain.lcel-structured-agent]
|
||
week: [6, 11, 16]
|
||
---
|
||
|
||
# LangChain 面试题
|
||
|
||
## 基础
|
||
|
||
### 【基础】LangChain 是什么?主要组件有哪些?
|
||
|
||
**参考答案**:构建大模型应用的框架,提供统一的模型接口、消息、提示词模板、输出解析、工具、检索组件、Agent。1.x 中 Agent 统一为 `create_agent`(基于 LangGraph),并通过中间件扩展。
|
||
|
||
**追问**:LangChain、LangGraph、LangSmith 的关系?→ LangChain 提供组件和高层 Agent;LangGraph 是底层的有状态编排框架;LangSmith 是追踪、评测和监控平台。
|
||
|
||
### 【基础】LCEL 是什么?
|
||
|
||
**参考答案**:LangChain 表达式语言,用 `|` 把 Runnable 组件组合成链,统一支持同步 / 异步、流式、批处理,以及重试、备用、并行等能力。
|
||
|
||
**追问**:`batch` 和循环调用 `invoke` 有什么区别?→ `batch` 会并发执行(可以用 `max_concurrency` 控制并发数),速度更快;循环是串行的。
|
||
|
||
### 【基础】怎么让模型输出结构化数据?
|
||
|
||
**参考答案**:优先使用模型原生的结构化输出(`with_structured_output(Schema)`,底层用工具调用或 JSON Schema 模式);不支持时用提示词 + `PydanticOutputParser`。无论哪种都要校验,失败时重试或降级。
|
||
|
||
**追问**:Schema 设计要注意什么?→ 用枚举限制取值、字段加描述、可选字段明确、不要嵌套太深;字段名和描述模型都会读。
|
||
|
||
## 进阶
|
||
|
||
### 【进阶】LangChain 1.x 和 0.x 有什么主要变化?
|
||
|
||
**参考答案**:Agent 统一为 `create_agent`,基于 LangGraph 构建,支持检查点、流式和人工介入;引入中间件机制(调用限制、摘要、人工审批、备用模型等);旧的 `AgentExecutor`、`LLMChain` 等移到 `langchain-classic`;核心包更精简。具体以官方迁移文档为准。
|
||
|
||
**追问**:项目里遇到过版本问题吗?→ 按实际经历讲(例如教程是 0.x 写法、包版本不匹配),以及怎么解决(锁定版本、读迁移文档、写测试)。
|
||
|
||
### 【进阶】怎么做模型的重试和降级?
|
||
|
||
**参考答案**:Runnable 的 `with_retry` 处理临时错误;`with_fallbacks` 在主链失败后切换到备用模型或提供方;1.x 的 Agent 也可以使用备用模型中间件。降级的最后一层通常是“返回友好提示 / 转人工”。
|
||
|
||
**追问**:备用模型效果差一些怎么办?→ 评测备用模型在关键用例上的表现,可以只对部分功能降级;记录降级发生的比例并告警。
|
||
|
||
## 场景题
|
||
|
||
### 【场景题】做一个工单自动分类服务,你会怎么设计?
|
||
|
||
**参考答案**:结构化输出(枚举类别、格式校验)+ 重试 + 备用提供方;低置信度人工复核和抽检;异步执行不阻塞工单创建;历史数据批处理控制并发、断点续跑;记录模型和提示词版本;评测集验证准确率。详见[工单分类场景](scenarios/ticket-triage.md)。
|
||
|
||
**追问**:怎么衡量分类效果?→ 用人工标注的样本计算准确率和各类别的召回率,特别关注高风险类别(投诉)的召回。
|
||
|
||
### 【场景题】团队里有人说“LangChain 太重了,不如直接调 SDK”,你怎么看?
|
||
|
||
**参考答案**:各有适用场景。简单调用、单一模型提供方、追求可控性,直接用 SDK;需要多提供方切换、检索 / 工具 / Agent 生态、中间件和 LangGraph 编排能力时,LangChain 能节省大量工作。关键是封装要适度,并锁定版本、写测试应对版本变化。
|
||
|
||
**追问**:如果用 SDK,怎么保留切换模型的能力?→ 自己定义一层薄的模型接口(或使用 OpenAI 兼容接口),业务代码不直接依赖某个厂商的 SDK。
|