第14章 知道边界在哪,比知道怎么做更难
前面13章,我们一直在帮Agent变强——装脑子、装手脚、装记忆、学规划、组团队、配框架、做安全。这一章,我们反过来聊聊:Agent 不能做什么?边界在哪?说实话,知道边界在哪,比知道怎么做更难——但不知道边界,你会踩遍所有坑。
14.1 Agent能做什么?不能做什么?
14.1.1 能做的:Agent的舒适区
经过前面13章,你应该对Agent的强项有了清晰的认知:
| 能做 | 例子 |
|---|---|
| 理解自然语言 | 看懂用户说的是"帮我查天气" |
| 调用外部工具 | 查API、搜数据库、执行代码 |
| 多步骤推理 | "安排出差"拆成订机票+订酒店+安排会议 |
| 多Agent协作 | 前端Agent+后端Agent+测试Agent |
| 从反馈中学习 | "这个答案不对"→下次不会再犯 |
14.1.2 不能做的:Agent的天花板
| 不能做 | 为什么 | 怎么办 |
|---|---|---|
| 真正"理解"世界 | LLM是模式匹配,没有真正的意识 | 别把Agent当人 |
| 保证100%正确 | 幻觉是LLM的天性 | 关键决策加人工确认 |
| 处理高度专业领域 | 没有训练数据的领域它不会 | 用RAG补专业知识 |
| 做创造性突破 | LLM能组合已知,不能从零发明 | 人类做创新,Agent做执行 |
| 处理实时物理世界 | Agent活在数字世界 | 需要机器人+传感器的领域别用纯Agent |
14.2 Agent也会"胡说八道",怎么验证事实?
14.2.1 幻觉从哪来
LLM的幻觉不是bug,是架构特性。它本质上是个"接话高手"——当它不知道答案时,它会"接"一个听起来合理但其实不对的回答。
举个例子:
用户:2024年诺贝尔物理学奖得主是谁?
LLM:2024年诺贝尔物理学奖授予了XXX,表彰其在XXX领域的贡献。
(如果训练数据里没有,LLM可能自信地编一个)14.2.2 交叉验证:让Agent"自己检查自己"
python
def verify_with_multiple_sources(question, agent, num_checks=3):
"""让Agent用不同方式回答同一个问题,交叉验证"""
answers = []
for i in range(num_checks):
# 每次用略微不同的Prompt,降低"众口一词"的风险
prompt = f"""
请回答以下问题(这是第{i+1}次独立回答,不要参考之前的回答):
{question}
如果你不确定,请明确说"不确定",不要猜测。
"""
answers.append(agent.invoke(prompt))
# 检查答案是否一致
if all(a == answers[0] for a in answers):
return {"answer": answers[0], "confidence": "高"}
elif sum(1 for a in answers if a == answers[0]) >= 2:
return {"answer": answers[0], "confidence": "中"}
else:
return {"answer": "答案不一致,建议人工核实", "confidence": "低"}14.2.3 外部知识库校验
让Agent的回答必须引用知识库中的原文。
python
def answer_with_citation(question, vectorstore, llm):
"""回答必须带引用"""
# 1. 检索相关文档
docs = vectorstore.similarity_search(question, k=3)
# 2. 构建带引用的Prompt
prompt = f"""
基于以下文档回答问题。每句话后面标注来源(如[文档1])。
如果文档中没有相关信息,回答"根据现有资料无法确认"。
文档1: {docs[0].page_content}
文档2: {docs[1].page_content}
文档3: {docs[2].page_content}
问题: {question}
"""
response = llm.invoke(prompt)
# 3. 检查引用是否真的存在
for i, doc in enumerate(docs):
cited_mark = f"[文档{i+1}]"
if cited_mark in response:
# 粗略验证:引用标注了,但引用内容是否准确需要更复杂的检查
pass
return response14.3 Agent做错了事,谁负责?
14.3.1 真实案例
2023年,一个律师用ChatGPT准备法律文件,AI编造了几个不存在的判例。律师没核实就提交了,结果被法官发现,面临制裁。
问题:这是AI的错,还是律师的错?
答案很清楚:律师的错。 他用AI当工具,但没核实——责任在使用者。
14.3.2 责任归属的底线原则
| 场景 | 谁负责 |
|---|---|
| Agent给的答案有误,用户直接用了 | 用户——没有核实 |
| Agent执行了错误操作(退款了不该退的订单) | 开发者——权限控制没做好 |
| Agent被Prompt注入攻击,泄露了数据 | 开发者——安全防护没做到位 |
| Agent拒绝执行合法请求 | 开发者——过度限制 |
| Agent自动发了垃圾邮件 | 开发者——没有设置操作确认 |
原则:Agent是你的工具。你用工具做了什么,责任在你;你设计的工具有漏洞,责任也在你。
14.4 你的下一个同事,可能是Agent
14.4.1 什么工作最可能被Agent改变
不是"替代",是"改变"。Agent不会让你失业,但会改变你工作的方式:
最容易改变的岗位:
- 客服:Agent处理80%的常规问题,人类处理20%的复杂投诉
- 数据分析:Agent跑数据、出图表,人类做洞察和决策
- 代码编写:Agent写重复代码、写测试,人类做架构和Review
最难改变的岗位:
- 需要物理操作:护士、厨师、电工
- 需要高度创意:艺术家、顶尖科学家
- 需要人际信任:心理咨询师、谈判专家
14.4.2 你现在该做什么
学这本书,你已经走在前面了。但技能只是第一步:
- 别只学"写Agent",学"设计Agent系统"——第15章会讲
- 保持技术敏感度——AI领域六个月一大变,停下来就是倒退
- 培养"AI+某领域"的复合能力——纯Agent开发者和"懂医疗的Agent开发者",后者值钱三倍
14.5 未来展望:从Agent到AGI之路
14.5.1 我们还在"弱AI"阶段
现在的Agent再强,也只是特定领域的聪明工具。它能订机票、写代码、做客服,但它不能"理解"世界——它没有意识,没有自我,不会"想要"什么。
真正的AGI(通用人工智能)还需要很多年。别信那些说"明年AGI就来了"的标题党。
14.5.2 但Agent已经足够改变很多事情了
不需要AGI。现在的Agent已经能:
- 让一个三人的团队做出以前二十人的产出
- 让一个不会SQL的人用自然语言做数据分析
- 让一个没有编程背景的人搭建自己的AI应用
你不用等AGI。你现在学的Agent技术,已经够用了。
14.6 LangGraph 的人机交互
第 14.3 节我们聊了"Agent 做错了事谁负责",结论是:开发者要在工具上设好"安全阀门"。LangGraph 提供了原生的"安全阀门"——NodeInterrupt。它让 Agent 在执行关键操作前暂停,等待人工审批。
14.6.1 NodeInterrupt:让 Agent 学会"喊停"
python
from langgraph.errors import NodeInterrupt
class OrderState(TypedDict):
order_id: str
amount: float
status: str
human_decision: str | None
def check_order(state: OrderState) -> dict:
# 大额订单需要人工审批
if state["amount"] > 5000:
raise NodeInterrupt(
f"订单 {state['order_id']} 金额 {state['amount']} 元,需要人工审批"
)
return {"status": "auto_approved"}NodeInterrupt 会暂停整个 Agent 流程,把所有上下文保存到检查点。人工审批后,Agent 从暂停的地方继续执行。
14.6.2 审批后的恢复
审批流程分为三步:触发中断 → 人工决策 → 恢复执行。
python
# 1. 执行(触发中断)
try:
result = app.invoke({"order_id": "O123", "amount": 10000})
except NodeInterrupt as e:
print(f"等待审批: {e.message}")
thread_id = result["configurable"]["thread_id"]
# 2. 人工审批(外部系统)
human_decision = "approve" # 假设人工批准
# 3. 用同一个 thread_id 恢复执行
result = app.invoke(
{"human_decision": human_decision},
config={"configurable": {"thread_id": thread_id}}
)thread_id 是恢复的关键——它让 Agent 找到之前的检查点,从断点继续执行。
14.6.3 实战案例:内容审核和邮件审批
内容审核——发布前自动检测敏感词,触发人工审核:
python
class ContentModerationState(TypedDict):
content: str
needs_review: bool
final_decision: str | None
def detect_sensitive_content(state: ContentModerationState) -> dict:
flag_words = [w for w in SENSITIVE_WORDS if w in state["content"]]
if flag_words:
raise NodeInterrupt(f"检测到敏感词: {flag_words}")
return {"needs_review": False}邮件发送审批——重要邮件发出前,人工确认收件人和正文:
python
class EmailState(TypedDict):
to: str
subject: str
body: str
def draft_email(state: EmailState) -> dict:
# 草稿完成,暂停等待审批
raise NodeInterrupt(
f"邮件发送给 {state['to']}: {state['subject']}",
context={"preview": state["body"][:100]}
)这两个场景的共同点都是:Agent 走到"关键一步"时主动停下,等人工点头再继续。
NodeInterrupt 的本质,就是把第 14.3 节说的"安全阀门"做成了代码。 它不是限制 Agent 的能力,而是给 Agent 加了一道保险——知道什么时候该请示人类,比埋头硬干聪明得多。
14.7 本章小结
这一章我们"反着"思考了Agent:
- Agent有清晰的边界:能做多步推理和工具调用,但不能真正理解世界、不能保证100%准确。
- 幻觉是天性,验证是手段:交叉验证、知识库引用——把幻觉的危害降到最低。
- 责任在人,不在Agent:你做的工具,你负责。Agent是锤子,砸到手不能怪锤子。
- Agent改变工作,不消灭工作:重复性的会变,创造性的会涨。复合型人才最值钱。
✅ 知识点检查
学完这一章,试试回答这几个问题:
- [ ] Agent的"舒适区"和"天花板"分别是什么?
- [ ] 为什么要交叉验证Agent的回答?怎么实现?
- [ ] Agent执行了错误操作,责任在谁?为什么?
- [ ] 最容易和最不容易被Agent改变的岗位各自有什么特征?
📚 延伸阅读
- 《The Alignment Problem》— Brian Christian
- Anthropic 的 AI Safety 研究:https://www.anthropic.com/research
- 本书配套源码:关注公众号「图解AI系列」免费领取
🎯 下一章预告
第15章,最后一章理论篇——
"恭喜,你不只会写Agent了。从写代码到做决策——如何设计一个Agent系统?"

