AI Agent 设计模式系列(九)——学习和适应模式

学习和适应对于增强人工智能 Agent 的能力至关重要。这些过程使 Agent 能够超越预定义参数进行演化,通 过经验和环境交互实现自主改进。通过学习和适应,Agent 可以有效应对新情况并优化其性能,而无需持续 的人工干预。

本文将深入探讨支撑 Agent 学习和适应的原理与机制。

全局视角

Agent 通过基于新经验和数据改变其思维、行动或知识来实现学习和适应。这使得 Agent 能够从简单地遵循 指令演化为随时间推移变得更加智能。

・ 强化学习: Agent 尝试行动并获得积极结果奖励/消极结果惩罚,在动态环境中学习最优行为。适用于 控制机器人或游戏角色的 Agent。

・ 监督学习: Agent 从标注示例学习输入与期望输出的映射关系,支持决策制定和模式识别任务。适用 于邮件分类或趋势预测的 Agent。

・ 无监督学习: Agent 在未标注数据中发现隐藏模式和关联,构建环境心理模型并获取洞察。适用于无 特定指导的数据探索场景。

・ 基于大语言模型(LLM)的少样本/零样本学习:利用大语言模型的 Agent 通过少量示例或明确指令快 速适应新任务,实现对新命令/情况的即时响应。

・ 在线学习: Agent 持续更新知识库以适应动态环境,对实时响应和持续优化至关重要。适用于处理连 续数据流的 Agent。

・ 基于记忆的学习: Agent 回忆过往经验调整当前行动,增强上下文感知和决策能力。特别适合具备记 忆召回能力的 Agent。

Agent 基于学习结果改变策略、理解或目标来实现适应。这对于在不可预测、变化或新环境中的 Agent 至关 重要。

近端策略优化(PPO)是一种强化学习算法,用于在具有连续动作范围的环境中训练 Agent,例如控制机器 人的关节或游戏中的角色。其主要目标是可靠且稳定地改进 Agent 的决策策略(即其策略)。

PPO 的核心思想是对 Agent 策略进行小幅谨慎更新,避免可能导致性能崩溃的剧烈变化。

其工作流程如下:

**1. 收集数据:**Agent 使用其当前策略与环境交互(例如,玩游戏)并收集一批经验数据(状态、动作、奖 励)。

2. 评估替代目标(Surrogate Goal): PPO 计算策略更新对预期奖励的影响,使用特殊的"裁剪"目标 函数而非单纯奖励最大化。

**3. 裁剪机制:**这是 PPO 稳定性的关键。它在当前策略周围创建一个"信任区域"或安全区,阻止算法进 行与当前策略差异过大的更新。这种裁剪机制就像一个安全刹车,确保 Agent 不会采取巨大而有风险 的步骤来破坏其学习成果。 简而言之,PPO 在改进性能与保持接近已知有效策略之间取得平衡,这可以防止训练期间的灾难性故障并实 现更稳定的学习过程。

**直接偏好优化(DPO)**是一种专门为使大语言模型与人类偏好保持一致而设计的更新方法。它为此任务提供 了比使用 PPO 更简单、更直接的替代方案。 要理解 DPO,首先了解传统的基于 PPO 的对齐方法会有所帮助:

・ PPO 方法(两步过程):

**1. 训练奖励模型:**首先收集人类反馈数据,人们在其中评级或比较不同的 LLM 响应(例如,"响应 A 比响应 B 更好")。这些数据用于训练一个独立的 AI 模型,称为奖励模型,其任务是预测人类会给 任何新响应打什么分数。

**2. 使用 PPO 微调:**接下来使用 PPO 微调 LLM。LLM 的目标是生成能够从奖励模型获得最高分的响 应。奖励模型在训练过程中充当"评判员"。 这个两步过程可能既复杂又不稳定。例如,LLM 可能会找到漏洞并学会"破解"奖

励模型,为质量较差的响 应获得高分。

・ DPO 方法(直接过程): DPO 完全跳过了奖励模型。它不是将人类偏好转换为奖励分数然后优化该分 数,而是直接使用偏好数据来更新 LLM 的策略。

・ 它通过利用直接将偏好数据与最优策略联系起来的数学关系来工作。本质上,它教导模型:"增加生成 类似偏好响应的概率,减少生成类似不受欢迎响应的概率。" 本质上,DPO 通过直接在人类偏好数据上优化语言模型来简化对齐过程。这避免了训练和使用单独奖励模 型的复杂性和潜在不稳定性,使对齐过程更加高效和稳健。

实际应用与用例

自适应 Agent 通过由经验数据驱动的迭代更新,在可变环境中表现出增强的性能。

**・ 个性化助手 Agent:**分析用户行为模式优化交互协议,生成高度定制化响应。

**・ 交易机器人 Agent:**基于实时市场数据动态调整模型参数,优化决策算法并平衡风险收益。 ・ 应用程序 Agent:根据用户行为动态修改界面功能,提升系统直观性和参与度。

**・ 机器人及自动驾驶 Agent:**整合传感器数据和历史行动分析,实现各种环境下的安全高效操作。

**・ 欺诈检测 Agent:**识别新型欺诈模式改进预测模型,增强异常检测能力并降低损失。

**・ 推荐 Agent:**采用用户偏好学习算法,提供高度个性化的上下文相关推荐。

**・ 游戏 AIAgent:**动态调整战略算法增加游戏复杂性和挑战性,提升玩家参与度。

**・ 知识库学习 Agent:**利用检索增强生成(RAG)维护问题与解决方案的动态知识库,通 过成功模式复用和陷阱规避有效适应新情况。

概览

是什么:

AI Agent 通常在动态和不可预测的环境中运行,其中预编程逻辑是不够的。当面对初始设计期间未 预料到的新情况时,它们的性能可能会下降。没有从经验中学习的能力,Agent 无法随时间优化其策略或个 性化其交互。这种刚性限制了它们的有效性,并阻止它们在复杂的现实世界场景中实现真正的自主性。

为什么:

标准化解决方案是集成学习和适应机制,将静态 Agent 转变为动态的、演化的系统。这使 Agent 能 够基于新数据和交互自主改进其知识和行为。Agent 系统可以使用各种方法,从强化学习到更高级的技术, 如自我改进编码 Agent(SICA)中看到的自我修改。像 Google 的 AlphaEvolve 这样的高级系统利用 LLM 和 进化算法来发现全新的、更高效的复杂问题解决方案。通过持续学习,Agent 可以掌握新任务、增强其性能 并适应变化的条件,而无需持续的手动重新编程。

经验法则:

在构建必须在动态、不确定或演化环境中运行的 Agent 时使用此模式。它对于需要个性化、持续 性能改进以及自主处理新情况的能力的应用至关重要。

图3:学习和适应模式

关键要点

・ 学习和适应是 Agent 通过经验改进行为并处理新情况的过程

・"适应"是学习导致的 Agent 行为/知识的可见变化

・ 自我改进编码 Agent(SICA)通过修改代码自我演进,产生智能编辑器、AST 符号定位器等工具

・ 专用"子Agent"和"监督者"架构帮助管理系统复杂性

・ 智能设置 LLM 上下文窗口(系统提示/核心提示/助手消息)对运行效率至关重要

・ 本模式对动态/不确定/需个性化环境中的 Agent 必不可少

・ 构建学习型 Agent 需集成机器学习工具并管理数据流

・ 具备基础编码能力的 Agent 系统可自主改进基准任务性能

