当前位置: 首页 > news >正文

LangGraph中ReAct模式的深度解析:推理与行动的完美融合——从理论到实践的智能Agent构建指南

在人工智能的演进历程中,ReAct(Reasoning and Acting)模式无疑是最具革命性的突破之一。它不仅仅是一种技术实现,更是对智能Agent思维模式的深刻重构。而LangGraph,作为这一理念的优秀实践者,将ReAct模式演绎得淋漓尽致。

引言:从"思考"到"行动"的哲学跃迁

还记得人类是如何解决复杂问题的吗?我们不会一次性给出答案,而是:观察问题 → 思考分析 → 采取行动 → 观察结果 → 重新思考 → 继续行动。这种"思考-行动-观察"的循环模式,正是ReAct模式的核心理念。

在传统的AI系统中,推理(Reasoning)和行动(Acting)往往被割裂开来。要么是纯粹的思考机器,要么是机械的执行工具。而ReAct模式的天才之处在于,它将这两者有机地融合在一起,创造出了真正具有智能的Agent系统。

第一章:ReAct模式的理论基础——从Chain-of-Thought到Reasoning-and-Acting

1.1 思维链的局限性

Chain-of-Thought(CoT)推理模式在很多场景下表现出色,但它有一个致命的弱点:封闭性。CoT就像一个沉浸在自己世界中的哲学家,只能基于已有的知识进行推理,无法获取新的信息。

# Chain-of-Thought的局限性示例
prompt = """
问题:今天北京的天气如何?思维链:
1. 这是一个关于天气的问题
2. 我需要知道北京今天的具体天气情况
3. 但是我没有实时的天气数据
4. 我无法准确回答这个问题结论:抱歉,我无法提供今天北京的实时天气信息。
"""

这种推理模式的问题在于,它只能在"已知"的范围内进行思考,一旦涉及需要外部信息的问题,就会陷入困境。

1.2 ReAct的革命性突破

ReAct模式的出现,彻底打破了这种局限性。它引入了一个关键概念:工具调用(Tool Calling)。通过工具调用,Agent可以主动获取外部信息,将静态的推理转变为动态的交互。

# ReAct模式的思维过程
"""
思考:用户问今天北京的天气,我需要获取实时天气信息。
行动:调用天气查询工具
观察:北京今天晴转多云,温度15-25°C,空气质量良好
思考:现在我有了准确的天气信息,可以给出完整的回答。
行动:回复用户
"""

这种模式的核心价值在于:

  • 动态信息获取:能够实时获取外部数据

  • 迭代式推理:每次行动后都会重新评估和思考

  • 工具协同:多种工具的灵活组合使用

  • 自我纠错:基于观察结果调整后续策略

1.3 认知科学的支撑

ReAct模式的设计理念与人类的认知过程高度吻合。认知科学研究表明,人类的问题解决过程本质上就是一个"计划-执行-监控-调整"的循环:

  1. 计划阶段:分析问题,制定初步策略

  2. 执行阶段:采取具体行动

  3. 监控阶段:观察行动结果

  4. 调整阶段:基于反馈调整策略

ReAct模式完美地模拟了这一过程,使得AI Agent具备了更接近人类的智能表现。

第二章:LangGraph中ReAct的架构设计——工程化的智慧结晶

2.1 核心组件解析

LangGraph中的ReAct实现主要由三个核心组件构成:

2.1.1 Agent节点:思考的大脑
def call_model(state: StateSchema, runtime: Runtime[ContextT], config: RunnableConfig
) -> StateSchema:"""Agent节点:负责推理和决策1. 接收当前状态(包含对话历史)2. 通过LLM进行推理3. 决定下一步行动(继续对话或调用工具)"""# 获取对话历史model_input = _get_model_input_state(state)# 动态模型选择(支持运行时模型切换)if is_dynamic_model:dynamic_model = _resolve_model(state, runtime)response = dynamic_model.invoke(model_input, config)else:response = static_model.invoke(model_input, config)# 检查是否需要更多步骤if _are_more_steps_needed(state, response):return {"messages": [AIMessage(content="Sorry, need more steps to process this request.")]}return {"messages": [response]}

Agent节点的设计精髓在于其状态感知能力。它不仅能够分析当前的对话内容,还能感知执行状态(如剩余步数、工具执行结果等),从而做出最优决策。

2.1.2 工具节点:行动的手臂
class ToolNode(RunnableCallable):"""工具执行节点:负责具体行动的执行特点:- 支持并行工具调用- 错误处理和重试机制- 工具参数注入和验证"""def __init__(self, tools: Sequence[Union[BaseTool, Callable]]):self.tools_by_name = {tool.name: tool for tool in tools}def invoke(self, input: ToolNodeInput) -> dict[str, list[BaseMessage]]:"""执行工具调用并返回结果"""tool_calls = input["messages"][-1].tool_calls# 并行执行所有工具调用tool_messages = []for tool_call in tool_calls:tool = self.tools_by_name[tool_call["name"]]try:# 执行工具result = tool.invoke(tool_call["args"])tool_messages.append(ToolMessage(content=str(result),tool_call_id=tool_call["id"],name=tool_call["name"]))except Exception as e:# 错误处理tool_messages.append(ToolMessage(content=f"Error: {str(e)}",tool_call_id=tool_call["id"],name=tool_call["name"]))return {"messages": tool_messages}

ToolNode的设计亮点包括:

  • 并行执行:多个工具调用可以同时进行,提高效率

  • 错误隔离:单个工具失败不会影响其他工具的执行

  • 结果标准化:所有工具结果都统一封装为ToolMessage

2.1.3 条件路由:决策的导航
def should_continue(state: StateSchema) -> Union[str, list[Send]]:"""决策路由函数:判断下一步应该执行什么逻辑流程:1. 检查最后一条消息是否包含工具调用2. 如果有工具调用 → 路由到工具节点3. 如果没有工具调用 → 结束或进入后处理"""messages = _get_state_value(state, "messages")last_message = messages[-1]# 检查是否有工具调用if not isinstance(last_message, AIMessage) or not last_message.tool_calls:# 没有工具调用,检查是否需要后处理if post_model_hook is not None:return "post_model_hook"elif response_format is not None:return "generate_structured_response"else:return ENDelse:# 有工具调用,路由到工具节点if version == "v1":# v1版本:批量处理所有工具调用return "tools"elif version == "v2":# v2版本:使用Send API分发工具调用tool_calls = [tool_node.inject_tool_args(call, state, store)for call in last_message.tool_calls]return [Send("tools", [tool_call]) for tool_call in tool_calls]

