AI Agent 核心知识体系——内容太多了,先发个草稿

一、入门:Agent 基础认知与核心概念

1.1 什么是 AI Agent

  • 核心定义:AI Agent是具备“感知-决策-执行-学习”闭环能力的智能实体,其本质是由大语言模型(LLM)作为“认知核心”,联动感知模块、决策引擎、记忆系统与工具接口的“智能行动体”。与传统AI“被动响应指令”不同,它能主动理解模糊目标(如“帮我优化电商店铺运营”)、实时感知环境变化(如库存波动)、规划分步行动,并通过用户反馈或任务结果持续迭代策略,最终将抽象需求转化为具体成果。
  • 关键特征:四大特征构成Agent的智能基石——①驻留性:可长期运行于服务器或终端,如工业监控Agent 7×24小时监测设备温度;②反应性:毫秒级响应外部触发,如用户发送“查快递”后立即解析订单号;③主动性:预判需求并触发行动,如会议助手提前30分钟推送会议室链接;④社会性:多Agent通过标准化协议协作,如供应链系统中“采购Agent”与“物流Agent”共享库存数据。
  • 与传统程序的核心差异:传统程序依赖开发者预设的“if-else”逻辑分支,面对未编码场景(如“帮老人选易用的智能手机”)会直接失效;而Agent通过LLM的语义理解能力拆解需求,结合记忆模块存储的用户偏好(如老人视力不佳),调用电商API筛选“大字体、长续航”机型,整个过程无需硬编码所有可能性,实现“场景自适应”。
  • 学习核心锚点:牢牢抓住“自主闭环”逻辑——感知模块是“五官”(获取文本、图像等信息),决策模块是“大脑”(分析信息并生成指令),执行模块是“手脚”(调用工具完成操作),记忆模块是“记事本”(存储上下文与知识)。公式“Agent = 感知 + 决策 + 执行 + 记忆”是所有开发实践的底层框架,需贯穿学习全程。

1.2 Agent 核心分类与适用场景

Agent类型

核心逻辑与技术依赖

适用场景与行业

典型案例与落地价值

简单反射Agent

基于“关键词-行动”预设规则,无记忆能力,依赖正则表达式或简单NLP工具,开发成本极低(单人1-2天可实现),响应速度≤100ms,但仅支持固定场景。

高频重复、需求标准化的交互场景,如客服自动回复、APP操作引导、设备状态提醒。

电商平台“退款政策”自动回复(用户提“退款”即推送7天无理由规则)、快递签收短信触发(物流状态变更时发送固定模板),可降低企业80%的基础咨询成本。

基于目标的Agent

接收明确目标后,通过LLM或规则引擎拆解为子任务序列,具备短期记忆(存储任务进度),需集成1-3种工具API,核心是“流程化执行”。

单目标、步骤清晰的个人或办公任务,如日程管理、会议纪要、行程预订、数据报表生成。

微软Outlook智能助手(目标“安排周五会议”→子任务:查参会人日程→订会议室→发邀请)、飞猪AI规划师(目标“上海3天亲子游”→子任务:订亲子酒店→选乐园门票→做行程表),提升任务完成效率40%以上。

学习型Agent

融合监督学习(用户反馈标注)、强化学习(任务得分优化),通过历史数据训练偏好模型,依赖LLM+向量数据库,具备“越用越智能”的特性。

个性化需求强、需持续优化的场景,如电商推荐、内容创作、智能教育、健康管理。

淘宝“猜你喜欢”(根据浏览/购买记录优化推荐,点击转化率提升35%)、Grammarly写作助手(根据用户修改习惯区分“学术/邮件”场景的语法建议)、Keep健身Agent(根据运动数据调整训练计划)。

多Agent系统

由2个以上专业化子Agent组成,通过gRPC/JSON-RPC实现通信,有“集中式调度”(如MetaGPT的产品经理角色)或“分布式协同”两种模式,依赖框架(AutoGen/LangGraph)实现任务分配。

企业级复杂业务,如软件开发、供应链管理、金融风控、电商全链路运营。

MetaGPT开发团队(产品经理Agent写PRD→架构师Agent画流程图→开发Agent写代码→测试Agent找Bug,软件开发周期缩短50%)、京东供应链系统(采购Agent预测销量→仓储Agent调库存→物流Agent规划路线,缺货率下降22%)。

1.3 入门必备技术基础

  • 编程语言:Python核心能力清单:AI Agent开发的“通用语言”,需重点掌握三类技能——①基础语法:字典(存储工具参数)、循环(处理多轮对话)、函数(封装工具调用),尤其要熟练用try-except捕获API调用异常;②面向对象:用类封装Agent模块(如定义`WeatherAgent`类,包含`perceive`/`decide`/`execute`方法),提升代码复用性;③生态库:requests(工具API调用)、json(解析响应数据)、datetime(处理行程日期)、pandas(简单数据统计),入门阶段无需深入机器学习库。推荐通过“天气查询Agent”实战掌握:3天内完成从用户输入解析到API调用的全流程。
  • AI基础:LLM核心应用逻辑:无需啃透Transformer原理,重点掌握“LLM作为认知引擎”的使用方法——①API调用:熟悉OpenAI/Claude的`ChatCompletion`接口,理解`system`(身份定义)、`user`(用户需求)、`assistant`(历史回复)的角色分工;②Prompt工程三要素:明确身份(“你是专业电商客服,语气亲切”)、约束边界(“仅基于订单号12345回答”)、指定格式(“回复分‘问题分析’‘解决方案’两部分”);③成本控制:简单任务用GPT-3.5-turbo(0.5美元/百万Token),复杂推理用GPT-4(10美元/百万Token),非核心模块可替换为开源模型(如Llama 3-8B,本地部署零成本)。
  • 工具基础:API调用与数据存储:Agent的能力边界由工具决定,需掌握“API调用全流程”——①请求构造:用requests构造GET(查天气)/POST(提交表单)请求,设置请求头(API密钥、Content-Type);②响应解析:从JSON结果中提取关键字段(如天气API的“temperature”),用`json.loads()`处理;③异常处理:捕获网络超时(设置`timeout=10`)、权限错误(401状态码)、数据缺失(字段为空);④数据存储:用JSON文件存用户偏好(小量数据)、MySQL存运行日志(企业级)、Redis存短期会话(高并发场景),入门阶段先掌握JSON与MySQL基础操作。
  • 入门实战:天气查询Agent开发全流程:最经典的入门项目,覆盖四大模块——①感知:接收用户输入“查上海明天天气”,用正则提取“上海”“明天”;②决策:判断需调用高德天气API,转换“明天”为具体日期(如2025-11-22);③执行:调用API(传入城市编码110000、日期、密钥),解析返回的天气/温度;④记忆:用JSON文件存储用户查询历史(便于后续统计偏好)。核心代码需加入异常处理:用户输“火星”时提示“暂不支持”,API超时则返回“网络繁忙”,完成后可部署到Flask实现Web交互。