・ AlphaEvolve 利用大语言模型和进化框架自主发现优化算法,推动科研与工程应用

案例研究

自我改进编码 Agent(SICA) 自我改进编码 Agent(SICA)由 Maxime Robeyns、Laurence Aitchison 和 Martin Szummer 开发,代表了 基于 Agent 的学习的重要进展,展示了 Agent 修改自身源代码的能力。这与传统方法形成鲜明对比,在传统 方法中,一个 Agent 可能训练另一个 Agent;而 SICA 既是修改者又是被修改的实体,通过迭代方式改进其 代码库,以提升在各种编码挑战中的性能。 SICA 的自我改进通过迭代循环实现(见图 1)。Agent 首先审查历史版本在基准测试的表现,选择加权评分 (成功率/时间/计算成本)最高的版本。选定版本分析存档识别改进点,直接修改代码库后重新测试并记录结 果。此循环机制使 Agent 无需传统训练即可持续进化。

图 1:SICA 的自我改进过程,基于其过去版本进行学习和适应

SICA 经历了显著的自我改进,在代码编辑和导航方面取得了重要进展。最初,SICA 使用基本的文件覆盖方 法进行代码更改。随后,它开发了能够进行更智能和上下文相关编辑的"智能编辑器"。这进一步演变为"差 异增强智能编辑器",结合差异进行有针对性的修改和基于模式的编辑,以及"快速覆盖工具"以减少处理 需求。

SICA 进一步实现了"最小差异输出优化"和"上下文敏感差异最小化",使用抽象语法树(AST)解析来提 高效率。此外,还添加了"智能编辑器输入规范化器"。在导航方面,SICA 独立创建了"AST 符号定位器", 使用代码的结构图(AST)来识别代码库中的定义。后来,开发了"混合符号定位器",将快速搜索与 AST 检 查相结合。这通过"混合符号定位器中的优化 AST 解析"进一步优化,专注于相关代码部分,提高搜索速度 (见图 2)。

图 2:跨迭代的性能表现。关键改进用其相应的工具或 Agent 修改进行标注。(由 Maxime Robeyns、Martin Szummer、Laurence Aitchison 提供)

SICA 的架构包括用于基本文件操作、命令执行和算术计算的基础工具包。它包含结果提交机制和专门子 Agent(编码、问题解决和推理)的调用功能。这些子 Agent 负责分解复杂任务并管理 LLM 的上下文长度, 特别是在扩展改进周期期间。 异步监督者(另一个 LLM)监控 SICA 的行为,识别潜在问题,如循环或停滞。它与 SICA 进行通信,必要时 可以介入以停止执行。监督者接收 SICA 行动的详细报告,包括调用图和消息及工具操作日志,以识别模式 和低效率。 SICA 的 LLM 在其上下文窗口(其短期内存)中以结构化方式组织信息,这对操作至关重要。此结构包括定 义 Agent 目标的系统提示词、工具和子 Agent 文档以及系统指令。核心提示词包含问题陈述或指令、打开文 件的内容和目录映射。助手消息记录 Agent 的逐步推理、工具和子 Agent 调用记录及结果以及监督者通信。 这种组织方式促进了高效的信息流动,增强了 LLM 操作并减少了处理时间和成本。最初,文件更改记录为 差异,仅显示修改内容并定期合并。

**SICA:代码深度解析:**深入研究 SICA 的实现揭示了支撑其能力的几个关键设计选择。如前所述,该系统采 用模块化架构构建,包含多个子 Agent,如编码 Agent、问题解决 Agent 和推理 Agent。这些子 Agent 由主 Agent 调用,类似于工具调用,用于分解复杂任务并有效管理上下文长度,特别是在这些扩展的元改进迭代 期间。 该项目正在积极开发中,旨在为 LLM 工具使用及 Agent 任务后训练提供强大框架,完整代码参见 GitHub 存 储库。 出于安全考虑,该项目强烈强调 Docker 容器化,这意味着 Agent 在专用 Docker 容器内运行。这是一个关键 措施,因为它提供了与主机的隔离,鉴于 Agent 执行 shell 命令的能力,这减轻了意外文件系统操作等风险。 为确保透明度和控制,系统通过可视化事件总线上的事件和 Agent 调用图的交互式网页提供强大的可观察 性。这提供了对 Agent 行动的全面洞察,允许用户检查单个事件、阅读监督者消息并折叠子 Agent 跟踪以获 得更清晰的理解。 就其核心智能而言,Agent 框架支持来自各种提供商的 LLM 集成,使用户能够尝试不同的模型以找到特定任 务的最佳匹配。最后,一个关键组件是异步监督者,这是一个与主 Agent 并发运行的 LLM。此监督者定期评 估 Agent 的行为是否存在病理性偏差或停滞,必要时可以通过发送通知甚至取消 Agent 的执行来介入。它接收系统状态的详细文本表示,包括调用图和 LLM 消息、工具调用和响应的事件流,这使它能够检测低效模 式或重复工作。 初始 SICA 实现中的一个显著挑战是提示基于 LLM 的 Agent 在每次元改进迭代期间独立提出新颖、创新、可 行且引人入胜的修改。这一限制,特别是在培养 LLM Agent 的开放式学习和真正创造力方面,仍然是当前研 究的关键领域。

用例DEMO

我们将在DEMO中展示一个简单的自适应Agent框架,并实现一个个性化助手Agent的示例。

由于时间限制,我们将构建一个基本的Agent结构,它能够根据用户的历史交互来调整自己的响应。

我们将使用一个简单的记忆机制来存储历史交互,并根据历史数据来生成响应。

注意:这个示例非常简化,实际的自适应Agent会更加复杂,可能会使用机器学习模型来调整行为。

步骤:

  1. 设计一个Agent基类,包含记忆存储和更新机制。

  2. 实现一个个性化助手Agent,它根据用户的历史交互来调整响应。

  3. 演示Agent如何根据交互历史改变自己的响应。

我们将使用一个字典来存储用户的历史交互,并计算用户对某些话题的偏好,然后根据偏好调整响应。

由于我们只是演示,这里不会使用复杂的模型,而是使用基于规则的响应调整。

我们假设助手Agent可以处理两种话题:天气和新闻。根据用户的历史询问次数,Agent会调整对不同话题的响应方式。

例如,如果用户经常问天气,那么当用户问"今天怎么样?"时,Agent会优先回答天气相关;如果用户经常问新闻,则优先提供新闻。

我们使用一个简单的记忆类来存储用户的历史交互,然后Agent根据历史数据做出决策。

代码结构:

  • Memory类:存储用户的历史交互,并可以计算用户对话题的偏好。

  • AdaptiveAgent基类:具有记忆和更新机制。

  • PersonalizedAssistantAgent:继承自AdaptiveAgent,实现具体的响应生成逻辑。

我们将模拟几次交互来展示Agent如何适应。

1. 个性化助手 Agent

python 复制代码
# personalized_assistant.py
import json
from datetime import datetime
from typing import Dict, List, Any
from dataclasses import dataclass, asdict
from collections import defaultdict

@dataclass
class UserInteraction:
    timestamp: str
    query_type: str  # "weather", "news", "schedule", "shopping", "entertainment"
    user_sentiment: float  # -1 to 1
    response_time: float
    user_feedback: float  # 0 to 1