这个路由函数是ReAct模式的"神经中枢",它决定了Agent的执行流程。其设计理念体现了几个重要原则:

  1. 状态驱动:基于当前状态做决策,而非预设流程

  2. 灵活路由:支持多种执行路径(工具调用、后处理、结构化输出等)

  3. 版本兼容:v1和v2版本的不同处理策略

2.2 状态管理的艺术

LangGraph中的ReAct实现采用了精巧的状态管理机制:

class AgentState(TypedDict):"""ReAct Agent的状态定义"""# 核心状态:对话历史messages: Annotated[Sequence[BaseMessage], add_messages]# 执行控制:剩余步数remaining_steps: NotRequired[RemainingSteps]# 可选扩展:结构化响应structured_response: NotRequired[StructuredResponse]
2.2.1 消息流管理

add_messages reducer函数是状态管理的核心,它实现了智能的消息合并策略:

def add_messages(left: Messages, right: Messages) -> Messages:"""智能消息合并函数特性:- 支持消息更新(基于ID)- 保持时间顺序- 处理消息删除- 格式标准化"""# 构建消息ID映射left_idx_by_id = {m.id: i for i, m in enumerate(left) if m.id}merged = list(left)for message in right:if isinstance(message, RemoveMessage):# 处理消息删除if message.id in left_idx_by_id:merged.pop(left_idx_by_id[message.id])elif message.id and message.id in left_idx_by_id:# 更新已存在的消息merged[left_idx_by_id[message.id]] = messageelse:# 添加新消息merged.append(message)return merged

这种设计使得ReAct Agent具备了强大的对话管理能力:

  • 消息更新:可以修正之前的响应

  • 错误恢复:可以删除错误的消息

  • 状态一致性:确保消息流的逻辑完整性

2.2.2 步数控制机制
def _are_more_steps_needed(state: StateSchema, response: BaseMessage) -> bool:"""智能步数控制:防止无限循环判断逻辑:1. 检查是否有工具调用2. 检查剩余步数3. 考虑工具的return_direct属性"""has_tool_calls = isinstance(response, AIMessage) and response.tool_callsall_tools_return_direct = (all(call["name"] in should_return_direct for call in response.tool_calls)if isinstance(response, AIMessage) else False)remaining_steps = _get_state_value(state, "remaining_steps", None)if remaining_steps is not None:if remaining_steps < 1 and all_tools_return_direct:return Trueelif remaining_steps < 2 and has_tool_calls:return Truereturn False

这种步数控制机制体现了工程化的智慧:

  • 防止死循环:避免Agent陷入无限的工具调用循环

  • 优雅降级:步数不足时提供友好的错误信息

  • 性能保护:防止资源消耗过度

第三章:ReAct的执行流程——思维的舞蹈

3.1 完整执行流程解析

让我们通过一个具体的例子来理解ReAct的执行流程:

# 用户问题:今天北京的天气如何,如果下雨的话推荐一些室内活动# === 第一轮循环 ===
# Step 1: Agent推理
"""
用户询问北京天气,并且想要室内活动推荐。
我需要先查询天气信息,然后根据天气情况提供建议。
"""# Step 2: Agent决策(生成工具调用)
AIMessage(content="我来帮您查询北京今天的天气情况。",tool_calls=[{"name": "get_weather","args": {"city": "北京", "date": "today"},"id": "call_1"}]
)# Step 3: 路由决策
should_continue() → "tools"  # 有工具调用,路由到工具节点# Step 4: 工具执行
get_weather(city="北京", date="today")
# 返回:ToolMessage(content="北京今天多云转雨,气温18-25°C,降水概率80%")# === 第二轮循环 ===
# Step 5: Agent再次推理
"""
现在我知道了北京今天会下雨,降水概率80%。
用户询问如果下雨的话推荐室内活动,我需要提供一些好的建议。
"""# Step 6: Agent最终回复
AIMessage(content="""根据天气查询结果,北京今天多云转雨,降水概率80%,确实适合安排室内活动。以下是我为您推荐的室内活动:
1. 博物馆参观:故宫博物院、国家博物馆
2. 购物娱乐:三里屯、王府井
3. 文化体验:茶艺馆、书店咖啡厅
4. 运动健身:室内攀岩、游泳、健身房
5. 美食探索:火锅、烤鸭等特色餐厅希望这些建议对您有帮助!"""
)# Step 7: 路由决策
should_continue() → END  # 没有工具调用,结束流程

3.2 流程图可视化

graph TDA[用户输入] --> B[Agent节点]B --> C{检查响应}C -->|有工具调用| D[工具节点]C -->|无工具调用| E[结束/后处理]D --> F[执行工具]F --> G[返回工具结果]G --> BE --> H[最终输出]style B fill:#e1f5festyle D fill:#f3e5f5style E fill:#e8f5e8

3.3 并行工具调用的威力

LangGraph v2版本支持并行工具调用,这大大提高了执行效率:

# 用户问题:比较北京、上海、深圳三个城市今天的天气# Agent生成多个工具调用
AIMessage(content="我来为您查询这三个城市的天气情况。",tool_calls=[{"name": "get_weather", "args": {"city": "北京"}, "id": "call_1"},{"name": "get_weather", "args": {"city": "上海"}, "id": "call_2"},{"name": "get_weather", "args": {"city": "深圳"}, "id": "call_3"}]
)# v2版本使用Send API并行执行
should_continue() → [Send("tools", [{"name": "get_weather", "args": {"city": "北京"}}]),Send("tools", [{"name": "get_weather", "args": {"city": "上海"}}]),Send("tools", [{"name": "get_weather", "args": {"city": "深圳"}}])
]# 三个工具调用同时执行,然后合并结果

这种并行执行机制的优势:

  • 效率提升:减少总执行时间

  • 资源优化:充分利用系统资源

  • 用户体验:更快的响应速度

第四章:高级特性深度解析——ReAct的进阶玩法

4.1 动态模型选择

LangGraph支持在运行时动态选择模型,这为ReAct Agent提供了强大的适应性:

def dynamic_model_selector(state: AgentState, runtime: Runtime[ContextT]
) -> BaseChatModel:"""根据任务复杂度动态选择模型"""last_message = state["messages"][-1].content# 分析任务复杂度if any(keyword in last_message for keyword in ["分析", "推理", "复杂"]):# 复杂任务使用高级模型return ChatOpenAI(model="gpt-4", temperature=0.1)elif any(keyword in last_message for keyword in ["创作", "写作", "想象"]):# 创作任务使用创意模型return ChatOpenAI(model="gpt-4", temperature=0.8)else:# 简单任务使用快速模型return ChatOpenAI(model="gpt-3.5-turbo", temperature=0.3)# 创建支持动态模型的Agent
agent = create_react_agent(model=dynamic_model_selector,tools=[weather_tool, search_tool, calculator_tool],prompt="你是一个智能助手,能够根据任务复杂度调整推理能力。"
)

