Jupyter AI

2 智能体的感知和决策机制

📅发表日期: 2025-03-12

🏷️分类: AI智能体Agent

👁️阅读次数: 0

2.1 感知机制:智能体的"眼睛和耳朵"

感知是智能体了解环境的首要步骤,相当于人类的感官系统。优秀的感知机制使智能体能够获取准确、丰富的环境信息,为后续决策提供可靠基础。

2.1.1 感知的基本原理

感知过程通常包含以下步骤:

  1. 数据获取:通过传感器、API、用户输入等渠道获取原始数据
  2. 预处理:对原始数据进行清洗、标准化和格式转换
  3. 特征提取:从预处理数据中提取有价值的特征
  4. 状态表示:将提取的特征转化为内部状态表示

2.1.2 常见的感知模态

智能体可以具备多种感知模态,每种模态针对不同类型的环境信息:

  • 文本感知:处理自然语言输入,包括命令、问题或对话
  • 视觉感知:处理图像和视频数据,识别物体、场景和动作
  • 音频感知:处理声音信息,包括语音识别和环境声音分析
  • 数值感知:处理结构化数据,如传感器读数、市场数据等

2.1.3 感知模块的技术实现

文本感知实现

文本感知通常使用自然语言处理(NLP)技术:

import spacy

# 加载语言模型
nlp = spacy.load("zh_core_web_sm")

class TextPerception:
    def __init__(self):
        self.nlp = nlp
        
    def perceive(self, text_input):
        # 处理文本输入
        doc = self.nlp(text_input)
        
        # 提取实体
        entities = [(ent.text, ent.label_) for ent in doc.ents]
        
        # 提取关键词
        keywords = [token.text for token in doc if token.pos_ in ("NOUN", "VERB") and not token.is_stop]
        
        # 分析句子意图
        intent = self._analyze_intent(doc)
        
        return {
            "entities": entities,
            "keywords": keywords,
            "intent": intent,
            "original_text": text_input
        }
    
    def _analyze_intent(self, doc):
        # 简单意图分析逻辑
        if any(token.text.lower() in ("什么", "如何", "为什么") for token in doc):
            return "question"
        elif any(token.text.lower() in ("请", "帮忙", "需要") for token in doc):
            return "request"
        else:
            return "statement"

视觉感知实现

视觉感知通常使用计算机视觉技术:

import cv2
import numpy as np
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions

class VisionPerception:
    def __init__(self):
        # 加载预训练模型
        self.model = MobileNetV2(weights='imagenet')
        
    def perceive(self, image_path):
        # 读取图像
        image = cv2.imread(image_path)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        
        # 调整图像大小
        image = cv2.resize(image, (224, 224))
        
        # 预处理
        image = np.expand_dims(image, axis=0)
        image = preprocess_input(image)
        
        # 识别物体
        predictions = self.model.predict(image)
        decoded_predictions = decode_predictions(predictions, top=5)[0]
        
        # 返回识别结果
        return {
            "objects": [(label, float(score)) for _, label, score in decoded_predictions],
            "dominant_colors": self._extract_dominant_colors(cv2.imread(image_path)),
            "image_path": image_path
        }
    
    def _extract_dominant_colors(self, image, num_colors=3):
        # 转换为RGB
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        
        # 重塑图像
        pixels = image.reshape(-1, 3)
        
        # K-means聚类
        from sklearn.cluster import KMeans
        kmeans = KMeans(n_clusters=num_colors)
        kmeans.fit(pixels)
        
        # 返回主要颜色
        colors = kmeans.cluster_centers_.astype(int)
        return [tuple(color) for color in colors]

2.1.4 多模态感知融合

高级智能体通常需要整合多种感知模态的信息,这被称为多模态融合:

class MultimodalPerception:
    def __init__(self):
        self.text_perception = TextPerception()
        self.vision_perception = VisionPerception()
        
    def perceive(self, inputs):
        perceptions = {}
        
        # 处理文本输入
        if "text" in inputs:
            perceptions["text"] = self.text_perception.perceive(inputs["text"])
            
        # 处理图像输入
        if "image" in inputs:
            perceptions["vision"] = self.vision_perception.perceive(inputs["image"])
            
        # 融合感知信息
        fused_perception = self._fuse_perceptions(perceptions)
        
        return fused_perception
    
    def _fuse_perceptions(self, perceptions):
        # 简单的感知融合逻辑
        fused = {"confidence": {}, "entities": []}
        
        # 从文本中提取实体
        if "text" in perceptions:
            fused["entities"].extend(perceptions["text"]["entities"])
            
        # 从图像中提取对象
        if "vision" in perceptions:
            for obj, conf in perceptions["vision"]["objects"]:
                fused["entities"].append((obj, "OBJECT"))
                fused["confidence"][obj] = conf
                
        return fused

2.2 决策机制:智能体的"大脑"

决策机制是智能体的核心,负责基于感知信息和内部状态选择最佳行动。

2.2.1 决策的基本原理

决策过程通常包含以下步骤:

  1. 状态评估:分析当前环境状态和智能体内部状态
  2. 选项生成:生成可能的行动选项
  3. 选项评估:评估每个选项的价值或效用
  4. 行动选择:选择最优行动或行动序列

2.2.2 常见的决策策略

基于规则的决策

最简单的决策策略,使用预定义的规则:

class RuleBasedDecision:
    def __init__(self):
        # 定义决策规则
        self.rules = [
            {"condition": lambda state: "question" in state["intent"], 
             "action": "answer_question"},
            {"condition": lambda state: "request" in state["intent"], 
             "action": "fulfill_request"},
            {"condition": lambda state: "greeting" in state["intent"], 
             "action": "respond_greeting"},
            # 默认规则
            {"condition": lambda state: True, 
             "action": "default_response"}
        ]
        
    def decide(self, state):
        # 评估每条规则
        for rule in self.rules:
            if rule["condition"](state):
                return rule["action"]

基于效用的决策

评估每个行动的效用值:

class UtilityBasedDecision:
    def __init__(self):
        # 定义行动及其效用计算函数
        self.actions = {
            "answer_question": self._calculate_answer_utility,
            "fulfill_request": self._calculate_fulfillment_utility,
            "provide_information": self._calculate_information_utility,
            "ask_clarification": self._calculate_clarification_utility
        }
        
    def decide(self, state):
        # 计算每个行动的效用
        utilities = {}
        for action, utility_func in self.actions.items():
            utilities[action] = utility_func(state)
            
        # 选择效用最高的行动
        best_action = max(utilities, key=utilities.get)
        return best_action
    
    def _calculate_answer_utility(self, state):
        # 计算回答问题的效用
        confidence = state.get("confidence", 0)
        question_clarity = state.get("question_clarity", 0)
        return 0.7 * confidence + 0.3 * question_clarity
    
    # 其他效用计算函数...

基于搜索的决策

通过搜索可能的状态空间寻找最优行动序列:

class SearchBasedDecision:
    def __init__(self, search_depth=3):
        self.search_depth = search_depth
        self.state_transition_model = self._get_transition_model()
        self.reward_model = self._get_reward_model()
        
    def decide(self, state):
        # 使用简化的Minimax搜索
        best_action, _ = self._minimax_search(state, self.search_depth)
        return best_action
    
    def _minimax_search(self, state, depth):
        if depth == 0:
            return None, self._evaluate_state(state)
        
        best_value = float('-inf')
        best_action = None
        
        # 遍历所有可能的行动
        possible_actions = self._get_possible_actions(state)
        for action in possible_actions:
            # 预测下一个状态
            next_state = self._predict_next_state(state, action)
            
            # 递归搜索
            _, value = self._minimax_search(next_state, depth - 1)
            
            # 更新最佳行动
            if value > best_value:
                best_value = value
                best_action = action
                
        return best_action, best_value
    
    # 辅助函数...

2.2.3 基于机器学习的决策

现代智能体通常使用机器学习方法进行决策:

监督学习决策

from sklearn.ensemble import RandomForestClassifier
import numpy as np