二、进阶:Agent 核心技术与开发实践

2.1 核心功能模块技术实现

2.1.1 感知模块:环境信息获取

  • 文本感知:结构化信息提取:LLM原生支持文本理解,但直接输入易导致参数遗漏,需用“Prompt模板+格式约束”提升精度。LangChain的`PromptTemplate`是核心工具,可定义固定格式提取“槽位信息”(如时间、地点、金额),结合Few-Shot示例(给1-2个提取案例)能将准确率从70%提升至95%。实际开发中,需处理模糊表述(如“下周三”转换为具体日期),并加入参数校验(如手机号格式验证)。
    from langchain.prompts import PromptTemplate
    from langchain.chat_models import ChatOpenAI
    import datetime
    from dateutil.relativedelta import relativedelta

    # 1. 定义模板(含Few-Shot示例,提升提取精度)
    template = """
    从用户问题中提取【城市】和【日期】,日期需转换为YYYY-MM-DD格式,输出严格为JSON,无额外内容。
    示例1:用户问"北京下周一天气",输出{"city":"北京","date":"2025-11-25"}
    示例2:用户问"上海明天的温度",输出{"city":"上海","date":"2025-11-22"}
    用户问题:{user_query}
    """
    prompt = PromptTemplate(template=template, input_variables=["user_query"])

    # 2. 处理模糊时间(如"下周三")
    def parse_fuzzy_date(date_str, today):
        if "明天" in date_str:
            return (today + relativedelta(days=1)).strftime("%Y-%m-%d")
        elif "下周三" in date_str:
            days_to_wed = (2 - today.weekday()) % 7 + 7  # 计算距离下周三的天数
            return (today + relativedelta(days=days_to_wed)).strftime("%Y-%m-%d")
        return date_str

    # 3. 执行提取
    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
    user_query = "帮我查一下广州下周三的天气"
    today = datetime.datetime.now()
    structured_prompt = prompt.format(user_query=user_query)
    result = llm.predict(structured_prompt)
    info = eval(result)  # 转换为字典,实际用json.loads更安全
    print("提取结果:", info)  # 输出:{"city":"广州","date":"2025-11-26"}
  • 多模态感知:跨模态信息融合:突破纯文本限制,实现“语音-文本-图像”的联动处理,核心技术组合为“Whisper(语音转文本)+ CLIP(图像特征提取)+ GPT-4V(多模态理解)”。适用于智能导购(用户拍商品图问价格)、家庭机器人(听指令识别物体)等场景。开发时需注意:语音文件建议用16kHz采样率(Whisper最优输入),图像转Base64传输(API交互标准),并加入模态优先级判断(如“语音指令与图像内容冲突时,以语音为准”)。
    import openai
    import base64
    from PIL import Image
    from io import BytesIO

    # 1. 辅助函数:图像转Base64(API传输标准格式)
    def img_to_base64(img_path):
        with Image.open(img_path) as img:
            buffer = BytesIO()
            img.save(buffer, format="JPEG")
            return base64.b64encode(buffer.getvalue()).decode()

    # 2. 语音感知:Whisper转文本
    audio_file = open("user_voice.wav", "rb")  # 内容:"这张图里的手机多少钱?"
    transcript = openai.Audio.transcribe(
        model="whisper-1",
        file=audio_file,
        response_format="json"
    )
    user_text = transcript["text"]  # 提取语音转写结果

    # 3. 图像感知:GPT-4V理解内容并关联需求
    img_base64 = img_to_base64("phone.jpg")  # 手机图片
    response = openai.ChatCompletion.create(
        model="gpt-4-vision-preview",
        messages=[
            {"role": "user", "content": [
                {"type": "text", "text": user_text},
                {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img_base64}"}}
            ]}
        ],
        max_tokens=300
    )

    # 4. 多模态结果整合(可进一步调用电商API查价格)
    print("感知结果:", response.choices[0].message.content)
    # 输出示例:"图中手机为iPhone 15,目前电商均价5999元,是否需要为你查询具体店铺报价?"
  • 系统感知:运行环境监控:Agent需实时感知自身运行状态,避免因资源不足或服务异常中断任务,核心监控维度包括“本地硬件”和“远程服务”。本地用psutil库(跨平台)监控CPU/内存/磁盘,阈值建议:CPU>85%、内存>90%、磁盘>95%时触发降载;远程用云服务商API(如阿里云ECS、AWS EC2)监控服务器状态,服务异常时需自动告警(邮件/企业微信)。实际部署时,可将监控数据接入Prometheus+Grafana实现可视化。
    import psutil
    import requests
    import json
    from datetime import datetime

    # 1. 本地硬件感知(CPU、内存、磁盘)
    def monitor_local():
        cpu_usage = psutil.cpu_percent(interval=1)  # 1秒采样
        mem_usage = psutil.virtual_memory().percent
        disk_usage = psutil.disk_usage("/").percent
        status = "normal"
        if cpu_usage > 85 or mem_usage > 90 or disk_usage > 95:
            status = "warning"
            # 触发降载:暂停非核心任务(如日志统计)
            pause_non_core_tasks()
        return {"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                "cpu": cpu_usage, "mem": mem_usage, "disk": disk_usage, "status": status}

    # 2. 远程服务感知(阿里云ECS示例)
    def monitor_ecs(access_key, secret, region, instance_id):
        url = "https://ecs.aliyuncs.com/"
        params = {
            "Action": "DescribeInstanceStatus",
            "RegionId": region,
            "InstanceId.1": instance_id,
            "AccessKeyId": access_key,
            "Format": "JSON",
            "Version": "2014-05-26"
        }
        response = requests.get(url, params=params)
        data = response.json()
        status = data["InstancesStatus"]["InstanceStatus"][0]["Status"]
        if status != "Running":
            # 发送企业微信告警
            send_wechat_alert(f"ECS异常:{status}", instance_id)
        return {"instance_id": instance_id, "status": status}

    # 3. 示例调用(整合监控结果)
    local_status = monitor_local()
    ecs_status = monitor_ecs("你的AK", "你的SK", "cn-beijing", "i-abc123")
    print("系统状态:", local_status, ecs_status)

2.1.2 决策模块:核心大脑

  • 规则式决策:简单场景的高效方案:适用于逻辑明确、边界清晰的业务(如客服问题分类、订单状态处理),核心是“条件组合-行动映射”,可通过决策树算法(scikit-learn)管理复杂规则,相比if-else更易维护。优势是可解释性100%(每步决策都能追溯规则)、无LLM调用成本,劣势是无法处理未定义规则的场景。实际开发中,规则可存储在JSON配置文件中,支持动态更新(无需重启Agent)。
    from sklearn.tree import DecisionTreeClassifier, export_text
    import json

    # 1. 从配置文件加载规则(支持动态更新)
    with open("decision_rules.json", "r") as f:
        rule_data = json.load(f)
    X = rule_data["features"]  # 特征:[问题类型, 用户等级, 订单金额等级]
    y = rule_data["actions"]   # 行动:0=自动回复,1=优先处理,2=转接人工

    # 2. 训练决策树(可视化规则,便于运维)
    dt = DecisionTreeClassifier(max_depth=3)  # 限制深度避免过拟合
    dt.fit(X, y)
    print("决策规则:\n", export_text(dt, feature_names=["问题类型", "用户等级", "订单金额"]))

    # 3. 决策执行(实时场景:VIP用户+高金额退款)
    def make_decision(features):
        action_code = dt.predict([features])[0]
        action_map = {0: "auto_reply()", 1: "priority_handle()", 2: "transfer_human()"}
        return action_map[action_code]

    # 示例:退款问题(1)+ VIP用户(1)+ 高金额(1)→ 优先处理
    action = make_decision([1, 1, 1])
    print("决策结果:", action)  # 输出:priority_handle()

    # 决策规则配置文件示例(decision_rules.json)
    {
      "features": [[0,0,0],[0,1,0],[1,0,1],[1,1,1],[2,0,0]],
      "actions": [0,1,1,1,0]
    }
  • LLM驱动决策:复杂场景的核心方案:适用于模糊需求(如“帮我优化职场简历”)或多工具协同场景,利用LLM的逻辑推理能力生成“行动序列”。关键设计技巧有三:①明确工具清单(含名称、参数、用途),避免LLM生成无效行动;②强制结构化输出(JSON格式),便于代码解析;③加入决策约束(如“必须先查订单状态,再决定是否加急”)。开发时需处理格式错误(LLM偶尔输出非JSON),通过重试提示修正(如“请严格按JSON输出,无额外文本”)。
    import openai
    import json

    # 1. 定义可用工具与约束规则
    tool_def = """
    可用工具:
    1. query_resume( params: resume_text (必填) ):分析简历问题,返回优化方向
    2. generate_resume( params: job_desc (必填), personal_info (必填) ):生成定制化简历
    3. check_grammar( params: text (必填) ):校验语法与措辞,返回修改建议

    决策规则:
    1. 先调用query_resume分析用户现有简历,再生成优化方案;
    2. 仅使用上述工具,不新增其他行动;
    3. 输出严格为JSON,含"action"和"params"字段,无额外内容。
    """

    # 2. 用户模糊需求与Prompt构造
    user_question = "我有一份销售简历,想应聘互联网大厂,帮我优化得更突出业绩"
    prompt = f"你的身份:职场简历优化Agent\n{tool_def}\n用户需求:{user_question}"

    # 3. LLM生成决策(降低temperature确保稳定性)
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.1
    )

    # 4. 解析决策(加入异常处理)
    try:
        decision = json.loads(response.choices[0].message.content)
        print("决策结果:", decision)
        # 执行工具(后续代码根据action调用对应函数)
        if decision["action"] == "query_resume":
            resume_analysis = query_resume(decision["params"]["resume_text"])
    except json.JSONDecodeError:
        # 格式错误重试
        retry_prompt = "输出格式错误,请重新输出,仅含JSON,无任何额外文本"
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[{"role": "user", "content": retry_prompt}]
        )
        decision = json.loads(response.choices[0].message.content)
  • 强化学习决策:动态环境的优化方案:适用于需长期优化目标的场景(如游戏AI、资源调度、智能推荐),Agent通过与环境交互获得“奖励”或“惩罚”,持续调整策略。PPO(近端策略优化)是目前最成熟的算法,平衡训练稳定性与收敛速度,依赖Stable Baselines3库实现。核心是设计合理的奖励函数——如电商推荐Agent的奖励:用户点击得1分、购买得3分、跳过得-0.5分;资源调度Agent的奖励:任务完成时间缩短1秒得1分、服务器超载扣5分。
    import gym
    from stable_baselines3 import PPO
    import matplotlib.pyplot as plt

    # 1. 定义自定义环境(以“电商推荐优化”为例,简化版)
    class RecommendEnv(gym.Env):
        def __init__(self):
            super().__init__()
            self.action_space = gym.spaces.Discrete(5)  # 5类商品推荐选项
            self.observation_space = gym.spaces.Box(low=0, high=1, shape=(3,))  # 特征:用户活跃度、历史购买、浏览时长
            self.state = [0.5, 0.3, 0.7]  # 初始状态

        def step(self, action):
            # 模拟环境反馈:action=2(推荐数码产品)时奖励最高
            reward = 3 if action == 2 else (1 if action in [1,3] else -0.5)
            done = False  # 持续交互,不终止
            info = {}
            return self.state, reward, done, info

        def reset(self):
            return self.state

    # 2. 初始化环境与PPO模型
    env = RecommendEnv()
    model = PPO(
        policy="MlpPolicy",
        env=env,
        learning_rate=3e-4,
        n_steps=2048,
        batch_size=64,
        verbose=1
    )

    # 3. 训练Agent(记录奖励变化)
    total_timesteps = 10000
    rewards = []
    obs = env.reset()
    for _ in range(total_timesteps):
        action, _states = model.predict(obs, deterministic=False)
        obs, reward, done, info = env.step(action)
        rewards.append(reward)
        if done:
            obs = env.reset()

    # 4. 可视化训练效果(奖励提升说明策略优化)
    plt.plot(rewards[:1000])  # 取前1000步可视化
    plt.title("推荐Agent奖励曲线")
    plt.xlabel("Step")
    plt.ylabel("Reward")
    plt.show()

    # 5. 实际推荐决策
    obs = [0.8, 0.6, 0.9]  # 新用户状态:高活跃度、有购买、长浏览
    action = model.predict(obs)[0]
    print(f"推荐决策:推荐第{action+1}类商品")