class PersonalizedAssistantAgent:
    def __init__(self, user_id: str):
        self.user_id = user_id
        self.interaction_history: List[UserInteraction] = []
        self.user_profile = {
            "preferred_topics": defaultdict(float),
            "response_style": "detailed",  # detailed, concise, humorous
            "active_hours": {"start": 9, "end": 21},
            "communication_preference": "text",  # text, voice
        }
        
    def learn_from_interaction(self, interaction: UserInteraction):
        """从交互中学习用户偏好"""
        self.interaction_history.append(interaction)
        
        # 更新主题偏好
        self.user_profile["preferred_topics"][interaction.query_type] += interaction.user_feedback
        
        # 根据情感调整响应风格
        if interaction.user_sentiment < -0.5:
            self.user_profile["response_style"] = "empathetic"
        elif interaction.user_sentiment > 0.5:
            self.user_profile["response_style"] = "enthusiastic"
            
        # 学习最佳响应时间
        if interaction.response_time < 2.0 and interaction.user_feedback > 0.7:
            hour = datetime.now().hour
            if hour < self.user_profile["active_hours"]["start"]:
                self.user_profile["active_hours"]["start"] = hour
            elif hour > self.user_profile["active_hours"]["end"]:
                self.user_profile["active_hours"]["end"] = hour
    
    def generate_response(self, query: str, query_type: str) -> str:
        """根据用户偏好生成个性化响应"""
        current_hour = datetime.now().hour
        active = (self.user_profile["active_hours"]["start"] <= current_hour <= 
                  self.user_profile["active_hours"]["end"])
        
        # 选择响应模板
        style = self.user_profile["response_style"]
        templates = {
            "detailed": "让我为您详细介绍一下...",
            "concise": "简要来说...",
            "humorous": "哈哈,这个问题问得好!",
            "empathetic": "我理解您的心情...",
            "enthusiastic": "太棒了!关于这个问题..."
        }
        
        # 基于偏好的响应增强
        topic_preference = self.user_profile["preferred_topics"].get(query_type, 0.5)
        if topic_preference > 0.8:
            enthusiasm = "您经常关注这个话题,我来为您深入分析!"
        else:
            enthusiasm = ""
            
        response = f"{templates.get(style, '')} {enthusiasm}"
        
        # 如果不是活跃时间,添加礼貌说明
        if not active:
            response += " 现在可能不是您通常的活跃时间,如有打扰请见谅。"
            
        return response
    
    def adapt_protocol(self):
        """自适应调整交互协议"""
        recent_interactions = self.interaction_history[-10:] if len(self.interaction_history) > 10 else self.interaction_history
        
        if not recent_interactions:
            return
            
        avg_feedback = sum(i.user_feedback for i in recent_interactions) / len(recent_interactions)
        
        # 根据反馈调整协议
        if avg_feedback < 0.3:
            self.user_profile["response_style"] = "concise"
            print(f"为{self.user_id}切换到简洁模式")
        elif avg_feedback > 0.8:
            self.user_profile["response_style"] = "detailed"
            print(f"为{self.user_id}切换到详细模式")

# 使用示例
if __name__ == "__main__":
    agent = PersonalizedAssistantAgent("user_001")
    
    # 模拟几次交互
    interactions = [
        ("今天天气怎么样?", "weather", 0.8, 1.5, 0.9),
        ("有什么新闻?", "news", -0.2, 2.0, 0.3),
        ("帮我订餐厅", "shopping", 0.5, 1.0, 0.8),
    ]
    
    for query, qtype, sentiment, resp_time, feedback in interactions:
        interaction = UserInteraction(
            timestamp=datetime.now().isoformat(),
            query_type=qtype,
            user_sentiment=sentiment,
            response_time=resp_time,
            user_feedback=feedback
        )
        agent.learn_from_interaction(interaction)
        
        response = agent.generate_response(query, qtype)
        print(f"Query: {query}")
        print(f"Response: {response}")
        print(f"User Profile: {agent.user_profile['preferred_topics']}")
        print("-" * 50)
    
    agent.adapt_protocol()

2. 交易机器人 Agent

python 复制代码
# trading_agent.py
import numpy as np
from typing import List, Tuple, Optional
from dataclasses import dataclass
from enum import Enum
import random

class MarketCondition(Enum):
    BULLISH = "bullish"
    BEARISH = "bearish"
    VOLATILE = "volatile"
    SIDEWAYS = "sideways"

@dataclass
class MarketData:
    timestamp: str
    price: float
    volume: float
    rsi: float  # 相对强弱指数
    macd: float  # 异同移动平均线
    volatility: float

class AdaptiveTradingAgent:
    def __init__(self, initial_capital: float = 10000.0):
        self.capital = initial_capital
        self.portfolio = {}
        self.risk_tolerance = 0.5  # 0-1, 1表示高风险
        self.performance_history = []
        
        # 动态参数
        self.trading_params = {
            "position_size": 0.1,  # 仓位大小比例
            "stop_loss": 0.02,  # 止损比例
            "take_profit": 0.05,  # 止盈比例
            "rsi_threshold": {"buy": 30, "sell": 70},
            "macd_sensitivity": 0.001
        }
        
    def analyze_market(self, market_data: List[MarketData]) -> MarketCondition:
        """分析市场状况"""
        if len(market_data) < 10:
            return MarketCondition.SIDEWAYS
            
        prices = [md.price for md in market_data[-10:]]
        returns = np.diff(prices) / prices[:-1]
        
        # 计算市场状况
        avg_return = np.mean(returns)
        volatility = np.std(returns)
        
        if avg_return > 0.005 and volatility < 0.02:
            return MarketCondition.BULLISH
        elif avg_return < -0.005 and volatility < 0.02:
            return MarketCondition.BEARISH
        elif volatility > 0.03:
            return MarketCondition.VOLATILE
        else:
            return MarketCondition.SIDEWAYS
    
    def adjust_parameters(self, market_condition: MarketCondition, recent_performance: List[float]):
        """根据市场状况和近期表现调整参数"""
        if recent_performance:
            avg_performance = np.mean(recent_performance[-5:]) if len(recent_performance) >= 5 else 0
            
            # 根据表现调整风险容忍度
            if avg_performance > 0.05:  # 表现好,增加风险
                self.risk_tolerance = min(1.0, self.risk_tolerance + 0.1)
            elif avg_performance < -0.03:  # 表现差,降低风险
                self.risk_tolerance = max(0.1, self.risk_tolerance - 0.1)
        
        # 根据市场状况调整交易参数
        if market_condition == MarketCondition.BULLISH:
            self.trading_params["position_size"] = 0.15 * self.risk_tolerance
            self.trading_params["take_profit"] = 0.08
            self.trading_params["stop_loss"] = 0.03
        elif market_condition == MarketCondition.BEARISH:
            self.trading_params["position_size"] = 0.05 * self.risk_tolerance
            self.trading_params["take_profit"] = 0.03
            self.trading_params["stop_loss"] = 0.01
        elif market_condition == MarketCondition.VOLATILE:
            self.trading_params["position_size"] = 0.08 * self.risk_tolerance
            self.trading_params["stop_loss"] = 0.02
            self.trading_params["take_profit"] = 0.04
        else:  # SIDEWAYS
            self.trading_params["position_size"] = 0.1 * self.risk_tolerance
            self.trading_params["stop_loss"] = 0.015
            self.trading_params["take_profit"] = 0.02
    
    def make_decision(self, market_data: MarketData, market_condition: MarketCondition) -> Tuple[str, float]:
        """做出交易决策"""
        decision = "HOLD"
        amount = 0.0
        
        # RSI指标信号
        if market_data.rsi < self.trading_params["rsi_threshold"]["buy"]:
            signal_strength = (self.trading_params["rsi_threshold"]["buy"] - market_data.rsi) / 30
            if signal_strength > 0.3 and market_condition != MarketCondition.BEARISH:
                decision = "BUY"
        elif market_data.rsi > self.trading_params["rsi_threshold"]["sell"]:
            signal_strength = (market_data.rsi - self.trading_params["rsi_threshold"]["sell"]) / 30
            if signal_strength > 0.3:
                decision = "SELL"
        
        # MACD信号
        if abs(market_data.macd) > self.trading_params["macd_sensitivity"]:
            if market_data.macd > 0 and decision == "HOLD":
                decision = "BUY"
            elif market_data.macd < 0 and decision == "HOLD":
                decision = "SELL"
        
        # 确定交易量
        if decision != "HOLD":
            position_size = self.capital * self.trading_params["position_size"]
            amount = position_size / market_data.price
            
            # 根据波动性调整
            if market_data.volatility > 0.04:
                amount *= 0.7  # 高波动性减少仓位
        
        return decision, amount
    
    def execute_trade(self, symbol: str, decision: str, amount: float, price: float) -> float:
        """执行交易并返回收益"""
        if decision == "BUY":
            cost = amount * price
            if cost <= self.capital:
                self.capital -= cost
                self.portfolio[symbol] = self.portfolio.get(symbol, 0) + amount
                return -cost
        elif decision == "SELL":
            if symbol in self.portfolio and self.portfolio[symbol] >= amount:
                revenue = amount * price
                self.capital += revenue
                self.portfolio[symbol] -= amount
                if self.portfolio[symbol] == 0:
                    del self.portfolio[symbol]
                return revenue
        return 0.0