4.2 工具参数注入

LangGraph提供了强大的工具参数注入机制,可以在运行时动态修改工具参数:

class AdvancedToolNode(ToolNode):"""增强版工具节点,支持参数注入"""def inject_tool_args(self, tool_call: dict, state: AgentState, store: BaseStore) -> dict:"""注入运行时参数"""# 获取用户上下文user_id = get_user_id_from_state(state)user_preferences = store.get(("user_preferences", user_id))# 为特定工具注入个性化参数if tool_call["name"] == "search_restaurants":tool_call["args"]["user_dietary_restrictions"] = (user_preferences.get("dietary_restrictions", []))tool_call["args"]["preferred_cuisine"] = (user_preferences.get("preferred_cuisine", "any"))return tool_call

4.3 结构化输出生成

ReAct Agent可以在完成推理-行动循环后,生成符合特定格式的结构化输出:

from pydantic import BaseModel
from typing import Listclass WeatherAnalysisResponse(BaseModel):"""天气分析结构化响应"""city: strcurrent_weather: strtemperature_range: strrecommendations: List[str]confidence: float# 创建支持结构化输出的Agent
agent = create_react_agent(model="gpt-4",tools=[weather_tool, activity_tool],response_format=WeatherAnalysisResponse,prompt="分析天气并提供结构化的建议。"
)# 执行后会得到标准化的响应格式
result = agent.invoke({"messages": [("user", "分析北京今天的天气并给出活动建议")]
})# result["structured_response"] 包含 WeatherAnalysisResponse 格式的数据

4.4 人机协作增强

通过pre_model_hook和post_model_hook,可以实现复杂的人机协作流程:

def pre_model_hook(state: AgentState) -> dict:"""模型调用前的预处理- 消息历史管理- 上下文压缩- 敏感信息过滤"""messages = state["messages"]# 如果消息过多,进行智能压缩if len(messages) > 20:# 保留最近的重要消息important_messages = extract_important_messages(messages)summary = create_conversation_summary(messages[:-10])return {"llm_input_messages": [SystemMessage(content=f"对话摘要:{summary}"),*important_messages]}return {"llm_input_messages": messages}def post_model_hook(state: AgentState) -> dict:"""模型响应后的后处理- 内容审核- 质量检查- 人工审核点"""last_message = state["messages"][-1]# 检查响应质量if needs_human_review(last_message):# 触发人工审核reviewed_content = interrupt({"type": "human_review","content": last_message.content,"reason": "质量检查需要人工确认"})return {"messages": [AIMessage(content=reviewed_content)]}return {}# 创建增强版Agent
agent = create_react_agent(model="gpt-4",tools=[search_tool, analysis_tool],pre_model_hook=pre_model_hook,post_model_hook=post_model_hook,version="v2"
)

第五章:性能优化与最佳实践——工程化的ReAct

5.1 缓存策略优化

对于ReAct Agent,智能的缓存策略可以显著提升性能:

from langgraph.cache.base import BaseCache
from typing import Any, Optionalclass ReActCache(BaseCache):"""ReAct专用缓存实现"""def __init__(self):self._tool_cache = {}self._reasoning_cache = {}def get_tool_result(self, tool_name: str, args: dict) -> Optional[Any]:"""获取工具调用缓存"""cache_key = f"{tool_name}:{hash(frozenset(args.items()))}"return self._tool_cache.get(cache_key)def set_tool_result(self, tool_name: str, args: dict, result: Any, ttl: int = 3600):"""设置工具调用缓存"""cache_key = f"{tool_name}:{hash(frozenset(args.items()))}"self._tool_cache[cache_key] = {"result": result,"timestamp": time.time(),"ttl": ttl}def should_use_cache(self, tool_name: str, args: dict) -> bool:"""判断是否应该使用缓存"""# 某些工具(如时间、随机数)不应该缓存no_cache_tools = {"get_current_time", "generate_random", "get_stock_price"}return tool_name not in no_cache_tools# 增强版ToolNode with 缓存
class CachedToolNode(ToolNode):def __init__(self, tools: List[BaseTool], cache: ReActCache):super().__init__(tools)self.cache = cachedef _execute_tool_call(self, tool_call: dict) -> ToolMessage:tool_name = tool_call["name"]args = tool_call["args"]# 检查缓存if self.cache.should_use_cache(tool_name, args):cached_result = self.cache.get_tool_result(tool_name, args)if cached_result:return ToolMessage(content=cached_result["result"],tool_call_id=tool_call["id"],name=tool_name)# 执行工具tool = self.tools_by_name[tool_name]result = tool.invoke(args)# 缓存结果if self.cache.should_use_cache(tool_name, args):self.cache.set_tool_result(tool_name, args, result)return ToolMessage(content=str(result),tool_call_id=tool_call["id"],name=tool_name)

5.2 错误处理与重试机制

生产环境中的ReAct Agent需要健壮的错误处理:

from langgraph.types import RetryPolicy
import asyncio
from typing import Dict, Listclass ResilientReActAgent:"""具有错误恢复能力的ReAct Agent"""def __init__(self, base_agent, max_retries: int = 3):self.base_agent = base_agentself.max_retries = max_retriesself.error_history: Dict[str, List[str]] = {}def create_retry_policy(self) -> RetryPolicy:"""创建重试策略"""return RetryPolicy(max_attempts=self.max_retries,backoff_factor=2.0,retry_on=["timeout","rate_limit","temporary_failure"])def handle_tool_error(self, tool_name: str, error: Exception, attempt: int) -> str:"""智能错误处理"""error_msg = str(error)# 记录错误历史if tool_name not in self.error_history:self.error_history[tool_name] = []self.error_history[tool_name].append(error_msg)# 根据错误类型提供不同的恢复策略if "rate_limit" in error_msg.lower():return f"工具{tool_name}遇到了速率限制,请稍后再试。我将使用其他方法为您查询信息。"elif "timeout" in error_msg.lower():return f"工具{tool_name}响应超时。让我尝试其他途径来获取所需信息。"elif "not_found" in error_msg.lower():return f"未找到相关信息。让我尝试调整搜索策略或使用其他数据源。"else:return f"工具{tool_name}暂时不可用(错误:{error_msg})。我将尝试其他方法解决您的问题。"async def invoke_with_fallback(self, input_data: dict) -> dict:"""带备用方案的调用"""try:return await self.base_agent.ainvoke(input_data)except Exception as e:# 生成错误恢复的响应fallback_response = {"messages": [AIMessage(content=f"抱歉,系统遇到了一些问题:{str(e)}。请稍后重试或换个方式提问。")]}return fallback_response