2.1.3 记忆模块:状态与知识存储

  • 短期记忆:会话级上下文管理:用于存储当前对话的上下文信息(如用户姓名、历史提问),确保多轮交互连贯,核心解决“Agent失忆”问题(如用户先问“我叫张三”,后续问“我的订单”时能关联张三的信息)。LangChain提供三类核心实现:①ConversationBufferMemory(完整存储对话,适合短会话);②ConversationBufferWindowMemory(保留最近k轮,控制Token消耗);③ConversationSummaryMemory(生成对话摘要,压缩冗余内容)。开发时需根据对话长度选择:短对话(<5轮)用Buffer,长对话(>10轮)用Summary或Window。
    from langchain.memory import (
        ConversationBufferMemory,
        ConversationBufferWindowMemory,
        ConversationSummaryMemory
    )
    from langchain.chains import ConversationChain
    from langchain.chat_models import ChatOpenAI

    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)

    # 1. 基础短期记忆:完整存储(适合短对话)
    buffer_mem = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
    buffer_chain = ConversationChain(memory=buffer_mem, llm=llm)

    # 多轮对话测试
    buffer_chain.run("我叫张三,是一名Python开发工程师")
    buffer_chain.run("我想开发一个能查天气的AI Agent,用LangChain框架")
    # 加载记忆,验证连贯性
    history = buffer_mem.load_memory_variables({})["chat_history"]
    print("完整对话记忆:", [msg.content for msg in history])

    # 2. 窗口记忆:保留最近2轮(控制Token成本)
    window_mem = ConversationBufferWindowMemory(memory_key="chat_history", k=2)
    window_chain = ConversationChain(memory=window_mem, llm=llm)
    window_chain.run("我叫张三,是Python开发")
    window_chain.run("我要用LangChain开发天气Agent")
    window_chain.run("这个Agent需要调用高德API吗?")
    # 仅保留后2轮对话
    print("窗口记忆内容:", window_mem.load_memory_variables({})["chat_history"])

    # 3. 摘要记忆:压缩对话(适合长会话)
    summary_mem = ConversationSummaryMemory(memory_key="chat_history", llm=llm)
    summary_chain = ConversationChain(memory=summary_mem, llm=llm)
    summary_chain.run("我叫张三,Python开发,3年经验")
    summary_chain.run("想做天气Agent,需要查天气、推荐景点功能")
    summary_chain.run("用LangChain+OpenAI API,部署到Flask")
    # 记忆为对话摘要,大幅减少Token
    print("对话摘要记忆:", summary_mem.load_memory_variables({})["chat_history"])
  • 长期记忆:用户级知识存储:用于存储用户偏好、领域知识库、历史任务记录等持久化信息,核心解决“跨会话记忆”问题(如用户上月说“喜欢经济型酒店”,本月问“北京酒店推荐”时能关联该偏好)。核心技术是“语义检索”——将文本转化为高维向量(嵌入向量),存储到向量数据库,查询时通过向量相似度匹配相关信息,相比关键词匹配更懂“语义”(如“游玩”和“出游”视为相似)。常用技术组合:①嵌入模型:OpenAI text-embedding-3-small(768维,平衡效果与成本)、开源all-MiniLM-L6-v2(本地部署);②向量数据库:Pinecone(云服务,支持大规模)、FAISS(Facebook开源,本地小规模)、Milvus(开源分布式)。
    import pinecone
    import openai
    import time

    # 1. 初始化嵌入模型与向量数据库(Pinecone)
    openai.api_key = "你的OpenAI密钥"
    pinecone.init(
        api_key="你的Pinecone密钥",
        environment="us-west1-gcp"  # 与创建的索引地域一致
    )
    index_name = "user-preference"
    # 若索引不存在则创建(维度需与嵌入模型匹配,text-embedding-3-small为768维)
    if index_name not in pinecone.list_indexes():
        pinecone.create_index(index_name, dimension=768)
    index = pinecone.Index(index_name)
    time.sleep(1)  # 等待索引就绪

    # 2. 定义向量化与存储函数
    def embed_text(text):
        """文本转嵌入向量"""
        response = openai.Embedding.create(
            input=text,
            model="text-embedding-3-small"
        )
        return response["data"][0]["embedding"]

    def save_preference(user_id, content):
        """存储用户偏好到向量库"""
        embedding = embed_text(content)
        # 向量ID格式:user_用户ID_时间戳,便于后续更新
        vec_id = f"user_{user_id}_{int(time.time())}"
        index.upsert(
            vectors=[(vec_id, embedding, {"user_id": user_id, "content": content})],
            namespace="preferences"  # 命名空间区分数据类型
        )
        print(f"用户{user_id}偏好已存储,ID:{vec_id}")

    # 3. 存储示例用户偏好
    save_preference(
        user_id="zhangsan123",
        content="张三:喜欢经济型酒店(价格<300元/晚),偏好靠近地铁,避开人流密集区域,出差常用"
    )

    # 4. 检索函数:匹配用户偏好
    def get_preference(user_id, query):
        """根据查询匹配用户偏好"""
        query_emb = embed_text(query)
        results = index.query(
            vector=query_emb,
            top_k=1,  # 返回最相似的1条
            namespace="preferences",
            filter={"user_id": user_id},  # 仅检索该用户数据
            score_threshold=0.7  # 相似度低于0.7视为无匹配
        )
        if results["matches"]:
            return results["matches"][0]["metadata"]["content"]
        return "未找到相关偏好"

    # 5. 实战:结合偏好生成推荐
    user_query = "帮我推荐北京朝阳区的酒店,我要出差用"
    preference = get_preference(user_id="zhangsan123", query=user_query)
    # 调用LLM生成个性化推荐
    prompt = f"根据用户偏好:{preference},推荐北京朝阳区符合要求的酒店,分点说明理由"
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}]
    )
    print("个性化推荐:", response.choices[0].message.content)

