AI Agent 从零到百万价值迭代之路

这个时代Agent的本质:用精心设计的prompt作为"控制语句",用LLM作为"解释器",构建一个能处理模糊输入的动态系统-互联网创业老兵

大模型时代为什么是革命

经过了近2年的Agent开发,在法律、工业、营销等领域都落地了多个商业级别的Agent之后,我想就我个人一线的开发经验,来讨论下Agent是实战落地的真实过程,在此之前,先要破解目前Agent领域局外人的两种观点。

1、Agent既不是骗局,也不是全知全能的神,目前阶段抵制是愚昧的,依赖是愚蠢的。

2、大模型时代就是革命,不是优化,不是更新,是彻彻底底的革命,是将编码这件事情带到了一个新的领域和高度,即“自然语言编程”。

下面我将使用一个实例来演示一个真实需求的Agent演化过程,整个过程包含Fake 代码和数据,包含思考逻辑,篇幅较长,但是看完,我保证你“aha”一声。

AI Agent 演进实例

找房场景完整实现

任务:帮用户在北京找一套合适的两居室租房

用户需求:

- 预算:6000元/月

- 位置:靠近地铁,通勤到中关村软件园不超过40分钟

- 户型:两居室,采光好

- 配套:附近有超市和健身房

chatbox阶段

我们每个人都是从这阶段开始,当你第一次使用chatgpt的输入框输入问题,chatgpt直接输出答案的那一刻,实在是让人终身难忘。

所以在第一阶段,最基础的Agent方式就是直接调用大模型接口。

def stage1_instant_answer():
    """
    典型场景:像个热心但不靠谱的老乡
    
    问题展示:
    1. 推荐的小区可能根本不存在
    2. 价格是几年前的数据
    3. 地铁通勤时间凭感觉估算
    4. 配套设施信息完全虚构
    """
    print("=" * 70)
    print("阶段一:基础模式- '我知道!我马上告诉你!'")
    print("=" * 70)
    
    response = client.messages.create(
        model="claude-sonnet-4-5-20250929",
        max_tokens=1024,
        messages=[{
            "role": "user",
            "content": USER_QUESTION
        }]
    )
    
    answer = response.content[0].text
    
    print(f"\n【用户提问】\n{USER_QUESTION}")
    print(f"\n【AI回答】\n{answer}")
    
    print("\n" + "=" * 70)
    print("【翻车现场】")
    print("=" * 70)
    print("""
真实用户反馈:

❌ 用户A:"你推荐的'海淀区科技园小区',我在地图上找了半小时没找到!"

❌ 用户B:"你说5800元/月?我去链家一看,这个区域两居室至少8500起!"

❌ 用户C:"13号线龙泽站到中关村软件园40分钟?我实际通勤1小时15分!"

❌ 用户D:"什么'小区自带健身房'?这个楼是1995年的老破小,哪来的健身房?"
    """)
    
    print("\n【问题本质】")
    print("→ AI在'回忆'训练数据中的房产信息")
    print("→ 小区名可能是多个真实小区的'统计平均'")
    print("→ 价格是几年前的历史数据")
    print("→ 通勤时间凭'经验'估算,未考虑换乘、步行")
    print("→ 配套设施纯属'听起来合理'的编造")
    
    print("\n【引出问题】")
    print("这不是AI不够聪明,而是它被困在了训练数据的时空里。")
    print("就像让一个2020年穿越来的人,给你推荐2024年的房子。")
    
    return answer

定义好角色Role,写清你的问题question,直接扔给大模型,大模型就会给你答案。

逻辑:问题->大模型->答案

方法:单次调用

问题:黑盒输出,快是真快,错也是真的错。任何大模型训练完就是,你可以理解为就是一个大的静态数据库,他所有回答你的问题都是由这个静态数据库组合出来的,所以任何具有时效性的问题大概率出错,即使没有实效性,因为幻觉的原因,这个答案也是几乎不可信的。

思维链阶段

针对上面的问题,我们就会发现,我们问的问题越笼统,越抽象,大模型回复你的答案幻觉,比如你问他“告诉我如何成为世界首富”,你得到的大概是一个扯淡的正确答案。

如何解决这个问题?很简单,你面对一到复杂的数学题的时候是如何解决的?

逐步拆解,写下每一步的解题思路。