5.3 监控与调试

完善的监控系统对于ReAct Agent的运维至关重要:

import logging
from datetime import datetime
from typing import Dict, Any
import jsonclass ReActMonitor:"""ReAct Agent监控系统"""def __init__(self, log_level=logging.INFO):self.logger = logging.getLogger("ReActAgent")self.logger.setLevel(log_level)self.metrics = {"total_invocations": 0,"tool_calls": {},"average_steps": 0,"error_rate": 0}def log_agent_start(self, input_data: dict, session_id: str):"""记录Agent开始执行"""self.logger.info(f"[{session_id}] Agent启动", extra={"event": "agent_start","session_id": session_id,"input_length": len(str(input_data)),"timestamp": datetime.now().isoformat()})def log_reasoning_step(self, session_id: str, step: int, reasoning: str):"""记录推理步骤"""self.logger.debug(f"[{session_id}] 推理步骤 {step}: {reasoning[:100]}...", extra={"event": "reasoning","session_id": session_id,"step": step,"reasoning_preview": reasoning[:100]})def log_tool_call(self, session_id: str, tool_name: str, args: dict, duration: float):"""记录工具调用"""self.logger.info(f"[{session_id}] 工具调用: {tool_name}", extra={"event": "tool_call","session_id": session_id,"tool_name": tool_name,"duration": duration,"args_hash": hash(str(args))})# 更新指标if tool_name not in self.metrics["tool_calls"]:self.metrics["tool_calls"][tool_name] = 0self.metrics["tool_calls"][tool_name] += 1def log_agent_complete(self, session_id: str, total_steps: int, success: bool):"""记录Agent完成"""self.logger.info(f"[{session_id}] Agent完成,步数: {total_steps}, 成功: {success}", extra={"event": "agent_complete","session_id": session_id,"total_steps": total_steps,"success": success})# 更新指标self.metrics["total_invocations"] += 1self.metrics["average_steps"] = (self.metrics["average_steps"] * (self.metrics["total_invocations"] - 1) + total_steps) / self.metrics["total_invocations"]def get_performance_report(self) -> dict:"""生成性能报告"""return {"summary": self.metrics,"top_tools": sorted(self.metrics["tool_calls"].items(),key=lambda x: x[1],reverse=True)[:5],"generated_at": datetime.now().isoformat()}# 集成监控的Agent装饰器
def with_monitoring(monitor: ReActMonitor):"""为Agent添加监控能力的装饰器"""def decorator(agent_func):async def wrapper(*args, **kwargs):session_id = kwargs.get("session_id", "unknown")monitor.log_agent_start(args[0] if args else {}, session_id)try:result = await agent_func(*args, **kwargs)monitor.log_agent_complete(session_id, len(result.get("messages", [])), True)return resultexcept Exception as e:monitor.log_agent_complete(session_id, 0, False)raisereturn wrapperreturn decorator

第六章:实战案例分析——ReAct的威力展现

6.1 智能客服系统

让我们构建一个完整的智能客服ReAct Agent:

from datetime import datetime
from typing import Optional# 定义客服工具集
class CustomerServiceTools:"""客服专用工具集"""@staticmethoddef query_order_status(order_id: str) -> str:"""查询订单状态"""# 模拟数据库查询orders = {"ORD001": {"status": "已发货", "tracking": "SF1234567890", "eta": "2024-01-15"},"ORD002": {"status": "处理中", "tracking": None, "eta": "2024-01-16"},"ORD003": {"status": "已完成", "tracking": "SF0987654321", "eta": "已送达"}}if order_id in orders:order = orders[order_id]return f"订单{order_id}状态:{order['status']}"else:return f"未找到订单{order_id},请检查订单号是否正确。"@staticmethoddef search_knowledge_base(query: str) -> str:"""搜索知识库"""knowledge_base = {"退款": "退款政策:商品签收后7天内可申请退款,需保持商品完好。","换货": "换货政策:商品质量问题可在15天内申请换货。","配送": "配送时间:一般3-7个工作日,偏远地区可能延长。","售后": "售后服务:提供1年质保,全国联保服务。"}for key, value in knowledge_base.items():if key in query:return valuereturn "很抱歉,暂时没有找到相关信息。请您描述具体问题,我来为您详细解答。"@staticmethoddef create_service_ticket(customer_id: str, issue_type: str, description: str,priority: str = "normal") -> str:"""创建服务工单"""ticket_id = f"TKT{datetime.now().strftime('%Y%m%d%H%M%S')}"return f"已为您创建服务工单:{ticket_id}。我们的专员会在24小时内联系您处理{issue_type}问题。"# 客服Agent状态定义
class CustomerServiceState(TypedDict):messages: Annotated[list[BaseMessage], add_messages]customer_id: Optional[str]issue_category: Optional[str]urgency_level: Optional[str]remaining_steps: NotRequired[RemainingSteps]# 创建客服工具
tools = [StructuredTool.from_function(CustomerServiceTools.query_order_status,name="query_order_status",description="查询订单状态,需要提供订单号"),StructuredTool.from_function(CustomerServiceTools.search_knowledge_base,name="search_knowledge_base",description="搜索客服知识库,查找相关政策和解答"),StructuredTool.from_function(CustomerServiceTools.create_service_ticket,name="create_service_ticket",description="创建服务工单,用于复杂问题的后续跟进")
]# 客服系统提示词
customer_service_prompt = """你是一个专业的智能客服助手,具备以下能力:1. **问题诊断**:准确理解客户问题,分类和优先级判断
2. **信息查询**:查询订单状态、搜索知识库
3. **问题解决**:提供解决方案,必要时创建服务工单
4. **情感理解**:保持耐心、友好的服务态度工作流程:
1. 首先理解客户的问题和需求
2. 如果涉及订单,主动查询订单状态
3. 对于政策类问题,搜索知识库
4. 复杂问题创建工单转人工处理
5. 始终确认客户满意度记住:客户至上,用心服务!"""# 创建客服Agent
customer_service_agent = create_react_agent(model="gpt-4",tools=tools,prompt=customer_service_prompt,state_schema=CustomerServiceState,version="v2"
)# 使用示例
async def handle_customer_inquiry():"""处理客户咨询的完整流程"""# 客户问题customer_input = "我的订单ORD001什么时候能到?另外想了解一下退款政策。"# 执行ReAct流程result = await customer_service_agent.ainvoke({"messages": [HumanMessage(content=customer_input)],"customer_id": "CUST12345"})# 输出完整的对话历史for message in result["messages"]:if isinstance(message, HumanMessage):print(f"客户:{message.content}")elif isinstance(message, AIMessage):if message.tool_calls:print(f"系统:正在查询...")for tool_call in message.tool_calls:print(f"  调用工具:{tool_call['name']}")else:print(f"客服:{message.content}")elif isinstance(message, ToolMessage):print(f"查询结果:{message.content}")# 运行示例
# asyncio.run(handle_customer_inquiry())