2.1.4 执行模块:工具与行动调用

  • 工具调用协议:标准化交互核心:规范Agent与工具的通信逻辑,确保决策指令能被工具准确执行,核心解决“语义歧义”问题。目前主流协议有两种:①OpenAI Function Call:原生适配GPT系列模型,通过在API请求中定义`functions`参数,让LLM判断是否调用工具及传递参数,工具返回后LLM可继续分析生成最终结果,形成“调用-反馈-决策”闭环;②Anthropic MCP(Multimodal Control Protocol):在Function Call基础上扩展多模态工具支持和动态工具发现能力,Agent可自动识别环境中可用工具(如本地PDF阅读器、远程API),无需硬编码工具列表。两种协议均要求“结构化参数定义”和“明确输出格式”,是企业级Agent的必备规范。
    import openai
    import json
    import requests

    # 1. 定义工具函数(高德天气查询)
    def get_weather(city: str, date: str) -> str:
        """天气查询工具实现,含异常处理"""
        city_code = {"北京": "110000", "广州": "440100", "上海": "310000"}
        if city not in city_code:
            return f"暂不支持{city}的天气查询"
        url = "https://restapi.amap.com/v3/weather/weatherInfo"
        params = {
            "city": city_code[city],
            "date": date,
            "key": "你的高德API密钥"
        }
        try:
            response = requests.get(url, params=params, timeout=10)
            response.raise_for_status()
            data = response.json()
            if data["status"] == "1" and "forecasts" in data:
                cast = data["forecasts"][0]["casts"][0]
                return f"{city}{date}:{cast['dayweather']},气温{cast['daytemp']}-{cast['nighttemp']}℃"
            return f"查询失败:{data.get('info', '未知错误')}"
        except Exception as e:
            return f"工具调用异常:{str(e)}"

    # 2. 定义Function Call格式(OpenAI协议)
    functions = [
        {
            "name": "get_weather",
            "description": "查询指定城市和日期的天气信息,日期格式必须为YYYY-MM-DD",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "中国地级市名称,如北京、广州"},
                    "date": {"type": "string", "description": "查询日期,格式YYYY-MM-DD,如2025-12-01"}
                },
                "required": ["city", "date"]  # 明确必填参数
            }
        }
    ]

    # 3. 第一步:LLM生成工具调用决策
    user_query = "我12月5日要去广州出差,帮我查下当天的天气,需要带外套吗?"
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": user_query}],
        functions=functions,
        function_call="auto"  # 让LLM自动判断是否调用工具
    )
    response_msg = response.choices[0].message

    # 4. 第二步:解析决策并调用工具
    if response_msg.get("function_call"):
        func_name = response_msg["function_call"]["name"]
        func_args = json.loads(response_msg["function_call"]["arguments"])
        
        # 执行工具调用
        weather_result = get_weather(**func_args)
        
        # 第三步:将工具结果返回LLM,生成最终回答
        final_response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "user", "content": user_query},
                response_msg,
                {"role": "function", "name": func_name, "content": weather_result}
            ]
        )
        print("Agent最终回答:", final_response.choices[0].message.content)
    else:
        print("Agent最终回答:", response_msg.content)
  • API工具集成:扩展Agent能力边界:最核心的工具类型,涵盖天气、物流、电商、支付等几乎所有在线服务,集成关键在于“参数标准化”“异常全面处理”和“安全管控”。参数标准化:通过城市编码映射(如“北京”→“110000”)解决用户输入与API参数不一致问题;异常处理:覆盖网络超时、HTTP错误(401权限/500服务异常)、API返回错误(状态码非1);安全管控:API密钥存储在环境变量(而非硬编码),用`os.getenv()`获取,避免泄露。示例以高德天气API为例,可扩展至物流(顺丰API)、电商(淘宝开放平台)等场景。
    import requests
    import os
    from datetime import datetime

    # 安全实践:从环境变量获取API密钥
    AMAP_KEY = os.getenv("AMAP_WEATHER_KEY")

    def get_weather(city, date):
        """生产级天气API调用实现,含完整异常处理"""
        # 1. 城市编码映射(可扩展至全国城市,或调用高德城市查询API动态获取)
        city_code = {
            "北京": "110000", "上海": "310000", "广州": "440100",
            "深圳": "440300", "杭州": "330100"
        }
        # 动态获取未收录城市编码(备选方案)
        if city not in city_code:
            city_code_dynamic = get_city_code(city)
            if not city_code_dynamic:
                return f"暂不支持{city}的天气查询,建议输入省会城市"
            city_code[city] = city_code_dynamic
        
        # 2. 日期格式校验(避免无效请求)
        try:
            datetime.strptime(date, "%Y-%m-%d")
        except ValueError:
            return f"日期格式错误,请输入YYYY-MM-DD(如2025-12-01)"
        
        # 3. 构造API请求(加入请求头防反爬)
        url = "https://restapi.amap.com/v3/weather/weatherInfo"
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
        params = {
            "city": city_code[city],
            "date": date,
            "key": AMAP_KEY,
            "extensions": "all"  # 获取详细天气信息(风向、风力等)
        }
        
        # 4. 发送请求(加入重试机制)
        session = requests.Session()
        adapter = requests.adapters.HTTPAdapter(max_retries=2)  # 重试2次
        session.mount("https://", adapter)
        try:
            response = session.get(url, params=params, headers=headers, timeout=10)
            response.raise_for_status()  # 触发4xx/5xx错误
            data = response.json()
            
            # 5. 解析API结果
            if data["status"] != "1":
                return f"查询失败:{data.get('info', 'API返回异常')}"
            forecast = data["forecasts"][0]
            cast = next((c for c in forecast["casts"] if c["date"] == date), None)
            if not cast:
                return f"未查询到{city}{date}的天气数据"
            
            # 6. 整理为用户友好的结果
            return (
                f"{city} {date} 天气详情:\n"
                f"- 日间:{cast['dayweather']},{cast['daywind']}{cast['daypower']}级,{cast['daytemp']}℃\n"
                f"- 夜间:{cast['nightweather']},{cast['nightwind']}{cast['nightpower']}级,{cast['nighttemp']}℃\n"
                f"- 出行建议:{forecast['advice']}"
            )
        
        except requests.exceptions.Timeout:
            return "请求超时,请检查网络或稍后重试"
        except requests.exceptions.HTTPError as e:
            return f"服务异常(状态码:{e.response.status_code}),请联系管理员"
        except Exception as e:
            # 生产级:记录错误日志(便于排查)
            with open("weather_api_error.log", "a", encoding="utf-8") as f:
                f.write(f"{datetime.now()} | 错误:{str(e)} | 参数:{city},{date}\n")
            return "查询过程中出现异常,请稍后再试"

    # 辅助函数:动态获取城市编码
    def get_city_code(city_name):
        url = "https://restapi.amap.com/v3/config/district"
        params = {"keywords": city_name, "key": AMAP_KEY, "subdistrict": 0}
        response = requests.get(url, params=params, timeout=10)
        data = response.json()
        if data["status"] == "1" and data["districts"]:
            return data["districts"][0]["adcode"]
        return None
  • 代码执行工具:实现数据处理与自动化:用于执行Python代码完成数据计算、文件处理、报表生成等任务,核心是“安全可控”——避免Agent执行恶意代码(如删除文件、访问敏感数据)。LangChain的`PythonREPLTool`是常用选择,支持限制执行目录;基础场景也可通过`exec`实现,但需严格隔离执行环境(如用沙箱库`restrictedpython`)。适用场景:数据分析(生成销售报表)、文件转换(CSV转Excel)、自动化脚本(批量重命名文件)。
    from langchain.tools import PythonREPLTool
    from restrictedpython import compile_restricted, safe_globals  # 安全执行库
    import pandas as pd

    # 1. LangChain PythonREPLTool(适合可控场景)
    repl_tool = PythonREPLTool()

    # 任务:分析销售数据,计算各区域销售额占比
    sales_data_code = """
    import pandas as pd
    import matplotlib.pyplot as plt

    # 读取数据(假设数据在当前目录)
    df = pd.read_csv("sales_data.csv")
    # 计算各区域销售额
    region_sales = df.groupby("region")["sales"].sum()
    # 计算占比
    region_ratio = (region_sales / region_sales.sum() * 100).round(2)
    # 生成饼图并保存
    plt.pie(region_ratio, labels=region_ratio.index, autopct='%1.1f%%')
    plt.title("各区域销售额占比")
    plt.savefig("sales_ratio.png")
    # 输出结果
    print("各区域销售额占比:")
    print(region_ratio)
    """

    # 执行代码(限制在指定目录,需配置code_execution_config)
    result = repl_tool.run(sales_data_code)
    print("代码执行结果:", result)

    # 2. 安全执行基础代码(用restrictedpython防止恶意操作)
    def safe_execute_code(code, local_vars=None):
        """安全执行Python代码,限制危险操作"""
        local_vars = local_vars or {}
        # 编译代码(仅允许安全操作)
        byte_code = compile_restricted(code, "

2.2 主流开发框架与技术栈

框架

核心优势

适用场景

入门案例

框架

核心优势

适用场景

入门案例

LangChain

1. 组件化设计:提供记忆、工具、链等100+现成组件,支持模块化组合;2. 生态完善:兼容OpenAI、Anthropic等主流LLM,集成Pinecone、FAISS等向量数据库;3. 开发高效:LCEL表达式简化工作流编排,支持快速原型开发;4. 文档丰富:官方文档含完整教程和实战案例,社区问题响应及时。

单Agent复杂任务开发,如文档问答、智能客服、个人助理,尤其适合需要多工具协作和记忆管理的场景,广泛应用于企业级AI应用的快速迭代。

构建“PDF产品手册问答Agent”:1. 用PyPDFLoader加载PDF文件;2. 用RecursiveCharacterTextSplitter分割文本;3. 用OpenAIEmbeddings生成向量;4. 存储至FAISS向量库;5. 用RetrievalQA链实现“提问-检索-回答”闭环,核心代码:
from langchain.document_loaders import PyPDFLoader
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
# 1. 加载与分割文档
loader = PyPDFLoader("产品手册.pdf")
docs = loader.load_and_split()
# 2. 向量存储
db = FAISS.from_documents(docs, OpenAIEmbeddings())
# 3. 构建问答链
qa_chain = RetrievalQA.from_chain_type(llm=ChatOpenAI(), chain_type="stuff", retriever=db.as_retriever())
# 4. 运行
print(qa_chain.run("这款产品的保修政策是什么?"))

AutoGen

1. 多Agent协作:原生支持Agent间对话交互与任务分工,内置多种协作模式;2. 对话驱动:通过自然语言对话拆解复杂任务,降低开发难度;3. 代码执行优化:支持代码生成、执行与调试的全流程,适合技术类任务;4. 灵活配置:可自定义Agent角色、目标和交互规则,适配不同场景。

多角色协作任务,如数据分析与可视化、软件开发、市场调研,尤其适合需要“专业分工”的复杂场景,可模拟人类团队的协作模式。

设置“数据分析师+代码执行者”双Agent完成销售数据分析:1. 定义DataAnalyzerAgent(负责提出分析思路和代码需求);2. 定义CodeExecutorAgent(负责执行代码并返回结果);3. 用initiate_chat启动协作,核心代码:
from autogen import AssistantAgent, UserProxyAgent

# 1. 定义Agent
data_analyst = AssistantAgent(name="data_analyst", system_message="你是数据分析师,生成分析销售数据的Python代码")
code_executor = UserProxyAgent(name="code_executor", code_execution_config={"work_dir":"coding"})

# 2. 启动协作
code_executor.initiate_chat(data_analyst, message="用sales_data.csv中的数据,分析各区域销售额占比并生成饼图")

Rasa

1. 企业级稳定性:支持高并发访问,提供完善的运维监控工具;2. 自定义NLU:可训练领域专属的意图识别和实体抽取模型,适配专业术语;3. 本地部署:支持私有化部署,满足数据安全需求;4. 多渠道集成:兼容微信、企业微信、电话等多种交互渠道。

企业级对话系统,如银行客服、政务咨询、运营商服务,尤其适合对数据隐私和定制化要求高的行业场景。

训练“银行客服Agent”:1. 编写nlu.yml定义意图(如查余额、转账)和实体(如金额、账户);2. 编写stories.yml定义对话流程;3. 训练模型并测试,核心配置(nlu.yml):
nlu:
- intent: check_balance
  examples: |
    - 查一下我的银行卡余额
    - 我的账户还有多少钱
- intent: transfer_money
  examples: |
    - 转账500元到账户622202XXXX
    - 给张三转1000块
- entity: account_number
  examples: |
    - 622202XXXX
    - 储蓄卡8888结尾的账户

2.3 进阶实战:工具调用Agent 开发

任务目标

核心步骤

  1. 定义工具与封装:注册3类核心工具,用LangChain的BaseTool封装实现统一接口:
      天气查询工具:调用高德天气API,输入城市和日期,返回天气状况和温度;
  1. 景点推荐工具:调用马蜂窝API,传入城市、同行人员(筛选亲子景点)、天气条件(如雨天推荐室内场馆),返回景点列表及评分;
  1. 酒店预订工具:调用携程API,根据行程地点和日期,返回周边亲子友好型酒店及预订链接。
  1. 决策逻辑设计:基于GPT-3.5-turbo的Function Call能力,设计“多步决策流程”——1. 提取用户输入中的核心参数(目的地、时间、同行人员);2. 调用天气查询工具获取每日天气;3. 根据天气结果调用景点推荐工具筛选适配景点;4. 结合景点位置调用酒店预订工具;5. 整合所有信息生成行程单。通过提示词明确决策顺序,示例:
    你是旅行规划Agent,需按以下步骤完成任务:
    1. 先检查用户输入是否包含目的地、出行时间、同行人员,缺失则询问补充;
    2. 调用weather_query工具查询每日天气;
    3. 用天气结果调用attraction_recommend工具,筛选适合同行人员的景点;
    4. 调用hotel_book工具获取景点周边酒店;
    5. 按日期整理行程(含天气、景点、酒店、注意事项),用自然语言输出。
  1. 记忆集成与优化:采用“短期记忆+长期记忆”组合方案——短期记忆用ConversationSummaryMemory存储用户输入参数和工具调用结果,避免重复询问;长期记忆用Pinecone存储用户历史旅行偏好(如“喜欢经济型酒店”“避开人流密集景点”),在推荐时优先匹配。记忆加载示例:
    from langchain.memory import ConversationSummaryMemory

    # 短期记忆:总结对话内容
    summary_memory = ConversationSummaryMemory(llm=ChatOpenAI(), memory_key="chat_history")
    # 加载历史对话(用户曾说“喜欢经济型酒店”)
    summary_memory.save_context(
        {"input":"我之前旅行都住经济型酒店,性价比高"},
        {"output":"已记录你的偏好,规划时优先推荐经济型酒店"}
    )

    # 长期记忆:检索用户偏好
    def get_user_preference(user_id):
        # 从Pinecone检索用户偏好(略,同前文向量检索逻辑)
        return "喜欢经济型酒店,避开人流密集景点"
  1. 异常处理与容错:设计三层容错机制——1. 参数校验:工具调用前检查参数格式(如日期是否为YYYY-MM-DD),错误则提示用户修正;2. 重试机制:API调用超时或返回错误时,自动重试2次,间隔3秒;3. 降级策略:工具不可用时,调用本地知识库(如离线景点列表)生成基础行程,示例重试逻辑:
    import time

    def call_api_with_retry(api_func, max_retry=2, **kwargs):
        retry_count = 0
        while retry_count < max_retry:
            try:
                return api_func(** kwargs)
            except Exception as e:
                retry_count += 1
                print(f"API调用失败,重试第{retry_count}次,错误:{str(e)}")
                time.sleep(3)
        # 降级处理:返回离线数据
        return get_offline_data(api_func.__name__, **kwargs)

关键代码片段

Plain Text

from langchain.agents import initialize_agent, Tool
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationSummaryMemory
import requests
import time

# 1. 定义工具函数(含重试与降级)
def get_offline_weather(city, date):
    """降级:离线天气数据"""
    return f"{city}{date}天气:晴,温度5-12℃(离线数据)"

def get_weather(city, date):
    """天气查询工具核心函数"""
    city_code = {"北京":"110000","上海":"310000"}
    if city not in city_code:
        return f"暂不支持{city}的天气查询"
    url = "https://restapi.amap.com/v3/weather/weatherInfo"
    params = {"city": city_code[city], "date": date, "key": "你的高德API密钥"}
    try:
        response = requests.get(url, params=params, timeout=10)
        response.raise_for_status()
        data = response.json()
        if data["status"] == "1":
            cast = data["forecasts"][0]["casts"][0]
            return f"{city}{date}:{cast['dayweather']},日间温度{cast['daytemp']}℃,夜间{cast['nighttemp']}℃"
        return f"查询失败:{data['info']}"
    except Exception as e:
        # 调用降级函数
        return get_offline_weather(city, date)

# 2. 注册工具(含景点推荐、酒店预订工具,实现略)
tools = [
    Tool(
        name="WeatherQuery",
        func=get_weather,
        description="查询城市指定日期的天气,参数:city(城市名)、date(日期YYYY-MM-DD)"
    ),
    # Tool(name="AttractionRecommend", ...),  # 景点推荐工具
    # Tool(name="HotelBook", ...)             # 酒店预订工具
]

# 3. 初始化记忆模块(短期记忆+用户偏好)
memory = ConversationSummaryMemory(llm=ChatOpenAI(model="gpt-3.5-turbo"), memory_key="chat_history")
# 加载用户历史偏好
memory.save_context(
    {"input":"我带2个5岁小孩旅行,需要亲子友好的景点和酒店"},
    {"output":"已记录:2名5岁儿童同行,优先推荐亲子景点及酒店"}
)

# 4. 初始化Agent(指定决策策略)
agent = initialize_agent(
    tools,
    ChatOpenAI(model="gpt-3.5-turbo", temperature=0),
    agent="chat-zero-shot-react-description",
    verbose=True,
    memory=memory,
    agent_kwargs={
        "system_message": "你是亲子旅行规划Agent,需结合天气和用户偏好(2名5岁儿童)推荐景点,按日期整理行程,语言亲切易懂。"
    }
)

# 5. 运行Agent并处理结果
try:
    result = agent.run("帮我规划北京2025年1月1日-3日的3天行程")
    # 格式化输出行程单
    print("\n=== 北京亲子旅行行程单 ===")
    print(result)
except Exception as e:
    print(f"行程规划失败:{str(e)}")

三、高阶:Agent 系统优化与前沿方向

3.1 系统级优化技术

3.1.1 性能优化

  • 上下文压缩:用LLM生成对话摘要(如LangChain的ConversationSummaryBufferMemory),减少Token消耗。
  • 并行执行:多Agent任务并行(如AutoGen的parallel_agent_executor),提升复杂任务效率。
  • 模型选型:简单决策用GPT-3.5-turbo,复杂推理用GPT-4,非关键模块用开源模型(如Llama 3)降低成本。

3.1.2 可靠性优化

  • 指令对齐:用RLHF(基于人类反馈的强化学习)微调模型,确保Agent行为符合预期。
  • 安全防护:检测提示注入攻击(如用LangChain的OutputParser校验输出格式)、限制敏感工具调用权限。
  • 容错机制:工具调用失败时,自动切换备用工具(如天气API失效时用另一个数据源)。

3.2 前沿技术方向

3.2.1 多模态Agent

  • 核心能力:融合文本、图像、语音、传感器数据,实现“跨模态感知-决策”。
  • 技术实现:用GPT-4V(视觉)、Whisper(语音)作为感知入口,结合LangChain实现多模态信息融合。
  • 应用场景:智能机器人(如家庭服务机器人)、AR/VR交互Agent。

3.2.2 具身智能Agent

  • 核心定义:Agent拥有物理实体(如机器人),能在真实物理世界中行动(如抓取物体、移动)。
  • 关键技术:强化学习(控制实体动作)、SLAM(环境地图构建)、运动学模型(关节控制)。
  • 开发工具:PyTorch Robotics、ROS(机器人操作系统)、Mujoco(物理仿真环境)。

3.2.3 开放域多Agent协作

  • 核心挑战:Agent间角色分配、任务调度、冲突解决。
  • 协作机制
            集中式:有“监督Agent”分配任务(如MetaGPT的Product Manager角色)。
  • 分布式:Agent通过共识算法(如Raft)自主协调(如区块链共识Agent)。

实践案例:用AutoGen构建“电商运营团队”——含“选品Agent”“推广Agent”“客服Agent”,协同完成店铺运营。

3.3 企业级Agent 落地要点

  • 合规性:用户数据加密存储(符合GDPR/个人信息保护法)、明确Agent行为边界(如禁止金融欺诈)。
  • 可解释性:记录Agent决策链路(如“为何推荐A景点”→“因天气晴朗且用户偏好自然景观”),用LangChain的AgentTracer实现。
  • 运维监控:用Prometheus监控Agent响应延迟、成功率,用Grafana可视化指标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值