Skip to content

第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 response

14.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 你现在该做什么

学这本书,你已经走在前面了。但技能只是第一步:

  1. 别只学"写Agent",学"设计Agent系统"——第15章会讲
  2. 保持技术敏感度——AI领域六个月一大变,停下来就是倒退
  3. 培养"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:

  1. Agent有清晰的边界:能做多步推理和工具调用,但不能真正理解世界、不能保证100%准确。
  2. 幻觉是天性,验证是手段:交叉验证、知识库引用——把幻觉的危害降到最低。
  3. 责任在人,不在Agent:你做的工具,你负责。Agent是锤子,砸到手不能怪锤子。
  4. Agent改变工作,不消灭工作:重复性的会变,创造性的会涨。复合型人才最值钱。

✅ 知识点检查

学完这一章,试试回答这几个问题:

  • [ ] Agent的"舒适区"和"天花板"分别是什么?
  • [ ] 为什么要交叉验证Agent的回答?怎么实现?
  • [ ] Agent执行了错误操作,责任在谁?为什么?
  • [ ] 最容易和最不容易被Agent改变的岗位各自有什么特征?

📚 延伸阅读

  • 《The Alignment Problem》— Brian Christian
  • Anthropic 的 AI Safety 研究:https://www.anthropic.com/research
  • 本书配套源码:关注公众号「图解AI系列」免费领取

🎯 下一章预告

第15章,最后一章理论篇——

"恭喜,你不只会写Agent了。从写代码到做决策——如何设计一个Agent系统?"