# 模拟交易环境
class MarketSimulator:
    def __init__(self, initial_price: float = 100.0):
        self.price = initial_price
        self.trend = 0.001  # 微小上涨趋势
        self.volatility = 0.02
        
    def generate_market_data(self) -> MarketData:
        """生成模拟市场数据"""
        # 随机价格变动
        price_change = self.trend + random.uniform(-self.volatility, self.volatility)
        self.price *= (1 + price_change)
        
        # 模拟技术指标
        rsi = random.uniform(20, 80)
        macd = random.uniform(-0.005, 0.005)
        
        return MarketData(
            timestamp=datetime.now().isoformat(),
            price=self.price,
            volume=random.uniform(1000, 10000),
            rsi=rsi,
            macd=macd,
            volatility=self.volatility
        )

# 使用示例
if __name__ == "__main__":
    trader = AdaptiveTradingAgent(initial_capital=10000)
    market = MarketSimulator(initial_price=100)
    
    market_data_history = []
    
    print("开始自适应交易...")
    print(f"初始资金: ${trader.capital:.2f}")
    print("-" * 50)
    
    for day in range(30):
        # 生成市场数据
        market_data = market.generate_market_data()
        market_data_history.append(market_data)
        
        # 分析市场
        market_condition = trader.analyze_market(market_data_history)
        
        # 调整参数
        trader.adjust_parameters(market_condition, trader.performance_history)
        
        # 做出决策
        decision, amount = trader.make_decision(market_data, market_condition)
        
        if decision != "HOLD":
            # 执行交易
            symbol = "STOCK_A"
            pnl = trader.execute_trade(symbol, decision, amount, market_data.price)
            trader.performance_history.append(pnl / 10000)  # 归一化收益
            
            print(f"Day {day+1}:")
            print(f"  价格: ${market_data.price:.2f}")
            print(f"  市场状况: {market_condition.value}")
            print(f"  决策: {decision} {amount:.2f}股")
            print(f"  风险容忍度: {trader.risk_tolerance:.2f}")
            print(f"  当前资金: ${trader.capital:.2f}")
            print("-" * 30)
    
    total_return = (trader.capital - 10000) / 10000 * 100
    print(f"\n最终结果:")
    print(f"  最终资金: ${trader.capital:.2f}")
    print(f"  总收益率: {total_return:.2f}%")
    print(f"  交易次数: {len(trader.performance_history)}")

3. RAG 知识库学习 Agent

python 复制代码
# rag_learning_agent.py
from typing import List, Dict, Any, Tuple
import numpy as np
from dataclasses import dataclass
from sentence_transformers import SentenceTransformer
import faiss
import json

@dataclass
class KnowledgeEntry:
    id: str
    question: str
    answer: str
    context: str
    embedding: List[float]
    success_count: int = 0
    failure_count: int = 0
    last_used: str = ""
    tags: List[str] = None