class SupervisedLearningDecision:
    def __init__(self):
        # 创建分类器
        self.classifier = RandomForestClassifier()
        # 行动映射
        self.action_map = {
            0: "answer_question",
            1: "fulfill_request",
            2: "provide_information",
            3: "ask_clarification"
        }
        
    def train(self, states, actions):
        # 将状态转换为特征向量
        X = [self._state_to_features(state) for state in states]
        # 将行动转换为类别标签
        y = [self._action_to_label(action) for action in actions]
        
        # 训练分类器
        self.classifier.fit(X, y)
        
    def decide(self, state):
        # 将状态转换为特征向量
        features = self._state_to_features(state)
        
        # 预测行动类别
        action_label = self.classifier.predict([features])[0]
        
        # 返回行动
        return self.action_map[action_label]
    
    def _state_to_features(self, state):
        # 将状态转换为特征向量的逻辑
        features = []
        
        # 添加意图特征
        intent_features = [0] * 4  # 假设有4种可能的意图
        intent = state.get("intent", "unknown")
        if intent == "question":
            intent_features[0] = 1
        elif intent == "request":
            intent_features[1] = 1
        elif intent == "greeting":
            intent_features[2] = 1
        else:
            intent_features[3] = 1
        
        features.extend(intent_features)
        
        # 添加置信度特征
        features.append(state.get("confidence", 0))
        
        # 添加实体数量特征
        features.append(len(state.get("entities", [])))
        
        return features
    
    def _action_to_label(self, action):
        # 将行动转换为标签
        for label, act in self.action_map.items():
            if act == action:
                return label
        return 0  # 默认标签

强化学习决策

import numpy as np
import random

class QLearningDecision:
    def __init__(self, state_size, action_size, learning_rate=0.1, discount_factor=0.9, exploration_rate=0.1):
        self.state_size = state_size
        self.action_size = action_size
        self.learning_rate = learning_rate
        self.discount_factor = discount_factor
        self.exploration_rate = exploration_rate
        
        # 初始化Q表
        self.q_table = np.zeros((state_size, action_size))
        
        # 行动映射
        self.action_map = {
            0: "answer_question",
            1: "fulfill_request",
            2: "provide_information",
            3: "ask_clarification"
        }
        
    def decide(self, state):
        # 将状态转换为状态索引
        state_index = self._state_to_index(state)
        
        # ε-贪心策略
        if random.random() < self.exploration_rate:
            # 探索:随机选择行动
            action_index = random.randint(0, self.action_size - 1)
        else:
            # 利用:选择Q值最高的行动
            action_index = np.argmax(self.q_table[state_index])
            
        # 返回选定的行动
        return self.action_map[action_index]
    
    def learn(self, state, action, reward, next_state):
        # 将状态和行动转换为索引
        state_index = self._state_to_index(state)
        action_index = self._action_to_index(action)
        next_state_index = self._state_to_index(next_state)
        
        # 当前Q值
        current_q = self.q_table[state_index, action_index]
        
        # 最大下一状态Q值
        max_next_q = np.max(self.q_table[next_state_index])
        
        # 计算新Q值
        new_q = current_q + self.learning_rate * (reward + self.discount_factor * max_next_q - current_q)
        
        # 更新Q表
        self.q_table[state_index, action_index] = new_q
    
    def _state_to_index(self, state):
        # 将状态转换为索引的逻辑
        # 简化实现,实际应用需要更复杂的状态编码
        intent = state.get("intent", "unknown")
        confidence = min(int(state.get("confidence", 0) * 10), 9)
        
        if intent == "question":
            intent_code = 0
        elif intent == "request":
            intent_code = 1
        elif intent == "greeting":
            intent_code = 2
        else:
            intent_code = 3
            
        # 组合成状态索引
        return intent_code * 10 + confidence
    
    def _action_to_index(self, action):
        # 将行动转换为索引
        for index, act in self.action_map.items():
            if act == action:
                return index
        return 0  # 默认索引

2.3 构建简单智能体:整合感知和决策

现在,我们将感知和决策模块整合为一个简单的智能体:

class SimpleAgent:
    def __init__(self):
        # 初始化感知模块
        self.perception = MultimodalPerception()
        
        # 初始化决策模块
        self.decision = RuleBasedDecision()
        
        # 初始化行动映射
        self.actions = {
            "answer_question": self._answer_question,
            "fulfill_request": self._fulfill_request,
            "respond_greeting": self._respond_greeting,
            "default_response": self._default_response
        }
        
    def perceive_and_act(self, inputs):
        # 感知
        perception_result = self.perception.perceive(inputs)
        
        # 决策
        action_name = self.decision.decide(perception_result)
        
        # 执行
        action_func = self.actions.get(action_name, self._default_response)
        response = action_func(perception_result)
        
        return response
    
    # 行动实现
    def _answer_question(self, perception):
        # 回答问题的逻辑
        return f"我尝试回答关于{', '.join([e[0] for e in perception.get('entities', [])])}的问题。"
    
    def _fulfill_request(self, perception):
        # 满足请求的逻辑
        return "我会尝试满足您的请求。"
    
    def _respond_greeting(self, perception):
        # 回应问候的逻辑
        return "您好!很高兴为您服务。"
    
    def _default_response(self, perception):
        # 默认响应
        return "我理解您的输入,但不确定如何回应。请提供更多信息。"

2.4 实例:构建聊天智能体

让我们使用上述概念构建一个简单的聊天智能体:

class ChatAgent:
    def __init__(self):
        self.name = "小助手"
        self.text_perception = TextPerception()
        self.decision = RuleBasedDecision()
        self.knowledge_base = {
            "天气": "今天天气晴朗,温度25°C。",
            "时间": "现在是下午3点。",
            "你是谁": f"我是{self.name},一个AI助手。"
        }
        
    def chat(self, user_input):
        # 感知用户输入
        perception = self.text_perception.perceive(user_input)
        
        # 简单的状态构建
        state = {
            "intent": perception["intent"],
            "keywords": perception["keywords"],
            "entities": perception["entities"],
            "original_text": perception["original_text"]
        }
        
        # 决策
        action = self.decide(state)
        
        # 执行行动并返回响应
        return self.execute_action(action, state)
    
    def decide(self, state):
        # 简化的规则决策
        if "你是谁" in state["original_text"] or "你叫什么" in state["original_text"]:
            return "self_introduction"
        
        for keyword in state["keywords"]:
            if keyword in self.knowledge_base:
                return "provide_knowledge"
        
        if state["intent"] == "question":
            return "answer_unknown_question"
        
        return "default_response"
    
    def execute_action(self, action, state):
        if action == "self_introduction":
            return self.knowledge_base["你是谁"]
        
        elif action == "provide_knowledge":
            for keyword in state["keywords"]:
                if keyword in self.knowledge_base:
                    return self.knowledge_base[keyword]
            
        elif action == "answer_unknown_question":
            return f"很抱歉,我没有关于{', '.join(state['keywords'][:2])}的信息。"
        
        return "我理解您的意思,请告诉我更多信息。"

使用示例

# 创建聊天智能体
chat_agent = ChatAgent()

# 与智能体交互
responses = []
responses.append(chat_agent.chat("你好,你是谁?"))
responses.append(chat_agent.chat("今天天气怎么样?"))
responses.append(chat_agent.chat("现在几点了?"))
responses.append(chat_agent.chat("如何学习人工智能?"))

# 打印对话
for i, response in enumerate(responses):
    print(f"用户输入: {['你好,你是谁?', '今天天气怎么样?', '现在几点了?', '如何学习人工智能?'][i]}")
    print(f"智能体: {response}")
    print("-" * 50)

2.5 总结与下一步

本章详细介绍了智能体的感知和决策机制,这是智能体运作的两个核心环节。我们学习了:

  1. 感知模块如何获取和处理环境信息
  2. 决策模块如何基于感知结果选择最佳行动
  3. 如何整合感知和决策构建完整的智能体

在实际应用中,智能体的设计需要根据具体任务和环境特性进行定制。随着任务复杂性增加,可能需要更先进的感知和决策算法。

在下一章中,我们将深入探讨智能体的记忆系统和学习机制,这将使智能体能够从经验中学习,不断提升自身性能。

💬 评论

暂无评论