6.2 数据分析助手

再看一个数据分析场景的ReAct实现:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from io import BytesIO
import base64class DataAnalysisTools:"""数据分析工具集"""def __init__(self, data_sources: dict):self.data_sources = data_sourcesdef load_dataset(self, dataset_name: str) -> str:"""加载数据集"""if dataset_name not in self.data_sources:return f"数据集'{dataset_name}'不存在。可用数据集:{list(self.data_sources.keys())}"df = pd.read_csv(self.data_sources[dataset_name])return f"成功加载数据集'{dataset_name}',包含{len(df)}行,{len(df.columns)}列。\n列名:{list(df.columns)}"def describe_data(self, dataset_name: str, columns: Optional[list] = None) -> str:"""数据描述性统计"""if dataset_name not in self.data_sources:return f"数据集'{dataset_name}'未加载"df = pd.read_csv(self.data_sources[dataset_name])if columns:df = df[columns]description = df.describe()return f"数据统计摘要:\n{description.to_string()}"def create_visualization(self, dataset_name: str, chart_type: str, x_column: str, y_column: Optional[str] = None) -> str:"""创建数据可视化"""if dataset_name not in self.data_sources:return f"数据集'{dataset_name}'未加载"df = pd.read_csv(self.data_sources[dataset_name])plt.figure(figsize=(10, 6))if chart_type == "histogram":plt.hist(df[x_column], bins=30)plt.title(f"{x_column}的分布")elif chart_type == "scatter" and y_column:plt.scatter(df[x_column], df[y_column])plt.xlabel(x_column)plt.ylabel(y_column)plt.title(f"{x_column} vs {y_column}")elif chart_type == "line" and y_column:plt.plot(df[x_column], df[y_column])plt.xlabel(x_column)plt.ylabel(y_column)plt.title(f"{x_column} vs {y_column}趋势")# 保存图片为base64buffer = BytesIO()plt.savefig(buffer, format='png')buffer.seek(0)image_base64 = base64.b64encode(buffer.read()).decode()plt.close()return f"已生成{chart_type}图表。图片数据:data:image/png;base64,{image_base64[:50]}..."def calculate_correlation(self, dataset_name: str, columns: list) -> str:"""计算相关性"""if dataset_name not in self.data_sources:return f"数据集'{dataset_name}'未加载"df = pd.read_csv(self.data_sources[dataset_name])numeric_df = df[columns].select_dtypes(include=['number'])correlation = numeric_df.corr()return f"相关性矩阵:\n{correlation.to_string()}"# 创建数据分析Agent
data_analysis_prompt = """你是一个专业的数据分析师,擅长:1. **数据探索**:理解数据结构、分布、特征
2. **统计分析**:描述性统计、相关性分析
3. **数据可视化**:创建各种图表展示数据特征
4. **洞察发现**:从数据中发现有价值的模式和趋势分析流程:
1. 首先了解用户的分析需求
2. 加载相关数据集
3. 进行数据探索和统计分析
4. 创建合适的可视化图表
5. 提供数据洞察和建议记住:让数据说话,用可视化展示洞察!"""# 初始化工具
data_sources = {"sales_data": "sales_2024.csv","customer_data": "customers.csv", "product_data": "products.csv"
}analysis_tools = DataAnalysisTools(data_sources)tools = [StructuredTool.from_function(analysis_tools.load_dataset,name="load_dataset",description="加载指定的数据集进行分析"),StructuredTool.from_function(analysis_tools.describe_data,name="describe_data", description="获取数据的描述性统计信息"),StructuredTool.from_function(analysis_tools.create_visualization,name="create_visualization",description="创建数据可视化图表"),StructuredTool.from_function(analysis_tools.calculate_correlation,name="calculate_correlation",description="计算数据列之间的相关性")
]data_analyst_agent = create_react_agent(model="gpt-4",tools=tools,prompt=data_analysis_prompt,version="v2"
)

6.3 代码审查助手

最后,让我们看一个代码审查的ReAct应用:

import ast
import subprocess
from typing import List, Dictclass CodeReviewTools:"""代码审查工具集"""@staticmethoddef analyze_python_syntax(code: str) -> str:"""Python语法分析"""try:ast.parse(code)return "✅ 语法检查通过,没有发现语法错误。"except SyntaxError as e:return f"❌ 语法错误:第{e.lineno}行 - {e.msg}"@staticmethoddef check_code_style(code: str) -> str:"""代码风格检查"""style_issues = []lines = code.split('\n')for i, line in enumerate(lines, 1):# 检查行长度if len(line) > 88:style_issues.append(f"第{i}行过长({len(line)}字符),建议控制在88字符内")# 检查Tab使用if '\t' in line:style_issues.append(f"第{i}行使用了Tab,建议使用4个空格缩进")# 检查trailing spacesif line.endswith(' '):style_issues.append(f"第{i}行末尾有多余空格")if style_issues:return "⚠️  代码风格问题:\n" + "\n".join(style_issues)else:return "✅ 代码风格良好,符合PEP8规范。"@staticmethoddef security_scan(code: str) -> str:"""安全扫描"""security_issues = []# 检查危险函数dangerous_patterns = [('eval(', '使用eval()可能导致代码注入风险'),('exec(', '使用exec()可能导致代码执行风险'),('os.system(', '使用os.system()可能导致命令注入风险'),('subprocess.call(', '使用subprocess需要验证输入参数')]for pattern, warning in dangerous_patterns:if pattern in code:security_issues.append(f"⚠️  {warning}")# 检查硬编码密码lines = code.split('\n')for i, line in enumerate(lines, 1):if any(keyword in line.lower() for keyword in ['password', 'secret', 'key']):if '=' in line and any(quote in line for quote in ['"', "'"]):security_issues.append(f"第{i}行可能包含硬编码的敏感信息")if security_issues:return "🔒 安全检查发现问题:\n" + "\n".join(security_issues)else:return "✅ 安全检查通过,未发现明显安全风险。"@staticmethoddef performance_analysis(code: str) -> str:"""性能分析"""performance_tips = []# 检查常见性能问题if 'for' in code and 'append' in code:performance_tips.append("💡 考虑使用列表推导式替代for循环+append,可提升性能")if '+ ' in code and 'str' in code:performance_tips.append("💡 字符串拼接建议使用f-string或join()方法")if '.find(' in code:performance_tips.append("💡 使用'in'操作符替代.find()进行字符串查找")if performance_tips:return "⚡ 性能优化建议:\n" + "\n".join(performance_tips)else:return "✅ 代码性能良好,未发现明显性能问题。"@staticmethoddef generate_review_summary(syntax_result: str,style_result: str, security_result: str,performance_result: str) -> str:"""生成审查总结"""# 统计问题数量issues = 0if "❌" in syntax_result or "⚠️" in syntax_result:issues += 1if "⚠️" in style_result:issues += 1if "🔒" in security_result and "问题" in security_result:issues += 1# 生成评级if issues == 0:rating = "🌟 优秀"summary = "代码质量很高,可以直接合并。"elif issues == 1:rating = "👍 良好"summary = "代码整体良好,有少量改进空间。"elif issues == 2:rating = "⚠️  需要改进"summary = "代码存在一些问题,建议修复后再提交。"else:rating = "❌ 需要重构"summary = "代码存在较多问题,建议重新审视和重构。"return f"""
## 代码审查总结**评级**: {rating}
**概述**: {summary}**详细分析**:
- 语法检查: {syntax_result.split('.')[0]}
- 风格检查: {style_result.split('.')[0]}  
- 安全检查: {security_result.split('.')[0]}
- 性能分析: {performance_result.split('.')[0]}**建议**: 根据上述分析结果逐项改进代码质量。
"""# 创建代码审查Agent
code_review_prompt = """你是一个经验丰富的代码审查专家,专注于:1. **代码质量评估**:语法、风格、结构
2. **安全性检查**:识别潜在安全风险
3. **性能分析**:发现性能优化点
4. **最佳实践建议**:提供改进建议审查流程:
1. 理解代码的功能和上下文
2. 进行语法和风格检查
3. 执行安全性扫描
4. 分析性能特征
5. 生成综合评估报告记住:既要严格把关质量,也要给出建设性建议!"""review_tools = [StructuredTool.from_function(CodeReviewTools.analyze_python_syntax,name="analyze_syntax",description="检查Python代码语法是否正确"),StructuredTool.from_function(CodeReviewTools.check_code_style, name="check_style",description="检查代码风格是否符合规范"),StructuredTool.from_function(CodeReviewTools.security_scan,name="security_scan", description="扫描代码中的安全风险"),StructuredTool.from_function(CodeReviewTools.performance_analysis,name="performance_analysis",description="分析代码性能特征和优化建议"),StructuredTool.from_function(CodeReviewTools.generate_review_summary,name="generate_summary",description="基于各项检查结果生成审查总结")
]code_review_agent = create_react_agent(model="gpt-4",tools=review_tools,prompt=code_review_prompt,version="v2"
)

第七章:ReAct的未来发展——智能的边界在哪里?

7.1 多模态ReAct

未来的ReAct Agent将不仅仅处理文本,还能理解和生成图像、音频、视频:

# 未来的多模态ReAct Agent概念设计
class MultimodalReActAgent:"""多模态ReAct Agent"""def __init__(self):self.vision_tools = ["analyze_image", "generate_image", "extract_text_from_image"]self.audio_tools = ["transcribe_audio", "generate_speech", "analyze_sentiment_from_voice"]self.video_tools = ["extract_frames", "analyze_video_content", "generate_video_summary"]async def multimodal_reasoning(self, inputs: dict) -> dict:"""多模态推理流程:1. 分析输入的模态类型(文本、图像、音频、视频)2. 选择合适的工具进行处理3. 跨模态信息融合4. 生成多模态响应"""# 推理:用户上传了一张图片,我需要分析图片内容# 行动:调用图像分析工具# 观察:识别出图片中的物体和场景# 推理:用户可能想了解更多相关信息# 行动:搜索相关知识# 观察:获得详细信息# 推理:现在可以给出综合回答pass

7.2 自学习ReAct

未来的ReAct Agent具备从经验中学习的能力:

class SelfLearningReActAgent:"""自学习ReAct Agent"""def __init__(self):self.experience_memory = ExperienceMemory()self.strategy_optimizer = StrategyOptimizer()def learn_from_interaction(self, interaction_history: list):"""从交互历史中学习"""# 分析成功的推理-行动模式successful_patterns = self.extract_successful_patterns(interaction_history)# 更新工具使用策略self.strategy_optimizer.update_tool_selection_strategy(successful_patterns)# 优化推理链self.strategy_optimizer.refine_reasoning_chains(successful_patterns)def adaptive_tool_selection(self, context: dict) -> list:"""自适应工具选择"""# 基于历史经验和当前上下文选择最优工具组合similar_contexts = self.experience_memory.find_similar_contexts(context)return self.strategy_optimizer.recommend_tools(similar_contexts)

7.3 协作式ReAct

多个ReAct Agent之间的协作将创造更强大的能力:

class CollaborativeReActSystem:"""协作式ReAct系统"""def __init__(self):self.specialist_agents = {"data_analyst": DataAnalystReActAgent(),"code_reviewer": CodeReviewReActAgent(),"creative_writer": CreativeWriterReActAgent(),"problem_solver": ProblemSolverReActAgent()}self.coordinator = CoordinatorAgent()async def collaborative_reasoning(self, complex_task: dict) -> dict:"""协作推理流程:1. 任务分解(协调器)2. 专家分配(协调器)3. 并行推理(各专家Agent)4. 结果整合(协调器)5. 质量评估(交叉验证)"""# 推理:这是一个复杂任务,需要多个专家协作# 行动:分解任务并分配给专家# 观察:收集各专家的分析结果# 推理:整合不同视角的洞察# 行动:生成综合解决方案pass

7.4 边缘计算ReAct

为了提高响应速度和隐私保护,ReAct Agent将向边缘计算发展:

class EdgeReActAgent:"""边缘计算ReAct Agent"""def __init__(self):self.local_model = LocalLanguageModel()  # 本地轻量级模型self.cloud_model = CloudLanguageModel()  # 云端强大模型self.decision_engine = HybridDecisionEngine()async def hybrid_reasoning(self, input_data: dict) -> dict:"""混合推理策略:1. 简单任务 → 本地处理2. 复杂任务 → 云端处理3. 敏感数据 → 本地处理4. 实时需求 → 本地优先"""complexity_score = self.assess_task_complexity(input_data)privacy_level = self.assess_privacy_requirements(input_data)if complexity_score < 0.5 or privacy_level == "high":return await self.local_reasoning(input_data)else:return await self.cloud_reasoning(input_data)

第八章:挑战与机遇——ReAct发展的思考

8.1 当前挑战

8.1.1 计算成本问题

ReAct模式的迭代特性导致计算成本较高:

# 成本分析示例
class ReActCostAnalyzer:"""ReAct成本分析器"""def __init__(self):self.model_costs = {"gpt-4": {"input": 0.03, "output": 0.06},  # 每1K token的成本"gpt-3.5-turbo": {"input": 0.001, "output": 0.002}}self.tool_costs = {"web_search": 0.001,  # 每次调用成本"database_query": 0.0001,"api_call": 0.005}def calculate_interaction_cost(self, interaction_log: dict) -> float:"""计算单次交互成本"""total_cost = 0# 模型调用成本for model_call in interaction_log["model_calls"]:model = model_call["model"]tokens = model_call["tokens"]total_cost += (tokens["input"] * self.model_costs[model]["input"] / 1000 +tokens["output"] * self.model_costs[model]["output"] / 1000)# 工具调用成本for tool_call in interaction_log["tool_calls"]:tool_name = tool_call["name"]total_cost += self.tool_costs.get(tool_name, 0)return total_costdef optimize_cost_efficiency(self, agent_config: dict) -> dict:"""优化成本效率"""optimized_config = agent_config.copy()# 策略1:使用轻量级模型处理简单任务optimized_config["model_selection_strategy"] = "adaptive"# 策略2:缓存常用查询结果optimized_config["enable_caching"] = True# 策略3:批量处理工具调用optimized_config["batch_tool_calls"] = Truereturn optimized_config
8.1.2 一致性保证

在复杂的推理-行动链中,如何保证逻辑一致性是一个挑战:

class ConsistencyChecker:"""一致性检查器"""def __init__(self):self.logic_rules = self.load_logic_rules()self.fact_database = FactDatabase()def check_reasoning_consistency(self, reasoning_chain: list) -> dict:"""检查推理链的一致性"""inconsistencies = []for i, step in enumerate(reasoning_chain):# 检查逻辑一致性if not self.validate_logical_step(step):inconsistencies.append({"step": i,"type": "logic_error","description": f"步骤{i}存在逻辑错误"})# 检查事实一致性if not self.validate_factual_consistency(step):inconsistencies.append({"step": i,"type": "fact_conflict","description": f"步骤{i}与已知事实冲突"})return {"is_consistent": len(inconsistencies) == 0,"inconsistencies": inconsistencies}def auto_correct_inconsistencies(self, reasoning_chain: list) -> list:"""自动修正不一致性"""corrected_chain = reasoning_chain.copy()# 实现自动修正逻辑# 1. 删除矛盾的步骤# 2. 插入必要的逻辑桥梁# 3. 重新验证整体一致性return corrected_chain

8.2 发展机遇

8.2.1 垂直领域深化

ReAct模式在特定领域的深度应用将带来巨大价值:

# 医疗诊断ReAct Agent示例
class MedicalDiagnosisReActAgent:"""医疗诊断ReAct Agent"""def __init__(self):self.medical_knowledge_base = MedicalKnowledgeBase()self.diagnostic_tools = DiagnosticTools()self.clinical_guidelines = ClinicalGuidelines()async def diagnostic_reasoning(self, patient_data: dict) -> dict:"""医疗诊断推理流程:1. 收集患者症状和病史2. 基于症状进行初步诊断假设3. 推荐必要的检查项目4. 分析检查结果5. 给出诊断建议和治疗方案"""# 推理:患者出现胸痛和呼吸困难,需要考虑心血管和呼吸系统疾病# 行动:查询相关疾病的诊断标准# 观察:获得心肌梗死、肺栓塞等疾病的诊断标准# 推理:需要进一步的检查来确定诊断# 行动:推荐心电图、血液检查、胸部CT等# 观察:检查结果显示心电图异常,心肌酶升高# 推理:高度怀疑急性心肌梗死# 行动:提供紧急处理建议pass
8.2.2 人机协作增强

ReAct将成为人机协作的重要桥梁:

class HumanAICollaborationFramework:"""人机协作框架"""def __init__(self):self.human_expertise_model = HumanExpertiseModel()self.ai_capability_model = AiCapabilityModel()self.collaboration_orchestrator = CollaborationOrchestrator()def optimal_task_allocation(self, task: dict) -> dict:"""最优任务分配"""human_strengths = self.human_expertise_model.assess_task_fit(task)ai_strengths = self.ai_capability_model.assess_task_fit(task)allocation = self.collaboration_orchestrator.optimize_allocation(task, human_strengths, ai_strengths)return {"human_tasks": allocation["human_tasks"],"ai_tasks": allocation["ai_tasks"], "collaborative_tasks": allocation["collaborative_tasks"]}async def collaborative_reasoning(self, complex_problem: dict) -> dict:"""协作推理模式:1. AI进行初步分析和信息收集2. 人类提供专业判断和创意思考3. AI执行大量计算和数据处理4. 人类进行最终决策和质量控制"""# AI: 快速收集和整理相关信息# Human: 基于经验提供洞察和判断# AI: 验证假设,进行详细分析# Human: 做出最终决策pass

结语:ReAct——智能Agent的哲学革命

当我们回顾人工智能的发展历程时,会发现每一次重大突破都伴随着思维模式的根本转变。从图灵测试到深度学习,从专家系统到大语言模型,每一步都在重新定义"智能"的内涵。

ReAct模式的出现,标志着我们对智能Agent的理解进入了一个全新的维度。它不再是简单的输入-输出映射,也不再是静态的知识检索,而是一种真正动态的、交互式的、具有自我调节能力的智能系统。

ReAct的哲学意义

ReAct模式体现了几个重要的哲学思想:

  1. 实用主义哲学:知识的价值在于其实用性,推理必须与行动结合

  2. 系统论思维:智能不是孤立的,而是在与环境的交互中涌现

  3. 迭代改进理念:通过不断的试错和调整达到最优解

LangGraph的技术贡献

LangGraph作为ReAct模式的优秀实践者,其技术贡献不仅在于提供了一个强大的实现框架,更重要的是:

  1. 降低了复杂性:通过优雅的抽象隐藏了底层复杂性

  2. 提高了可扩展性:模块化设计使得系统易于扩展和定制

  3. 保证了可靠性:完善的错误处理和状态管理机制

  4. 促进了创新:为开发者提供了无限的创造空间

未来的无限可能

展望未来,ReAct模式将在以下几个方向持续演进:

技术层面

  • 更高效的推理算法

  • 更强大的多模态能力

  • 更智能的工具协同

  • 更完善的人机协作

应用层面

  • 更广泛的领域应用

  • 更深入的垂直整合

  • 更丰富的场景支持

  • 更个性化的用户体验

社会层面

  • 重新定义人机关系

  • 提升人类生产力

  • 创造新的就业机会

  • 推动社会进步

致未来的开发者

作为站在AI时代前沿的开发者,我们有幸见证并参与这场智能革命。ReAct模式和LangGraph为我们提供了强大的工具,但更重要的是它们传递的思想:

  • 保持好奇心:不断探索智能的边界

  • 追求卓越:用工程师的严谨态度构建可靠的系统

  • 关注用户:始终以解决实际问题为目标

  • 拥抱变化:在快速发展的技术浪潮中保持学习

ReAct不仅仅是一种技术模式,更是一种思维方式。它告诉我们,真正的智能不在于拥有多少知识,而在于如何运用这些知识去解决实际问题。在推理与行动的完美融合中,我们看到了人工智能的未来——一个更加智能、更加有用、更加可靠的未来。

让我们一起踏上这个充满无限可能的旅程,用ReAct的思维去创造、去探索、去改变这个世界!


互动讨论与实践挑战

亲爱的读者,读完这篇深度解析,相信您对ReAct模式和LangGraph的实现有了全新的认识。现在,让我们一起来探讨和实践:

🧠 思考题

  1. 架构设计:如果让您设计一个教育领域的ReAct Agent,您会如何规划工具集和推理流程?

  2. 性能优化:在大并发场景下,如何平衡ReAct Agent的响应时间和计算成本?

  3. 错误处理:当工具调用链中某个环节失败时,如何设计优雅的降级策略?

💻 实践挑战

  1. 初级挑战:实现一个简单的ReAct Agent,能够查询天气并根据天气推荐服装

  2. 中级挑战:构建一个数据分析ReAct Agent,能够自动生成数据报告

  3. 高级挑战:设计一个多Agent协作的ReAct系统,解决复杂的业务流程自动化

🔍 深度探索

  • 工具创新:您认为未来还会出现哪些革命性的工具类型?

  • 应用场景:在您的工作领域中,ReAct模式可以解决哪些实际问题?

  • 技术演进:如何将ReAct与其他前沿技术(如知识图谱、强化学习)结合?

📚 学习资源推荐

  • 官方文档:深入了解LangGraph的最新特性

  • 开源项目:参与社区项目,贡献您的智慧

  • 学术论文:跟踪ReAct相关的最新研究成果

🤝 社区互动

欢迎在评论区分享您的:

  • 实践经验:使用LangGraph构建ReAct Agent的心得体会

  • 创新想法:对ReAct模式改进和扩展的思考

  • 问题讨论:在学习和应用过程中遇到的挑战

  • 资源分享:有价值的学习资料和工具推荐

让我们一起构建一个充满活力的ReAct技术社区,共同推动智能Agent技术的发展!

记住:最好的学习方式就是实践。选择一个您感兴趣的应用场景,开始构建您的第一个ReAct Agent吧!

#LangGraph #ReAct #智能Agent #人工智能 #推理与行动 #技术实践

更多AIGC文章


文章转载自:

http://O641zT9t.gnnrf.cn
http://Dgf1xiGR.gnnrf.cn
http://RySPgYiu.gnnrf.cn
http://xY4vkvsq.gnnrf.cn
http://Lo74Dwip.gnnrf.cn
http://BKbnIACg.gnnrf.cn
http://FKezTdiB.gnnrf.cn
http://zDYWREYK.gnnrf.cn
http://hP5r58ch.gnnrf.cn
http://w8Dft0JA.gnnrf.cn
http://I7SyvIe0.gnnrf.cn
http://8YpYlkGr.gnnrf.cn
http://wltP4noo.gnnrf.cn
http://Ww4QbPji.gnnrf.cn
http://8PEqwrfV.gnnrf.cn
http://MqP9plDh.gnnrf.cn
http://I250NCdo.gnnrf.cn
http://93mgnEWW.gnnrf.cn
http://jURxRvlK.gnnrf.cn
http://UuUCL46D.gnnrf.cn
http://Jj192DWN.gnnrf.cn
http://UwQi1Xvo.gnnrf.cn
http://Pn7fvN9Q.gnnrf.cn
http://QGVlnwNv.gnnrf.cn
http://pAwrRwwG.gnnrf.cn
http://gAcAkKqd.gnnrf.cn
http://9YDkI99e.gnnrf.cn
http://JIJwLHwf.gnnrf.cn
http://favO9dUg.gnnrf.cn
http://C4YeKri2.gnnrf.cn
http://www.dtcms.com/a/376936.html

相关文章:

  • 【机械故障】使用fir滤波器实现数据拟合
  • vue3 中 npm install mammoth 与 npm install --save mammoth 的主要区别说明
  • Milvus基于docker主机外挂实践
  • 从零搭建企业级日志系统:Web + App 全端解决方案实战!
  • 【算法--链表】138.随机链表的复制--通俗讲解
  • Nodejs(③Stream)
  • iOS 26支持的设备列表
  • 日记 - 2025.9.10 读研日记(一)
  • 【JVM】故障诊断和性能监控命令
  • Java大厂面试实录:在线教育场景下微服务架构与智能推荐实践(含技术详解)
  • 实战:HarmonyOS 中 HEIF 图像开发全流程(转码篇 兼容场景)
  • 融智学生活方式DBA 小生境融智:身心健康就是美,抓住刚需就是赢
  • 【高级】系统架构师 | 2025年上半年综合真题DAY3
  • CentOS 7部署Zabbix5.0
  • [rStar] 策略与奖励大语言模型
  • 使用命令centos把普通用户设置为管理员
  • 机器学习实操项目03——Scikit-learn介绍及简单分类案例
  • 了解网站安全监测系统的重要性
  • 图像尺寸和CMOS的关联
  • 视频转webp批量处理工具哪个好?这里有答案
  • cuda-NCCL笔记(3)-- 分布式训练LeNet
  • Android Studio开发环境配置
  • 【springboot+vue3】博客论坛管理系统(源码+文档+调试+基础修改+答疑)
  • 中台的万象
  • 从Grok 4多智能体协同到RAG范式革命:2025年AI工作流的技术重构
  • pythonFlask 使用 SQLAlchemy 的连接池
  • 【系统架构设计(25)】Web应用服务器与现代架构
  • minikube 的 kubernetes 入门教程-Nginx Proxy Manager
  • ‌Git Bisect 二分查找定位错误总结
  • 基于大数据挖掘的药品不良反应知识整合与利用研究