class RAGLearningAgent:
    def __init__(self, model_name: str = "paraphrase-multilingual-MiniLM-L12-v2"):
        self.model = SentenceTransformer(model_name)
        self.dimension = 384  # 模型嵌入维度
        
        # FAISS向量数据库
        self.index = faiss.IndexFlatL2(self.dimension)
        self.knowledge_base: List[KnowledgeEntry] = []
        
        # 学习参数
        self.success_threshold = 3
        self.relevance_threshold = 0.7
        
    def add_knowledge(self, question: str, answer: str, context: str = "", tags: List[str] = None):
        """添加新知识到知识库"""
        embedding = self.model.encode(question).tolist()
        
        entry = KnowledgeEntry(
            id=f"entry_{len(self.knowledge_base)}",
            question=question,
            answer=answer,
            context=context,
            embedding=embedding,
            tags=tags or []
        )
        
        self.knowledge_base.append(entry)
        self.index.add(np.array([embedding]).astype('float32'))
        
        print(f"添加新知识: {question[:50]}...")
        
    def search_similar(self, query: str, top_k: int = 5) -> List[Tuple[KnowledgeEntry, float]]:
        """搜索相似知识"""
        query_embedding = self.model.encode(query).reshape(1, -1).astype('float32')
        
        # 在FAISS中搜索
        distances, indices = self.index.search(query_embedding, top_k)
        
        results = []
        for i, (idx, distance) in enumerate(zip(indices[0], distances[0])):
            if idx < len(self.knowledge_base):
                similarity = 1 / (1 + distance)  # 将距离转换为相似度
                results.append((self.knowledge_base[idx], similarity))
        
        return results
    
    def generate_answer(self, query: str, context: str = "") -> Tuple[str, List[Dict]]:
        """生成答案并检索相关知识"""
        # 搜索相似问题
        similar_knowledge = self.search_similar(query)
        
        if not similar_knowledge:
            return "抱歉,我目前还没有这个问题的答案。", []
        
        # 获取最相关的知识
        best_entry, best_similarity = similar_knowledge[0]
        
        if best_similarity < self.relevance_threshold:
            # 相似度不够,返回通用回答
            return "这个问题我不太确定,让我为您查找更多信息。", []
        
        # 更新成功计数
        best_entry.success_count += 1
        best_entry.last_used = datetime.now().isoformat()
        
        # 构建增强回答
        enhanced_answer = f"{best_entry.answer}\n\n"
        
        # 添加上下文相关信息
        if best_entry.context:
            enhanced_answer += f"相关背景:{best_entry.context}\n\n"
        
        # 添加置信度说明
        confidence = min(best_similarity * 100, 99)
        enhanced_answer += f"(置信度: {confidence:.1f}%)"
        
        # 返回检索到的相关知识点
        retrieved_info = []
        for entry, similarity in similar_knowledge[:3]:
            retrieved_info.append({
                "question": entry.question,
                "answer": entry.answer[:100] + "..." if len(entry.answer) > 100 else entry.answer,
                "similarity": float(similarity),
                "success_rate": entry.success_count / (entry.success_count + entry.failure_count + 1)
            })
        
        return enhanced_answer, retrieved_info
    
    def learn_from_feedback(self, query: str, feedback: Dict[str, Any]):
        """从用户反馈中学习"""
        was_correct = feedback.get("correct", False)
        user_alternative = feedback.get("alternative_answer", "")
        user_context = feedback.get("additional_context", "")
        
        # 找到相关的知识条目
        similar_knowledge = self.search_similar(query, top_k=1)
        
        if similar_knowledge:
            entry, similarity = similar_knowledge[0]
            
            if was_correct:
                entry.success_count += 1
                print(f"知识 '{entry.question[:30]}...' 被验证正确")
            else:
                entry.failure_count += 1
                
                # 如果相似度够高但答案错误,需要更新答案
                if similarity > 0.8 and user_alternative:
                    entry.answer = user_alternative
                    if user_context:
                        entry.context = user_context
                    print(f"知识 '{entry.question[:30]}...' 已更新")
                
                # 如果失败次数过多,可能需要标记
                failure_ratio = entry.failure_count / (entry.success_count + entry.failure_count)
                if failure_ratio > 0.5 and entry.failure_count > 3:
                    entry.tags.append("needs_review")
                    print(f"警告: 知识 '{entry.question[:30]}...' 可能需要重新评估")
        
        # 如果没有找到相关知识,添加新知识
        elif not was_correct and user_alternative:
            self.add_knowledge(
                question=query,
                answer=user_alternative,
                context=user_context,
                tags=["user_provided"]
            )
    
    def analyze_knowledge_base(self):
        """分析知识库状态"""
        print("\n=== 知识库分析 ===")
        print(f"总条目数: {len(self.knowledge_base)}")
        
        if not self.knowledge_base:
            return
            
        # 计算成功率
        total_uses = sum(entry.success_count + entry.failure_count for entry in self.knowledge_base)
        successful_uses = sum(entry.success_count for entry in self.knowledge_base)
        
        if total_uses > 0:
            success_rate = successful_uses / total_uses * 100
            print(f"总体成功率: {success_rate:.1f}%")
        
        # 找出最成功的知识
        successful_entries = sorted(
            self.knowledge_base,
            key=lambda x: x.success_count / (x.success_count + x.failure_count + 1),
            reverse=True
        )[:5]
        
        print("\n最成功的知识点:")
        for i, entry in enumerate(successful_entries, 1):
            rate = entry.success_count / (entry.success_count + entry.failure_count + 1) * 100
            print(f"  {i}. {entry.question[:40]}... (成功率: {rate:.1f}%)")
        
        # 找出需要关注的知识
        problematic_entries = [
            entry for entry in self.knowledge_base
            if entry.failure_count > 2 and 
            entry.failure_count > entry.success_count
        ]
        
        if problematic_entries:
            print(f"\n需要关注的知识点: {len(problematic_entries)}")
            for entry in problematic_entries[:3]:
                print(f"  - {entry.question[:40]}... (失败: {entry.failure_count})")

# 使用示例
if __name__ == "__main__":
    agent = RAGLearningAgent()
    
    # 初始化一些知识
    initial_knowledge = [
        ("如何安装Python?", 
         "可以从Python官网下载安装包,安装时记得勾选'Add Python to PATH'。",
         "Python安装常见问题"),
        ("什么是机器学习?",
         "机器学习是人工智能的一个分支,让计算机从数据中学习模式并做出预测。",
         "AI基础知识"),
        ("如何创建虚拟环境?",
         "使用命令 'python -m venv env_name' 创建虚拟环境。",
         "Python开发环境")
    ]
    
    for question, answer, context in initial_knowledge:
        agent.add_knowledge(question, answer, context)
    
    print("知识库初始化完成")
    print("-" * 50)
    
    # 测试查询
    test_queries = [
        "怎么安装Python环境?",
        "机器学习是什么?",
        "如何搭建开发环境?"
    ]
    
    for query in test_queries:
        print(f"\n用户查询: {query}")
        answer, retrieved = agent.generate_answer(query)
        print(f"回答: {answer}")
        
        if retrieved:
            print("相关知识点:")
            for info in retrieved:
                print(f"  - {info['question']} (相似度: {info['similarity']:.2f})")
    
    # 模拟学习过程
    print("\n=== 学习过程模拟 ===")
    
    # 用户提供反馈
    feedback = {
        "correct": False,
        "alternative_answer": "更好的方法是使用conda创建环境:conda create -n env_name python=3.9",
        "additional_context": "conda环境管理更加强大"
    }
    
    agent.learn_from_feedback("如何创建虚拟环境?", feedback)
    
    # 再次查询
    print("\n改进后的查询:")
    answer, _ = agent.generate_answer("创建Python虚拟环境的方法")
    print(f"回答: {answer}")
    
    # 分析知识库
    agent.analyze_knowledge_base()

4. 推荐 Agent

python 复制代码
# recommendation_agent.py
import numpy as np
from typing import List, Dict, Any
from collections import defaultdict
from dataclasses import dataclass, field
import json

@dataclass
class UserPreference:
    user_id: str
    item_preferences: Dict[str, float] = field(default_factory=dict)  # item_id -> score
    category_weights: Dict[str, float] = field(default_factory=dict)  # category -> weight
    context_preferences: Dict[str, float] = field(default_factory=dict)  # context -> weight
    
    def update_preference(self, item_id: str, rating: float, item_categories: List[str], context: str):
        """更新用户偏好"""
        # 更新物品偏好
        if item_id in self.item_preferences:
            # 平滑更新
            self.item_preferences[item_id] = 0.7 * self.item_preferences[item_id] + 0.3 * rating
        else:
            self.item_preferences[item_id] = rating
        
        # 更新分类权重
        for category in item_categories:
            if category in self.category_weights:
                self.category_weights[category] += rating * 0.1
            else:
                self.category_weights[category] = rating * 0.1
        
        # 更新上下文偏好
        if context in self.context_preferences:
            self.context_preferences[context] += rating * 0.05
        else:
            self.context_preferences[context] = rating * 0.05
        
        # 归一化权重
        total = sum(self.category_weights.values())
        if total > 0:
            for category in self.category_weights:
                self.category_weights[category] /= total