def stage2_structured_thinking():
    """
    改进:要求AI展示找房的思考步骤
    
    解决了什么:
    - 分析框架清晰可见
    - 考虑因素更全面
    
    仍然存在的问题:
    - 思考框架是对的,但填充的数据是错的
    - 就像用正确的数学公式,代入了错误的数字
    """
    print("\n" + "=" * 70)
    print("阶段二:逻辑拆解者 - '让我仔细想想...'")
    print("=" * 70)
    
    prompt = f"""{USER_QUESTION}

请按照以下步骤思考:

步骤1:分析用户需求的优先级
- 哪些是硬性要求(必须满足)?
- 哪些是软性偏好(最好满足)?

步骤2:确定搜索范围
- 根据通勤要求,圈定可能的地铁线路和站点
- 计算通勤时间是否合理

步骤3:筛选符合预算的区域
- 6000元预算在北京能租到什么区域的两居室?
- 列出2-3个候选区域

步骤4:评估配套设施
- 检查这些区域是否有超市和健身房

步骤5:给出推荐
- 列出具体小区名称
- 说明推荐理由

请展示完整的思考过程。"""
    
    response = client.messages.create(
        model="claude-sonnet-4-5-20250929",
        max_tokens=2048,
        messages=[{"role": "user", "content": prompt}]
    )
    
    answer = response.content[0].text
    
    print(f"\n【AI的思考过程】\n{answer}")
    
    print("\n" + "=" * 70)
    print("【改进点】")
    print("=" * 70)
    print("✓ 分析框架清晰:优先级→位置→价格→配套→推荐")
    print("✓ 考虑因素全面:通勤时间、换乘次数、步行距离都考虑到了")
    print("✓ 推理过程可追溯:能看到AI是怎么一步步得出结论的")
    
    print("\n【但新问题出现了】")
    print("=" * 70)
    print("""
用户反馈:

 用户:"你的分析框架很专业,但推荐的'回龙观融泽嘉园'我在链家找不到啊!"

 AI:"让我再确认一下..."

 用户:"还有你说的6000能租两居,我问了中介,现在回龙观两居最少7500!"

 AI:"可能价格有波动..."

【问题诊断】
→ 思考框架是对的(模型能力提升)
→ 但框架里填充的还是旧数据(知识库过时)
→ 就像用牛顿力学公式做对了,但代入的是火星的重力加速度
    """)
    
    print("\n【引出下一阶段】")
    print("需要一个机制:让AI能意识到'这个数据我不确定',然后自我检查。")
    
    return answer

在这一阶段,你的prompt已经明确告诉大模型分析思考的步骤,最终给出按照这个思维链

逻辑:问题->大模型->输出思考过程->答案

方法:仍然单次调用

问题:逻辑链是我们强制大模型在回答问题前先把问题进行步骤拆分,本质在于降低每一步的大模型思考难度,降低每一个单一问题的幻觉,最终组合出来的问题更加的稳定和可靠。但是我们忽略了一个问题,大模型虽然进行了更为精细的思考,但是他所有的思考都是基于大模型训练阶段的数据,所以,一旦你的问题是一个实时的问题,不管如何拆分步骤的思考,都是徒劳的。

批评与自我批评

请注意,在这一步会产生质变

继上面使用思考链之后,得到的结果可信度大大增加,但是够了吗?当然不够!

我们在做任何决定或者作品,公之于众之前,一定是在这个决定或者作品产生后,会不断在自己大脑中重复思考,不断的权衡自己的决定,回顾每个细节是否还有问题,对于一个合格的Agent一样道理,在上面生成出结果之后,我们仍然需要大模型进行自我批评和审查,确定自我质疑和自我修正。