class AdaptiveRecommendationAgent:
    def __init__(self):
        self.user_profiles: Dict[str, UserPreference] = {}
        self.item_catalog: Dict[str, Dict] = {}
        
        # 协同过滤矩阵
        self.user_item_matrix = {}
        self.similarity_cache = {}
        
    def add_item(self, item_id: str, categories: List[str], features: Dict[str, Any]):
        """添加物品到目录"""
        self.item_catalog[item_id] = {
            "categories": categories,
            "features": features,
            "popularity": 0,
            "avg_rating": 0.0,
            "rating_count": 0
        }
    
    def record_interaction(self, user_id: str, item_id: str, rating: float, context: str = "default"):
        """记录用户交互"""
        if user_id not in self.user_profiles:
            self.user_profiles[user_id] = UserPreference(user_id)
        
        user = self.user_profiles[user_id]
        item = self.item_catalog.get(item_id, {})
        
        if item:
            categories = item.get("categories", [])
            user.update_preference(item_id, rating, categories, context)
            
            # 更新物品统计
            item["popularity"] += 1
            item["rating_count"] += 1
            item["avg_rating"] = (
                (item["avg_rating"] * (item["rating_count"] - 1) + rating) / 
                item["rating_count"]
            )
    
    def calculate_similarity(self, user1_id: str, user2_id: str) -> float:
        """计算用户相似度"""
        user1 = self.user_profiles.get(user1_id)
        user2 = self.user_profiles.get(user2_id)
        
        if not user1 or not user2:
            return 0.0
        
        # 获取共同评分物品
        common_items = set(user1.item_preferences.keys()) & set(user2.item_preferences.keys())
        
        if not common_items:
            return 0.0
        
        # 计算余弦相似度
        scores1 = [user1.item_preferences[item] for item in common_items]
        scores2 = [user2.item_preferences[item] for item in common_items]
        
        dot_product = sum(s1 * s2 for s1, s2 in zip(scores1, scores2))
        norm1 = np.sqrt(sum(s * s for s in scores1))
        norm2 = np.sqrt(sum(s * s for s in scores2))
        
        if norm1 * norm2 == 0:
            return 0.0
        
        return dot_product / (norm1 * norm2)
    
    def get_collaborative_recommendations(self, user_id: str, top_n: int = 10) -> List[str]:
        """基于协同过滤的推荐"""
        if user_id not in self.user_profiles:
            return []
        
        user = self.user_profiles[user_id]
        user_items = set(user.item_preferences.keys())
        
        # 计算与其他用户的相似度
        similarities = []
        for other_user_id in self.user_profiles:
            if other_user_id != user_id:
                sim = self.calculate_similarity(user_id, other_user_id)
                if sim > 0.3:  # 相似度阈值
                    similarities.append((other_user_id, sim))
        
        # 找出相似用户喜欢的物品
        item_scores = defaultdict(float)
        item_weights = defaultdict(float)
        
        for other_user_id, similarity in similarities[:20]:  # 取前20个相似用户
            other_user = self.user_profiles[other_user_id]
            
            for item_id, rating in other_user.item_preferences.items():
                if item_id not in user_items:  # 用户没看过的
                    item_scores[item_id] += rating * similarity
                    item_weights[item_id] += similarity
        
        # 计算加权平均分
        for item_id in item_scores:
            if item_weights[item_id] > 0:
                item_scores[item_id] /= item_weights[item_id]
        
        # 按分数排序
        sorted_items = sorted(item_scores.items(), key=lambda x: x[1], reverse=True)
        return [item_id for item_id, _ in sorted_items[:top_n]]
    
    def get_content_based_recommendations(self, user_id: str, context: str = "default", top_n: int = 10) -> List[str]:
        """基于内容的推荐"""
        if user_id not in self.user_profiles:
            return []
        
        user = self.user_profiles[user_id]
        user_items = set(user.item_preferences.keys())
        
        item_scores = {}
        
        for item_id, item_data in self.item_catalog.items():
            if item_id in user_items:
                continue
            
            score = 0.0
            
            # 基于分类的分数
            categories = item_data.get("categories", [])
            for category in categories:
                score += user.category_weights.get(category, 0.1) * 0.5
            
            # 基于上下文的分数
            score += user.context_preferences.get(context, 0.5) * 0.3
            
            # 基于流行度的分数(探索新物品)
            popularity = item_data.get("popularity", 0)
            if popularity < 10:  # 冷启动物品
                score += 0.2
            
            # 基于评分的分数
            avg_rating = item_data.get("avg_rating", 0.0)
            score += avg_rating * 0.4
            
            item_scores[item_id] = score
        
        # 按分数排序
        sorted_items = sorted(item_scores.items(), key=lambda x: x[1], reverse=True)
        return [item_id for item_id, _ in sorted_items[:top_n]]
    
    def hybrid_recommendation(self, user_id: str, context: str = "default", 
                             top_n: int = 10, collaborative_weight: float = 0.6) -> List[str]:
        """混合推荐算法"""
        # 获取两种推荐结果
        collab_recs = self.get_collaborative_recommendations(user_id, top_n * 2)
        content_recs = self.get_content_based_recommendations(user_id, context, top_n * 2)
        
        # 合并和去重
        all_recs = {}
        
        # 协同过滤结果
        for i, item_id in enumerate(collab_recs):
            score = (len(collab_recs) - i) / len(collab_recs) * collaborative_weight
            all_recs[item_id] = all_recs.get(item_id, 0) + score
        
        # 基于内容的结果
        for i, item_id in enumerate(content_recs):
            score = (len(content_recs) - i) / len(content_recs) * (1 - collaborative_weight)
            all_recs[item_id] = all_recs.get(item_id, 0) + score
        
        # 基于用户偏好调整
        user = self.user_profiles.get(user_id)
        if user:
            for item_id in all_recs:
                # 检查物品分类是否符合用户偏好
                item = self.item_catalog.get(item_id, {})
                categories = item.get("categories", [])
                
                for category in categories:
                    if category in user.category_weights:
                        all_recs[item_id] += user.category_weights[category] * 0.1
        
        # 最终排序
        sorted_recs = sorted(all_recs.items(), key=lambda x: x[1], reverse=True)
        
        return [item_id for item_id, _ in sorted_recs[:top_n]]
    
    def adapt_to_feedback(self, user_id: str, recommended_items: List[str], 
                         feedback: Dict[str, float]):
        """根据反馈自适应调整"""
        if user_id not in self.user_profiles:
            return
        
        user = self.user_profiles[user_id]
        
        for item_id, rating in feedback.items():
            if item_id in self.item_catalog:
                item = self.item_catalog[item_id]
                categories = item.get("categories", [])
                
                # 更新偏好
                user.update_preference(item_id, rating, categories, "default")
                
                # 如果评分低,降低类似物品的推荐权重
                if rating < 0.3:
                    for category in categories:
                        if category in user.category_weights:
                            user.category_weights[category] *= 0.8  # 降低权重
        
        # 调整混合权重
        avg_feedback = sum(feedback.values()) / len(feedback) if feedback else 0.5
        if avg_feedback > 0.7:
            print(f"用户 {user_id} 反馈积极,增加个性化权重")
        elif avg_feedback < 0.3:
            print(f"用户 {user_id} 反馈消极,增加多样性")

# 使用示例
if __name__ == "__main__":
    # 创建推荐系统
    recommender = AdaptiveRecommendationAgent()
    
    # 添加一些电影到目录
    movies = [
        ("movie_1", ["Action", "Sci-Fi"], {"year": 2020, "director": "Nolan"}),
        ("movie_2", ["Comedy", "Romance"], {"year": 2019, "director": "Gerwig"}),
        ("movie_3", ["Drama", "Biography"], {"year": 2018, "director": "Cuarón"}),
        ("movie_4", ["Action", "Adventure"], {"year": 2021, "director": "Villeneuve"}),
        ("movie_5", ["Comedy", "Animation"], {"year": 2022, "director": "Lord"}),
        ("movie_6", ["Horror", "Thriller"], {"year": 2020, "director": "Peele"}),
        ("movie_7", ["Action", "Fantasy"], {"year": 2019, "director": "Watiti"}),
        ("movie_8", ["Drama", "Romance"], {"year": 2021, "director": "Coppola"}),
    ]
    
    for movie_id, categories, features in movies:
        recommender.add_item(movie_id, categories, features)
    
    # 模拟用户交互历史
    print("模拟用户交互...")
    
    # 用户1: 喜欢动作片
    recommender.record_interaction("user_1", "movie_1", 0.9)
    recommender.record_interaction("user_1", "movie_4", 0.8)
    recommender.record_interaction("user_1", "movie_7", 0.7)
    
    # 用户2: 喜欢喜剧片
    recommender.record_interaction("user_2", "movie_2", 0.9)
    recommender.record_interaction("user_2", "movie_5", 0.8)
    recommender.record_interaction("user_2", "movie_3", 0.6)
    
    # 用户3: 混合偏好
    recommender.record_interaction("user_3", "movie_1", 0.7)
    recommender.record_interaction("user_3", "movie_2", 0.8)
    recommender.record_interaction("user_3", "movie_6", 0.4)  # 不喜欢恐怖片
    
    # 为用户1生成推荐
    print("\n为用户1生成推荐:")
    recommendations = recommender.hybrid_recommendation("user_1", "weekend", top_n=3)
    
    print("推荐电影:")
    for i, movie_id in enumerate(recommendations, 1):
        movie = recommender.item_catalog.get(movie_id, {})
        categories = movie.get("categories", [])
        print(f"{i}. ID: {movie_id}, 分类: {categories}")
    
    # 模拟用户反馈
    print("\n模拟用户反馈...")
    feedback = {
        recommendations[0]: 0.2,  # 不喜欢第一个推荐
        recommendations[1]: 0.9,  # 喜欢第二个推荐
        recommendations[2]: 0.6   # 一般般
    }
    
    recommender.adapt_to_feedback("user_1", recommendations, feedback)
    
    # 再次生成推荐(应该会调整)
    print("\n自适应调整后的推荐:")
    new_recommendations = recommender.hybrid_recommendation("user_1", "weekend", top_n=3)
    
    print("新推荐:")
    for i, movie_id in enumerate(new_recommendations, 1):
        movie = recommender.item_catalog.get(movie_id, {})
        categories = movie.get("categories", [])
        print(f"{i}. ID: {movie_id}, 分类: {categories}")

5. 完整集成示例 - 智能应用 Agent

python 复制代码
# smart_app_agent.py
import asyncio
from typing import Optional, Dict, Any
from dataclasses import dataclass
from enum import Enum

class UserExpertise(Enum):
    BEGINNER = "beginner"
    INTERMEDIATE = "intermediate"
    EXPERT = "expert"

class TaskComplexity(Enum):
    SIMPLE = "simple"
    MODERATE = "moderate"
    COMPLEX = "complex"

@dataclass
class UserBehavior:
    user_id: str
    action_sequence: list
    time_spent: Dict[str, float]  # feature -> seconds
    error_count: Dict[str, int]
    help_requests: int
    success_rate: float

class AdaptiveAppAgent:
    def __init__(self):
        self.user_behaviors: Dict[str, UserBehavior] = {}
        self.interface_configs = {
            "beginner": {
                "show_tooltips": True,
                "simplified_ui": True,
                "step_by_step_guide": True,
                "advanced_features_hidden": True
            },
            "intermediate": {
                "show_tooltips": False,
                "simplified_ui": False,
                "step_by_step_guide": False,
                "advanced_features_hidden": False
            },
            "expert": {
                "show_tooltips": False,
                "simplified_ui": False,
                "step_by_step_guide": False,
                "advanced_features_hidden": False,
                "keyboard_shortcuts": True,
                "batch_operations": True
            }
        }
        
    def analyze_expertise(self, user_id: str) -> UserExpertise:
        """分析用户熟练度"""
        if user_id not in self.user_behaviors:
            return UserExpertise.BEGINNER
        
        behavior = self.user_behaviors[user_id]
        
        # 基于多个指标评估
        score = 0
        
        # 成功率权重
        score += behavior.success_rate * 40
        
        # 帮助请求权重(越少越好)
        if behavior.help_requests == 0:
            score += 30
        elif behavior.help_requests < 5:
            score += 20
        elif behavior.help_requests < 10:
            score += 10
        
        # 错误率权重(越少越好)
        total_errors = sum(behavior.error_count.values())
        if total_errors == 0:
            score += 30
        elif total_errors < 5:
            score += 20
        elif total_errors < 10:
            score += 10
        
        # 根据分数分类
        if score >= 80:
            return UserExpertise.EXPERT
        elif score >= 50:
            return UserExpertise.INTERMEDIATE
        else:
            return UserExpertise.BEGINNER
    
    def adapt_interface(self, user_id: str, task: TaskComplexity):
        """自适应调整界面"""
        expertise = self.analyze_expertise(user_id)
        config = self.interface_configs[expertise.value].copy()
        
        # 根据任务复杂度进一步调整
        if task == TaskComplexity.COMPLEX and expertise != UserExpertise.EXPERT:
            config["show_tooltips"] = True
            config["step_by_step_guide"] = True
        
        return config
    
    def record_behavior(self, user_id: str, action: str, 
                       feature: str, success: bool, time_spent: float):
        """记录用户行为"""
        if user_id not in self.user_behaviors:
            self.user_behaviors[user_id] = UserBehavior(
                user_id=user_id,
                action_sequence=[],
                time_spent={},
                error_count={},
                help_requests=0,
                success_rate=0.0
            )
        
        behavior = self.user_behaviors[user_id]
        behavior.action_sequence.append(action)
        
        # 记录时间花费
        behavior.time_spent[feature] = behavior.time_spent.get(feature, 0) + time_spent
        
        # 记录错误
        if not success:
            behavior.error_count[feature] = behavior.error_count.get(feature, 0) + 1
        
        # 计算成功率
        total_actions = len(behavior.action_sequence)
        successful_actions = total_actions - sum(behavior.error_count.values())
        behavior.success_rate = successful_actions / total_actions if total_actions > 0 else 0.0
    
    def get_personalized_help(self, user_id: str, feature: str) -> str:
        """提供个性化帮助"""
        if user_id not in self.user_behaviors:
            return "欢迎使用!这是基础帮助..."
        
        behavior = self.user_behaviors[user_id]
        expertise = self.analyze_expertise(user_id)
        
        # 根据熟练度提供不同层次的帮助
        if expertise == UserExpertise.BEGINNER:
            help_text = f"""
            欢迎使用{feature}功能!
            1. 首先点击这里
            2. 然后选择选项
            3. 最后确认完成
            
            提示:完成这个操作通常需要30秒左右。
            """
        elif expertise == UserExpertise.INTERMEDIATE:
            help_text = f"""
            {feature}功能说明:
            - 主要用途:数据导入
            - 快捷键:Ctrl+I
            - 常见问题:确保文件格式正确
            
            您已经使用过这个功能{behavior.time_spent.get(feature, 0):.0f}秒。
            """
        else:  # EXPERT
            help_text = f"""
            高级{feature}配置:
            - 批量处理:支持最多1000个文件
            - API接口:/api/v1/{feature}
            - 性能优化:建议使用缓存
            
            统计:平均处理时间 {behavior.time_spent.get(feature, 0)/max(1, len([a for a in behavior.action_sequence if feature in a])):.1f}秒
            """
        
        # 如果用户在这个功能上经常出错,添加特别提示
        if feature in behavior.error_count and behavior.error_count[feature] > 2:
            help_text += f"\n⚠️ 注意:您在这个功能上遇到了{behavior.error_count[feature]}次错误,建议检查输入格式。"
        
        return help_text
    
    def predict_user_needs(self, user_id: str) -> list:
        """预测用户可能需要什么"""
        if user_id not in self.user_behaviors:
            return ["完成设置向导", "浏览主要功能"]
        
        behavior = self.user_behaviors[user_id]
        expertise = self.analyze_expertise(user_id)
        
        suggestions = []
        
        # 基于行为模式
        if len(behavior.action_sequence) < 5:
            suggestions.append("尝试数据分析功能")
        elif "export" not in behavior.action_sequence:
            suggestions.append("学习数据导出")
        
        # 基于时间花费
        slowest_feature = max(behavior.time_spent.items(), key=lambda x: x[1], default=(None, 0))[0]
        if slowest_feature:
            suggestions.append(f"优化{slowest_feature}的使用效率")
        
        # 基于错误
        most_error_feature = max(behavior.error_count.items(), key=lambda x: x[1], default=(None, 0))[0]
        if most_error_feature:
            suggestions.append(f"复习{most_error_feature}的操作")
        
        # 基于熟练度
        if expertise == UserExpertise.INTERMEDIATE:
            suggestions.append("尝试高级功能")
        elif expertise == UserExpertise.EXPERT:
            suggestions.append("配置自动化工作流")
        
        return suggestions[:3]  # 返回前3个建议