def stage3_self_reflection():
    """
    改进:生成推荐后,进行自我审查
    
    核心机制:
    1. 第一次生成推荐
    2. 切换到"批判者"模式,审查推荐
    3. 基于审查结果,修正推荐
    
    解决了什么:
    - 能发现明显的逻辑错误
    - 会对不确定的信息进行标注
    
    仍然的问题:
    - 审查和修正仍基于训练数据
    - 无法验证小区是否真实存在
    """
    print("\n" + "=" * 70)
    print("阶段三:批评与自我批评者 - '等等,让我再检查一遍...'")
    print("=" * 70)
    
    # 步骤1:生成初始推荐(使用CoT)
    print("\n[步骤1] 生成初始推荐...")
    print("-" * 70)
    
    initial_prompt = f"""{USER_QUESTION}

请给出详细的找房推荐,包括:
1. 推荐的具体小区名称
2. 预估租金
3. 通勤路线和时间
4. 周边配套设施"""

    response1 = client.messages.create(
        model="claude-sonnet-4-5-20250929",
        max_tokens=1024,
        messages=[{"role": "user", "content": initial_prompt}]
    )
    
    initial_answer = response1.content[0].text
    print(f"初始推荐:\n{initial_answer[:400]}...\n")
    
    # 步骤2:自我审查
    print("[步骤2] 启动自我审查模式...")
    print("-" * 70)
    
    reflection_prompt = f"""我刚才给用户推荐了以下租房方案:

{initial_answer}

现在,请你作为一个严格的审查者,用批判性思维检查这个推荐:

检查清单:
1. 小区名称:这些小区是否真实存在?我是否100%确定?
2. 价格信息:租金数据是否可能过时?当前市场价是否会更高?
3. 通勤时间:我的计算是否考虑了换乘时间、步行时间、高峰期拥堵?
4. 配套设施:我是否确定这些设施就在小区附近?
5. 整体可信度:如果用户按这个推荐去找房,会遇到什么问题?

请诚实地指出问题,不要回避。"""

    response2 = client.messages.create(
        model="claude-sonnet-4-5-20250929",
        max_tokens=1024,
        messages=[{"role": "user", "content": reflection_prompt}]
    )
    
    reflection = response2.content[0].text
    print(f"审查报告:\n{reflection}\n")
    
    # 步骤3:基于反思修正
    print("[步骤3] 基于审查修正推荐...")
    print("-" * 70)
    
    improvement_prompt = f"""原始推荐:
{initial_answer}

审查发现的问题:
{reflection}

请基于审查结果,生成一个改进版本:
- 对不确定的信息明确标注
- 对可能过时的数据给出风险提示
- 提供用户自行验证的方法"""

    response3 = client.messages.create(
        model="claude-sonnet-4-5-20250929",
        max_tokens=1024,
        messages=[{"role": "user", "content": improvement_prompt}]
    )
    
    improved_answer = response3.content[0].text
    print(f"改进后的推荐:\n{improved_answer}")
    
    print("\n" + "=" * 70)
    print("【显著改进】")
    print("=" * 70)
    print("✓ 会主动标注:'以下信息基于历史数据,建议实地核实'")
    print("✓ 会发现明显错误:'我之前说的通勤30分钟可能过于乐观'")
    print("✓ 会给出验证方法:'建议在链家/贝壳查询实时房源'")
    
    print("\n【但核心问题依然存在】")
    print("=" * 70)
    print("""
对话实录:

 AI:"根据历史数据,回龙观两居室约6000-7000元(数据可能过时)"

 用户:"所以到底是6000还是7000?还是更多?"

 AI:"建议您在链家查询实时价格"

 用户:"那我要你干嘛???"

【问题本质】
→ AI已经意识到自己的信息可能过时
→ 但它只能不断提示"建议核实"
→ 就像一个很诚实的骗子:我可能在骗你,你自己查吧
    """)
    
    print("\n【引出下一阶段】")
    print("AI需要学会:在不确定时,先别急着回答,而是去'查资料'。")
    print("但它要按什么逻辑去查?要查哪些?这需要一个'作战计划'。")
    
    return improved_answer

在这一步事情发生了质变,变成了交互式行动

逻辑:问题->大模型->输出思考过程->观察结果->反馈大模型->输出更新答案

方法:交互式思考行动

问题:在思维链、工具链的基础上,我们让大模型和大模型进行了交互式行动,首次实现了大模型的内部循环,在这一步可以认为是标准意义上的Agent开始,但是目前存在的核心问题是数据仍旧是静态数据,所以下一步工具链使用

工具链

继续思考链、自我反思之后,我们遇到的问题是原始数据势必不能解决实时的问题,就像诸葛亮穿越到现在,他再聪明,你问他什么是“罗永浩西贝事件”,他也不可能知道。所以在Agent中如何解决这个问题,就是工具链。

这个很简单,每个不同的Agent需要的工具链不同,以我们找房的例子来看,基础的工具就是浏览器使用。

这部分相当于是大模型的能力扩展,给到大模型对应的接口和使用方法,让大模型通过你的一系列工具能够获得最新的或者你们内部的数据,然后继续执行上面的思维链。

def stage5_react_with_tools():
    """
    终极形态:Think -> Act -> Observe 循环
    
    核心突破:
    - AI不再困在训练数据里
    - 可以调用真实世界的工具获取最新信息
    - 根据真实反馈动态调整策略
    
    这才是从Chatbot到Agent的质变
    """
    print("\n" + "=" * 70)
    print("阶段四:完整的人 - '让我查一查最新情况'")
    print("=" * 70)
    
    # 定义AI可用的工具
    tools = [
        {
            "name": "search_subway_commute",
            "description": "查询从某地铁站到目标地点的真实通勤时间(考虑换乘、步行、高峰期)",
            "input_schema": {
                "type": "object",
                "properties": {
                    "from_station": {"type": "string", "description": "起始地铁站"},
                    "to_location": {"type": "string", "description": "目标位置"}
                },
                "required": ["from_station", "to_location"]
            }
        },
        {
            "name": "search_rental_prices",
            "description": "查询指定地铁站周边的最新租房价格(来自链家/贝壳等平台)",
            "input_schema": {
                "type": "object",
                "properties": {
                    "station": {"type": "string", "description": "地铁站名"},
                    "room_type": {"type": "string", "description": "户型,如'两居室'"},
                    "max_price": {"type": "number", "description": "最高预算"}
                },
                "required": ["station", "room_type"]
            }
        },
        {
            "name": "search_community_info",
            "description": "查询具体小区的详细信息(建筑年代、配套设施、真实照片等)",
            "input_schema": {
                "type": "object",
                "properties": {
                    "community_name": {"type": "string", "description": "小区名称"},
                    "station": {"type": "string", "description": "所属地铁站"}
                },
                "required": ["community_name", "station"]
            }
        },
        {
            "name": "search_nearby_facilities",
            "description": "查询小区周边的配套设施(超市、健身房、餐饮等)",
            "input_schema": {
                "type": "object",
                "properties": {
                    "community_name": {"type": "string", "description": "小区名称"},
                    "facility_types": {"type": "array", "items": {"type": "string"}, "description": "设施类型"}
                },
                "required": ["community_name", "facility_types"]
            }
        }
    ]
    
    # 模拟工具执行(实际应调用真实API)
    def execute_tool(tool_name: str, tool_input: dict) -> str:
        """模拟真实世界的工具返回"""
        if tool_name == "search_subway_commute":
            return f"""【高德地图实时数据 - {datetime.now().strftime('%Y-%m-%d %H:%M')}】
从 {tool_input['from_station']} 到 {tool_input['to_location']}:
- 工作日早高峰(8:00-9:00):预计52分钟
  路线:{tool_input['from_station']} → 换乘1次 → 步行800米
- 工作日平峰期(10:00-17:00):预计43分钟
- 周末:预计40分钟

注意:以上为门到门时间,包含步行和等待。"""
        
        elif tool_name == "search_rental_prices":
            return f"""【链家租房数据 - {datetime.now().strftime('%Y-%m-%d')}】
{tool_input['station']} 周边{tool_input['room_type']}租金情况:

在租房源(15套):
• 价格范围:7200-9500元/月
• 中位数:8100元/月
• 最便宜房源:7200元/月(龙泽苑西区,6楼,55㎡,2000年建)
• 性价比推荐:7800元/月(北郊农场社区,3楼,68㎡,2005年建,精装修)

预算{tool_input.get('max_price', '未指定')}元现状:
→ 当前市场价超出预算约20-30%
→ 建议:考虑降低其他条件(如远一站地铁)或合租"""
        
        elif tool_name == "search_community_info":
            return f"""【贝壳小区详情 - {tool_input['community_name']}】
基本信息:
• 建筑年代:2005年
• 建筑类型:板楼
• 物业费:1.2元/㎡/月
• 供暖方式:集中供暖
• 车位情况:地上车位,200元/月

户型特点:
• 两居室主力面积:60-75㎡
• 南北通透户型占比:65%
• 采光评价:★★★★☆ (4.2分,基于128条真实评价)

小区环境:
• 绿化率:35%
• 楼间距:舒适
• 居住人群:上班族为主
• 噪音水平:较安静

【真实租客评价精选】
"采光确实不错,南北通透户型夏天不开空调也凉快" - 2024年3月
"离地铁站步行需要12分钟,比想象中远一点" - 2024年5月"""
        
        elif tool_name == "search_nearby_facilities":
            types = tool_input.get('facility_types', [])
            return f"""【大众点评/高德地图 - {tool_input['community_name']}周边配套】

{'超市' if '超市' in types else ''}:
• 物美超市(200米,步行3分钟)★★★★☆
• 7-11便利店(小区内)24小时营业
• 永辉超市(600米,步行8分钟)

{'健身房' if '健身房' in types else ''}:
• 乐刻运动(400米)月卡199元,24小时营业 ★★★★☆
• 中体倍力(800米)年卡2800元,设施较新 ★★★★★

餐饮:
• 小区周边餐厅:23家
• 外卖配送范围:优秀(美团/饿了么平均15分钟送达)

【综合生活便利度评分】★★★★☆ (4.3/5.0)"""
        
        return f"工具 {tool_name} 执行完成"
    
    # ReAct 循环
    print("\n【ReAct循环开始】")
    print("=" * 70)
    
    conversation_history = []
    max_iterations = 6
    
    initial_prompt = f"""{USER_QUESTION}

你现在有工具可以调用,可以查询真实的最新信息。

请按照 Think → Act → Observe 循环工作:
1. Think:思考现在需要什么信息
2. Act:调用工具获取真实数据
3. Observe:分析工具返回的结果
4. 重复循环,直到有足够信息给出可靠推荐

开始吧!"""
    
    conversation_history.append({"role": "user", "content": initial_prompt})
    
    for iteration in range(max_iterations):
        print(f"\n{'▼' * 35}")
        print(f"  循环第 {iteration + 1} 轮")
        print(f"{'▼' * 35}")
        
        # AI的思考和行动
        response = client.messages.create(
            model="claude-sonnet-4-5-20250929",
            max_tokens=1024,
            tools=tools,
            messages=conversation_history
        )
        
        # 检查是否需要调用工具
        if response.stop_reason == "tool_use":
            # 提取思考内容和工具调用
            text_blocks = [block.text for block in response.content if hasattr(block, "text")]
            tool_uses = [block for block in response.content if block.type == "tool_use"]
            
            # 显示AI的思考过程
            if text_blocks:
                print(f"\n [Think] AI的思考:")
                print(f"   {text_blocks[0][:300]}...")
            
            # 将AI的响应加入历史
            conversation_history.append({
                "role": "assistant",
                "content": response.content
            })
            
            # 执行所有工具调用
            tool_results = []
            for tool_use in tool_uses:
                print(f"\n [Act] 调用工具: {tool_use.name}")
                print(f"   参数: {json.dumps(tool_use.input, ensure_ascii=False, indent=2)}")
                
                # 执行工具
                result = execute_tool(tool_use.name, tool_use.input)
                
                print(f"\n️ [Observe] 工具返回:")
                print(f"   {result[:400]}...")
                
                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": tool_use.id,
                    "content": result
                })
            
            # 将工具结果加入历史
            conversation_history.append({
                "role": "user",
                "content": tool_results
            })
            
        else:
            # 没有更多工具调用,得到最终答案
            final_answer = response.content[0].text
            
            print(f"\n{'=' * 70}")
            print("✅ [最终推荐]")
            print(f"{'=' * 70}")
            print(final_answer)
            
            print("\n" + "=" * 70)
            print("【ReAct循环完成 - 质的飞跃】")
            print("=" * 70)
            print(f"""
本次找房共执行了 {iteration + 1} 轮 Think-Act-Observe 循环

对比前4个阶段的根本突破:

阶段1-4的问题:
❌ "回龙观6000元能租两居" - 这是2022年的价格
❌ "龙泽园小区采光好" - 这个小区名是AI编的
❌ "通勤30分钟" - 凭感觉估算的
❌ "附近有健身房" - 瞎猜的

阶段5的改变:
✅ "当前市场7200-9500元" - 来自链家实时数据
✅ "北郊农场社区" - 真实存在,有详细信息
✅ "早高峰52分钟" - 高德地图实测
✅ "乐刻运动400米" - 大众点评验证

【核心区别】
前4阶段:在"回忆"训练数据
第5阶段:在"查询"真实世界

【用户反馈对比】

阶段1用户: "你推荐的小区根本不存在!"
阶段2用户: "思路是对的,但信息全是假的"
阶段3用户: "知道自己不确定了,但还是没用"
阶段4用户: "计划完美,执行全错"
阶段5用户: "慢是慢了点,但每个数据都能验证,靠谱!"

【商业价值】
- 演示通过率:60% → 95%
- 用户投诉率:下降80%
- 付费转化率:提升3倍
- 客单价:提升40%(用户愿意为准确性付费)
            """)
            
            return final_answer
    
    # 达到最大迭代次数
    print("\n⚠️ 达到最大迭代次数,可能需要调整策略")
    return "任务未完成"

结语

其实,你说Agent多复杂,如果你能从头看到尾,就知道Agent的逻辑极其清晰,他并没有什么黑科技,你完全可以按照一个人如何能得出优秀答案的思路来设计你的Agent,实时信息的获取、不断的反思,当然,除了上面单一模型的逻辑外,你还可以不同模型件的互相审核、批评,就像生活中的一个人融入一个团队,而不是个体。但不管如何,你总是能轻易理解我的意思,也就证明Agent其实没啥黑科技。

但是,一个好的Agent简单吗?极其困难!

道理也很简单,你在做Agent,其实你在企图驯化出一个完美的人!

posted @ 2025-10-28 19:20  智慧园区-老朱  阅读(12)  评论(0)    收藏  举报