# 模拟应用使用场景
async def simulate_app_usage():
    agent = AdaptiveAppAgent()
    
    print("=== 智能应用Agent演示 ===")
    
    # 模拟用户使用应用
    user_id = "user_123"
    
    # 第一天:新手用户
    print("\n第1天:新手用户学习阶段")
    tasks = [
        ("登录", "auth", True, 5.0),
        ("创建项目", "project", True, 30.0),
        ("导入数据", "import", False, 60.0),  # 失败了
        ("寻求帮助", "help", True, 10.0),
        ("再次导入数据", "import", True, 30.0),
    ]
    
    for action, feature, success, time_spent in tasks:
        agent.record_behavior(user_id, action, feature, success, time_spent)
        
        if action == "寻求帮助":
            help_text = agent.get_personalized_help(user_id, "import")
            print(f"帮助系统:{help_text[:50]}...")
    
    expertise = agent.analyze_expertise(user_id)
    interface_config = agent.adapt_interface(user_id, TaskComplexity.MODERATE)
    print(f"用户熟练度:{expertise.value}")
    print(f"界面配置:{interface_config}")
    
    # 几天后:用户变得熟练
    print("\n第5天:用户变得熟练")
    for _ in range(10):
        agent.record_behavior(user_id, "数据分析", "analysis", True, 15.0)
        agent.record_behavior(user_id, "导出报告", "export", True, 10.0)
    
    expertise = agent.analyze_expertise(user_id)
    interface_config = agent.adapt_interface(user_id, TaskComplexity.COMPLEX)
    print(f"用户熟练度:{expertise.value}")
    print(f"界面配置:{interface_config}")
    
    # 获取个性化建议
    suggestions = agent.predict_user_needs(user_id)
    print(f"个性化建议:{suggestions}")
    
    # 获取高级帮助
    help_text = agent.get_personalized_help(user_id, "analysis")
    print(f"\n高级功能帮助:{help_text[:100]}...")

if __name__ == "__main__":
    asyncio.run(simulate_app_usage())

安装依赖

bash 复制代码
# 创建虚拟环境(如果还没创建)
python -m venv langchain_env
langchain_env\Scripts\activate

# 安装基础依赖
pip install numpy pandas

# 安装 RAG 相关
pip install sentence-transformers faiss-cpu

# 安装交易相关(可选)
pip install ta-lib  # 技术分析库(需要先安装TA-Lib的C库)

# 或者使用纯Python的替代
pip install pandas-ta

# 安装异步支持
pip install asyncio

# 如果遇到问题,先安装这些
pip install --upgrade pip setuptools wheel

这些 DEMO 展示了自适应 Agent 的核心概念:

  1. 个性化学习:从用户交互中学习偏好

  2. 动态调整:根据反馈和环境变化调整参数

  3. 记忆与适应:记住成功模式,避免失败陷阱

  4. 多策略融合:结合多种算法做出更好决策

每个 Agent 都可以进一步扩展:

  • 集成 LLM 进行自然语言理解

  • 添加更复杂的强化学习算法

  • 实现分布式学习和联邦学习

  • 增加安全性和隐私保护机制

你可以根据需要选择使用,也可以将这些模式组合起来创建更强大的自适应系统!

结论

本文探讨了学习和适应在人工智能中的关键作用。AI Agent 通过持续的数据获取和经验来增强其性能。自我 改进编码 Agent(SICA)通过代码修改自主改进其能力,很好地例证了这一点。 我们已经回顾了 Agent AI 的基本组成部分,包括架构、应用、规划、多 Agent 协作、内存管理以及学习和适 应。学习原理对于多 Agent 系统中的协调改进特别重要。为了实现这一点,调优数据必须准确反映完整的交互轨迹,捕获每个参与 Agent 的个体输入和输出。 这些元素促成了重大进展,如 Google 的 AlphaEvolve。这个 AI 系统通过 LLM、自动化评估和进化方法 独立发现和改进算法,推动科学研究和计算技术的进步。这些模式可以组合起来构建复杂的 AI 系统。像 AlphaEvolve 这样的发展表明,AI Agent 的自主算法发现和优化是可以实现的。

参考文献

  1. Sutton, R. S., & Barto, A. G. (2018). Reinforcement Learning: An Introduction. MIT Press.

  2. Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.

  3. Mitchell, T. M. (1997). Machine Learning. McGraw‑Hill.

  4. Proximal Policy Optimization Algorithms by John Schulman, Filip Wolski, Prafulla Dhariwal, Alec Radford, and Oleg Klimov. You can find it on arXiv: https://arxiv.org/abs/1707.06347

  5. Robeyns, M., Aitchison, L., & Szummer, M. (2025). A Self‑Improving Coding Agent. arXiv:2504.15228v2. https://arxiv.org/pdf/2504.15228 https://github.com/MaximeRobeyns/self_improving_coding _agent

  6. AlphaEvolve blog, https://deepmind.google/discover/blog/alphaevolve‑a‑gemini‑powered‑ coding‑agent‑for‑designing‑advanced‑algorithms/

  7. OpenEvolve, https://github.com/codelion/openevolve

相关推荐
Das11 小时前
【机器学习】05_决策树
人工智能·决策树·机器学习
学习3人组1 小时前
大模型轻量化调优(昇腾平台方向)岗位技术名词拆解
人工智能·python
知乎的哥廷根数学学派1 小时前
基于物理引导和不确定性量化的轻量化神经网络机械退化预测算法(Python)
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
拉普拉斯妖1082 小时前
DAY49 CBAM注意力
人工智能·深度学习
今晚努力早睡2 小时前
渗透学习总结
学习·安全·网络安全
jay神2 小时前
手势识别数据集 - 专业级目标检测训练数据
人工智能·深度学习·yolo·目标检测·计算机视觉
海绵宝宝de派小星2 小时前
AI发展简史与里程碑事件
人工智能·搜索引擎
海绵宝宝de派小星2 小时前
什么是人工智能?AI、机器学习、深度学习的关系
人工智能·深度学习·机器学习·ai
HaiLang_IT2 小时前
基于图像处理与注意力机制的输电线路绝缘子缺陷智能识别方法
图像处理·人工智能