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

基于共享上下文和自主协作的 RD Agent 生态系统

在llm+angent+mcp这个框架中

  • LLM: 依然是智能体的“大脑”,赋予它们理解、推理、生成和规划的能力,并且也用于处理和利用共享上下文。
  • Agent: 具备特定 R&D 职能的自主单元,它们感知共享上下文,根据内置逻辑和 LLM 的推理决定自己的行动,并通过调用工具和更新共享上下文来执行任务。
  • MCP (Master Context Protocol) Service: 一个提供 API 的服务,用于:
    * 存储和检索所有 Agent 在特定任务或会话中的交互历史(对话、思考、行动、观察)。
    * 存储和更新共享的工作状态、关键变量、中间结果、需要共同关注的标记(如“需要人类审批”、“遇到冲突”)。
    * 将相关的长期记忆(Vector DB, KG)和当前任务上下文关联起来。
    * 可能还负责事件通知,当共享上下文的某个关键部分更新时通知相关 Agent。

基于 LLM+Agent+MCP (Context Protocol) 的 R&D 自动化平台

架构分层:

  1. 用户/输入层 (User/Input Layer): 用户输入 R&D 目标。一个 Task Initiator 接收输入并创建一个新的任务会话,初始化 MCP Context。
  2. Task Orchestration (Simplified): 不再是复杂的中心 Planner 生成详细 DAG。而是由 Task Initiator 或一个简单的 Session Manager 启动一个初始 Agent 或一组 Agent,并将它们指向新创建的 MCP Context。后续的流程推进主要依靠 Agent 之间的自主协作和对共享上下文的响应。
  3. Agent 层 (Agent Layer):
    • 各种 R&D Agent 实例。
    • 每个 Agent 内部结构:
      • LLM Core: Agent 的大脑。
      • Memory Module: 访问长期记忆 (Vector DB, KG)。
      • Tool Use Module: 调用外部工具。
      • MCP Interaction Module: 通过 API 调用 MCP Service,进行以下操作:
        • GetContext(task_id): 获取当前任务的完整或过滤后的共享上下文。
        • AppendMessage(task_id, message_type, content): 添加新的消息到历史(如自己的思考、行动、观察)。
        • UpdateSharedState(task_id, key, value): 更新共享工作状态。
        • GetSharedState(task_id, key): 获取共享状态。
        • NotifyContextUpdate(task_id, key): (Optional) 通知 MCP Service 某个关键状态已更新。
    • Agent 的决策循环 (LLM 驱动):感知上下文 (通过 MCP Service) -> LLM 推理 -> 决定行动 (工具调用或更新上下文) -> 执行行动 -> 观察结果 -> 更新上下文 (通过 MCP Service) -> 重复。
  4. Tools & Environment 层 (Tools & Environment Layer): 外部 R&D 工具封装为 Agent 可调用的服务。
  5. Data & Knowledge 层 (Data & Knowledge Layer): 存储数据和长期知识。Agent 通过 Memory Module 与此层交互。MCP Service 也可能需要访问此层来 enriquecer 上下文。
  6. MCP (Master Context Protocol) Service Layer: 专门的服务层,提供上述 MCP Interaction Module 使用的 API,管理底层存储。
    • Context Storage: 数据库 (如支持 JSONB 的 PostgreSQL, MongoDB) 存储任务历史和共享状态。
    • Knowledge Linking: 可能与 Vector DB/KG 集成,根据上下文关联相关知识片段。
    • Event System (Optional): Kafka/RabbitMQ 用于 Context 更新通知。
  7. Observability Layer: 收集日志、指标、追踪。在 MCP (Context Protocol) 模式下,追踪尤其重要,通过追溯 Agent 之间的交互和上下文变化来理解流程。
  8. Global State Monitoring & Human-in-the-Loop: 一个独立的服务或 UI,监控 MCP Service 中存储的全局任务状态和关键标记(如“需要人类审批”)。当检测到特定状态时,通知人类。人类通过 UI 查看上下文,并可以通过 UI 修改共享状态或直接与 Agent 交互(通过向 Context 中添加特定消息)。
  9. Learning & Evolution Layer: 分析 MCP Service 中存储的丰富的交互历史和任务结果,用于学习 Agent 协作模式、优化 Prompt、改进工具使用、训练迭代策略。

LLM 在各层的具体作用 (Refined):

  • Task Initiator: 使用 LLM 简单解析初始目标,决定启动哪些初始 Agent 并初始化 MCP Context。
  • Agent (Core Logic):
    • Contextual Reasoning: LLM 接收从 MCP Service 获取的当前上下文(历史、状态),结合自身角色和长期记忆,进行推理。Prompt 会包含:“你是一个 [Agent Role]。当前任务目标是 X。以下是迄今为止的讨论和状态:[从 MCP Service 获取的历史和状态]。你的下一步行动是什么?思考过程和行动请记录到上下文中。”
    • Self-Planning: LLM 在当前上下文中生成自己的行动计划。
    • Tool Parameter Generation: LLM 根据上下文和计划生成工具调用的具体参数。
    • Observation Interpretation: LLM 解释工具执行结果或从 MCP Service 获取的其他 Agent 的更新。
    • Context Formatting: LLM 生成要添加到共享上下文中的结构化或非结构化内容(思考、行动、观察、总结、发现)。
  • Global State Monitoring / HITL: LLM 可以辅助分析共享上下文,提取关键摘要或检测潜在问题,呈现给人类。

技术栈与实现思路 (基于 MCP Service):

  • MCP (Master Context Protocol) Service 实现:
    • Backend Framework: FastAPI 或 Spring Boot 构建 RESTful API。
    • Context Storage: PostgreSQL with JSONB column 或 MongoDB 存储 Context Document。每个任务一个 Document,包含 history (array of messages) 和 shared_state (JSON object)。
    • API Endpoints:
      • /tasks/{task_id}/context: GET - 获取上下文
      • /tasks/{task_id}/messages: POST - 添加消息到历史
      • /tasks/{task_id}/state: GET/POST/PUT - 获取/更新共享状态
      • /tasks: POST - 创建新任务上下文
    • Knowledge Linking: 内部逻辑根据 Context 中的关键词或实体,查询 Vector DB 或 KG,并将相关知识片段添加到 Context 中(或提供链接)。
  • Agent Layer 实现:
    • Agent Framework: AutoGen (非常适合多 Agent 对话,只需调整其通信机制使用 MCP Service) 或 LangChain (构建单个 Agent)。
    • MCP Interaction Module: Agent 代码内部封装对 MCP Service API 的调用。
    • Agent Reasoning Prompt: 核心 Prompt 引导 Agent 使用 MCP API 获取和更新上下文。
    • Deployment: Kubernetes 容器化部署。
  • Task Initiator & Global State Monitor:
    • 一个简单的 Web 服务或命令行工具作为 Initiator,调用 MCP Service 创建新任务,启动初始 Agent。
    • Global State Monitor 是一个后台服务,定期查询 MCP Service 的任务状态,或监听 Context 更新事件,并在 UI 上展示。
  • Workflow Engine (Optional / Simplified Role): 如果需要更强的流程控制(如顺序执行、条件分支),Workflow Engine 仍有用武之地,但它的任务步骤不再是“调用一个 Agent 完成所有工作”,而是“等待 MCP Context 中的某个状态达到特定值”、“向 Context 添加一条消息触发某个 Agent”。或者,一个“流程管理 Agent”可以利用 MCP 协调其他 Agent 完成一个流程。
  • 其他层: 与之前方案类似 (Kubernetes, Kafka/RabbitMQ, Databases, Observability Stack)。

实现流程概念伪代码:

1. MCP (Master Context Protocol) Service (Simplified FastAPI Example)

# Pseudo-code for MCP Service using FastAPI
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Dict, Any
import uuid
import timeapp = FastAPI()# In-memory storage for simplicity, replace with DB in production
contexts: Dict[str, Dict[str, Any]] = {}class Message(BaseModel):sender_id: strsender_type: str # e.g., "agent", "human", "system"type: str # e.g., "thought", "action", "observation", "tool_call", "tool_result", "human_input", "status_update"content: Anytimestamp: float = Field(default_factory=time.time)class TaskContext(BaseModel):task_id: strcreated_at: float = Field(default_factory=time.time)messages: List[Message] = [] # History of interactionsshared_state: Dict[str, Any] = {} # Key-value pairs for shared state# Add fields for linked knowledge, relevant documents etc.@app.post("/tasks", response_model=TaskContext)
def create_task(initial_goal: str):task_id = str(uuid.uuid4())new_context = TaskContext(task_id=task_id, shared_state={"status": "CREATED", "initial_goal": initial_goal})contexts[task_id] = new_context.model_dump() # Store as dict for mutationprint(f"Task {task_id} created.")return new_context@app.get("/tasks/{task_id}/context", response_model=TaskContext)
def get_context(task_id: str):if task_id not in contexts:raise HTTPException(status_code=404, detail="Task not found")return TaskContext(**contexts[task_id]) # Return as Pydantic model@app.post("/tasks/{task_id}/messages")
def add_message(task_id: str, message: Message):if task_id not in contexts:raise HTTPException(status_code=404, detail="Task not found")contexts[task_id]['messages'].append(message.model_dump())# Optional: Trigger event notification hereprint(f"Task {task_id}: Added message from {message.sender_id} ({message.type})")return {"status": "success"}@app.put("/tasks/{task_id}/state")
def update_shared_state(task_id: str, state_update: Dict[str, Any]):if task_id not in contexts:raise HTTPException(status_code=404, detail="Task not found")contexts[task_id]['shared_state'].update(state_update)# Optional: Trigger event notification if specific keys updatedprint(f"Task {task_id}: Updated shared state: {state_update}")return {"status": "success"}@app.get("/tasks/{task_id}/state", response_model=Dict[str, Any])
def get_shared_state(task_id: str):if task_id not in contexts:raise HTTPException(status_code=404, detail="Task not found")return contexts[task_id]['shared_state']# Run with: uvicorn mcp_service:app --reload

2. Agent Layer: Example Agent (Literature Review Agent) - Interacting with MCP

# Pseudo-code for a Literature Review Agent's internal logic (Simplified)
from agent_core_base import AgentCore # Base class handles LLM, Memory, Tools
from tools import SearchPubMedTool, SummarizeTextTool
from mcp_client import MCPClient # Custom client for MCP Service APIclass LiteratureReviewAgent(AgentCore): # Inherit from base Agent classdef __init__(self, id, llm, memory, tools, mcp_client: MCPClient, task_id: str):super().__init__(id, llm, memory, tools)self.mcp_client = mcp_clientself.task_id = task_id # Agent is initialized for a specific task contextdef run(self):# Agent starts its execution loopprint(f"Agent {self.id}: Starting execution for task {self.task_id}")try:while True:# 1. Get current context from MCPcontext = self.mcp_client.get_context(self.task_id)current_history = context['messages']shared_state = context['shared_state']# Check if task is already completed or requires human interventionif shared_state.get('status') == 'COMPLETED' or shared_state.get('status') == 'NEEDS_HUMAN_REVIEW':print(f"Agent {self.id}: Task status is {shared_state.get('status')}. Exiting.")break # Exit loop# 2. LLM Reasoning based on context# Craft a prompt that includes the history and state from contextprompt = self.generate_reasoning_prompt(current_history, shared_state)llm_response = self.llm.chat(prompt) # Assuming chat modelthought = extract_thought_from_llm_response(llm_response) # Needs parsingaction = extract_action_from_llm_response(llm_response) # Needs parsing (tool call or update_state)# 3. Log thought to MCPself.mcp_client.add_message(self.task_id, self.id, "thought", thought)if action:action_type = action['type']action_details = action['details']# 4. Log action to MCPself.mcp_client.add_message(self.task_id, self.id, "action", action)if action_type == "tool_call":tool_name = action_details['tool_name']tool_params = action_details['tool_params']print(f"Agent {self.id}: Calling tool {tool_name} with {tool_params}")try:tool_result = self.use_tool(tool_name, tool_params)print(f"Agent {self.id}: Tool {tool_name} returned {tool_result}")# 5. Log observation/tool result to MCPself.mcp_client.add_message(self.task_id, self.id, "observation", tool_result)self.mcp_client.add_message(self.task_id, self.id, "tool_result", tool_result)# 6. Based on result, maybe update shared state?if self.check_if_literature_complete(tool_result): # Agent's own logicself.mcp_client.update_shared_state(self.task_id, {"literature_review_status": "COMPLETED", "literature_summary": tool_result['summary']})print(f"Agent {self.id}: Literature review task completed.")# Agent might choose to exit here, or LLM might decide the next step# break # Example: Exit after completionexcept Exception as tool_error:error_msg = f"Tool {tool_name} failed: {tool_error}"print(error_msg)# 5. Log error to MCPself.mcp_client.add_message(self.task_id, self.id, "observation", {"error": error_msg})self.mcp_client.update_shared_state(self.task_id, {"status": "ERROR_IN_LIT_REVIEW", "error_details": error_msg})# Agent might decide to stop or seek helpbreak # Example: Exit on major errorelif action_type == "update_state":state_updates = action_details['updates']self.mcp_client.update_shared_state(self.task_id, state_updates)print(f"Agent {self.id}: Updated shared state with {state_updates}")elif action_type == "delegate": # Example: Agent decides to delegate to another agent typetarget_agent_type = action_details['agent_type']delegation_task = action_details['task_description']# Log this delegation to the context so other agents can see itself.mcp_client.add_message(self.task_id, self.id, "delegation", {"to_agent_type": target_agent_type, "description": delegation_task})# The Session Manager or another Agent might pick this up and launch the new agent# This requires other components monitoring the contextelif action_type == "report_completion": # Agent signals its part is donefinal_summary = action_details['summary']self.mcp_client.update_shared_state(self.task_id, {"literature_review_status": "FINALIZED", "final_summary": final_summary})self.mcp_client.add_message(self.task_id, self.id, "status_update", {"status": "Literature review finalized"})print(f"Agent {self.id}: Reported finalization.")# break # Agent might exit after its specific sub-task is done# ... other action types (e.g., ask_human_for_help)else: # LLM didn't generate a valid action or signaled completion implicitly# Needs logic to detect if LLM is stuck or implicitly finishedprint(f"Agent {self.id}: LLM returned no valid action or finished.")# Maybe update state to signal potential stagnation or sub-task completion?# self.mcp_client.update_shared_state(self.task_id, {"status": "LIT_REVIEW_AGENT_STALLED"})break # Example: Exit looptime.sleep(5) # Prevent tight loop, allow other agents to potentially actexcept Exception as e:print(f"Agent {self.id} encountered fatal error: {e}")# Log fatal error and update global stateself.mcp_client.add_message(self.task_id, self.id, "system_error", {"error": str(e)})self.mcp_client.update_shared_state(self.task_id, {"status": "FATAL_ERROR", "error_source": self.id, "error_details": str(e)})def generate_reasoning_prompt(self, history, shared_state):# Craft the core prompt for the LLM, injecting relevant history and statehistory_text = "\n".join([f"{msg['sender_type']} ({msg['sender_id']}) [{msg['type']}]: {msg['content']}" for msg in history])state_text = json.dumps(shared_state, indent=2)prompt = f"""You are a {self.agent_type} with ID {self.id}. Your current task context (ID: {self.task_id}) is managed by the Master Context Protocol Service.Review the task history and shared state below. Determine your next step to contribute to the overall R&D goal defined in the shared state ('initial_goal').Your actions should be one of the following types: 'tool_call', 'update_state', 'delegate', 'report_completion', 'ask_human_for_help'.Output your thought process first, then your chosen action in JSON format. If no action is needed now, explain why.Current Shared State:{state_text}Task History:{history_text}Available Tools: {list(self.tools.keys())}Think step-by-step. What is the current situation? What needs to be done next based on the goal and state? Which action is most appropriate?"""return promptdef check_if_literature_complete(self, tool_result):# Agent-specific logic to determine if its sub-task is done# E.g., check if a summary is generated, if enough papers were reviewed, etc.pass # Placeholder# use_tool method would be similar to previous examples, calling external services# class AgentCoreBase would handle the LLM interaction and basic structure

3. Task Initiator & Global State Monitor (Simplified)

# Pseudo-code for Task Initiator (e.g., a simple script or service)
from mcp_client import MCPClientmcp_client = MCPClient(mcp_service_url="http://mcp_service:8000") # Point to MCP Servicedef start_new_rnd_task(user_goal: str):print(f"Initiating R&D task with goal: {user_goal}")# 1. Create a new context for the tasknew_context = mcp_client.create_task(user_goal)task_id = new_context['task_id']print(f"New task created with ID: {task_id}")# 2. Start initial Agent(s) and provide them with the task_id# This requires knowing which agent(s) should start based on the initial goal# This logic could be hardcoded, rule-based, or even LLM-decided by the Initiator.initial_agent_types = ["Literature Review Agent", "Hypothesis Generation Agent"] # Examplefor agent_type in initial_agent_types:# Assume a way to launch an agent instance (e.g., calling a Kubernetes API to create a Pod,# or calling an Agent Management Service)launch_agent_instance(agent_type, task_id) # This function starts the Agent processprint(f"Launched initial agent: {agent_type} for task {task_id}")print("Initial agents launched. Monitoring task state via MCP.")# Pseudo-code for Global State Monitor (e.g., a background process or UI component)
def monitor_rnd_tasks():mcp_client = MCPClient(mcp_service_url="http://mcp_service:8000")while True:# 1. Get overview of tasks (e.g., list all tasks or recent ones)tasks_overview = mcp_client.list_tasks() # Needs a list_tasks endpoint in MCP Servicefor task_summary in tasks_overview:task_id = task_summary['task_id']current_state = mcp_client.get_shared_state(task_id)print(f"Task {task_id}: Status - {current_state.get('status', 'N/A')}, Goal - {current_state.get('initial_goal', 'N/A')}")# Check for specific conditions needing human attentionif current_state.get('status') == 'NEEDS_HUMAN_REVIEW':print(f"ALERT: Task {task_id} needs human review!")# Trigger notification (email, slack) and provide link to UI showing contextif current_state.get('status') == 'FATAL_ERROR':print(f"ALERT: Task {task_id} encountered FATAL ERROR!")# Trigger notificationtime.sleep(60) # Check every minute# launch_agent_instance(agent_type, task_id) pseudo-code:
# This function is part of the Agent Management layer, not MCP itself.
# It would typically interact with Kubernetes to deploy a pod,
# passing task_id and MCP Service endpoint as environment variables or arguments
# so the Agent knows which context to join.
def launch_agent_instance(agent_type, task_id):# Example: Call Kubernetes API to create a Podk8s_client = get_kubernetes_client()pod_manifest = {"apiVersion": "v1","kind": "Pod","metadata": {"generateName": f"{agent_type.lower().replace(' ', '-')}-"},"spec": {"containers": [{"name": "agent","image": f"your_agent_image:{agent_type.lower().replace(' ', '-')}", # Need different images or config for each type"env": [{"name": "AGENT_ID", "value": str(uuid.uuid4())},{"name": "AGENT_TYPE", "value": agent_type},{"name": "TASK_ID", "value": task_id},{"name": "MCP_SERVICE_URL", "value": "http://mcp_service:8000"},# ... other env vars for LLM endpoint, DBs, etc.]}],"restartPolicy": "Never" # Or OnFailure depending on desired behavior}}k8s_client.create_namespaced_pod("default", pod_manifest)print(f"Requested Kubernetes to launch {agent_type} pod for task {task_id}")

与 Dify / AutoGen 的结合:

  • Dify: Dify 的 Agent 能力和 Workflow 可以在这个框架中用于构建单个具备复杂工具使用或 RAG 能力的 Agent 类型。您可以将一个 Dify Agent App 或 Workflow 视为一个黑盒的、可通过 API 调用的服务,这个服务内部可能集成了 LLM 和工具。然后,您的定制 Agent 代码(如上面伪代码中的 LiteratureReviewAgent)在需要时,不是直接调用底层工具,而是调用这个 Dify Agent 的 API 来完成一个子任务。Dify 的 RAG 和 Prompt 管理能力依然非常有用。
  • AutoGen: AutoGen 本身就是一个多 Agent 框架,它有自己的基于消息传递的协作机制。您可以选择使用 AutoGen 内置的群聊或工作流,而是将 AutoGen 的 Agent 类用作构建单个 Agent 实例(它负责自身的 LLM、Tool Use 等)的基础,然后修改 AutoGen Agent 的通信层,使其通过调用您的 MCP Service API 来发送和接收消息(即 send 方法写入 MCP,receive 方法从 MCP 读取相关消息)。或者,更简单地,将 整个 AutoGen GroupChat 视为一个复杂的 Agent 类型,通过 MCP Service 接收任务,然后它在内部使用 AutoGen 的机制完成任务,最后将最终结果和关键过程总结更新到 MCP Context 中。

优势 (与中心控制程序相比):

  • 更去中心化/自主性: Agent 更多地基于共享上下文和自身逻辑行动,理论上更灵活。
  • 潜在的更强的韧性: 某个 Agent 失败不一定导致整个系统停滞(如果其他 Agent 能感知到并接管或寻求帮助)。
  • 协作模式的灵活性: 不局限于预设的 DAG,可以通过 Agent 在 Context 中的对话和状态更新发展出更动态的协作。
  • 易于调试和理解 (如果 MCP 实现得好): 整个任务的执行过程和 Agent 交互记录在共享 Context 中,方便回溯。

挑战 (与中心控制程序相比):

  • 协调的复杂性: 确保所有 Agent 对任务目标和当前状态有共同理解,避免冲突、重复工作或遗漏关键步骤,需要更精巧的 Agent 设计和 Prompt Engineering。
  • 收敛性: 没有一个强中心的协调者来强制流程推进,如何确保 Agent 团队最终能够收敛到完成任务的状态,而不是陷入僵局或无效循环?需要 Agent 内置强大的自我纠错和寻求帮助(人类或特定管理 Agent)的能力。
  • Context 管理: 共享上下文可能变得非常庞大且包含噪音。如何让 Agent (LLM) 有效地从大量历史和状态信息中提取 relevant 信息进行决策,并避免 Context Window 限制?需要先进的 Context Management 技术(如 RAG on Context, summarization)。
  • 全局优化难度: 难以进行全局最优的资源分配和调度,因为决策是分布在各个 Agent 中的。

总结:

LLM + Agent + MCP (Master Context Protocol) 模式提供了一种构建 R&D 自动化平台的可行且更具自主性的思路。核心是将共享上下文作为 Agent 协作的中心媒介。MCP Service 负责管理这个共享上下文,而 Agent 则通过与 MCP Service 交互,感知环境、执行任务并影响环境。

实现的关键在于设计健壮的 MCP Service API、编写能够有效利用共享上下文进行推理和协作的 Agent Prompt 与内部逻辑、以及构建一套能够监控共享状态并适时介入的 Global State Monitor 和 Human-in-the-Loop 机制。

这个模式尤其适合需要更灵活、更接近人类团队协作模式的 R&D 任务,但对 Agent 设计的自主性和鲁棒性提出了更高的要求,并且需要解决共享上下文管理和任务收敛性等复杂问题。

相关文章:

基于共享上下文和自主协作的 RD Agent 生态系统

在llmangentmcp这个框架中: LLM: 依然是智能体的“大脑”,赋予它们理解、推理、生成和规划的能力,并且也用于处理和利用共享上下文。Agent: 具备特定 R&D 职能的自主单元,它们感知共享上下文&#xff0…...

Operating System 实验五 进程管理编程实验

实验目标: 写个多线程的程序,重现竞争条件,并通过信号量或者互斥量,解决临界区问题某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A、B两种零件,装配车间的任务是把A、B两种零件组装成产品。两个生产车间每生产一个零件后,都要分别把它们送到装配车间的货架F…...

Deep Reinforcement learning for real autonomous mobile robot navigation

​​​​​​​https://www.youtube.com/watch?vKyA2uTIQfxw AI Learns to Park - Deep Reinforcement Learning https://www.youtube.com/watch?vVMp6pq6_QjI Q Learning simply explained | SARSA and Q-Learning Explanation https://www.youtube.com/watch?vMI8ByADM…...

计算机网络 | 应用层(4)--DNS:因特网的目录服务

💓个人主页:mooridy-CSDN博客 💓文章专栏:《计算机网络:自定向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 🌹关注我,和我一起学习更多计算机网络的知识 🔝🔝 目录 …...

WPF核心技术解析与使用示例

WPF核心技术解析与使用示例 一、依赖属性(Dependency Property)详解 1. 依赖属性基础 ​​核心概念​​: 依赖属性是WPF实现数据绑定、样式、动画等特性的基础通过属性系统实现高效的内存管理和值继承​​标准定义模式​​: public class MyControl : Control {// 1. 定义…...

JVM运行机制全景图:从源码到执行的全过程

JVM运行机制全景图:从源码到执行的全过程 引言:你真的了解 Java 是怎么跑起来的吗? 许多开发者写完 Java 代码之后,就交给编译器和运行时去“神奇”地执行了。但你有没有想过,一段 .java 文件是如何一步步变成可运行的程序?今天,我们就从 源码 ➝ 字节码 ➝ 类加载 ➝…...

使用 AFL++ 对 IoT 二进制文件进行模糊测试 - 第二部分

在上一部分中,我们研究了如何使用 AFL++ 对简单的物联网二进制文件进行模糊测试。这些程序接受来自文件的输入,并且易于模糊测试。 在本文中,我们将研究套接字二进制文件。使用套接字进行网络通信的模糊测试二进制文件与使用基于文件 I/O 的模糊测试二进制文件不同。Vanill…...

在华为云平台上使用 MQTT 协议:构建高效可靠的物联网通信

🌐 在华为云平台上使用 MQTT 协议:构建高效可靠的物联网通信 随着物联网(IoT)技术的发展,设备间的高效通信变得尤为重要。MQTT(Message Queuing Telemetry Transport)作为一种轻量级的消息传输…...

基于STM32的物流搬运机器人

功能:智能循迹、定距夹取、颜色切换、自动跟随、自动避障、声音夹取、蓝牙遥控、手柄遥控、颜色识别夹取、循迹避障、循迹定距…… 包含内容:完整源码、使用手册、原理图、视频演示、PPT、论文参考、其余资料 资料只私聊...

H.264/AVC标准主流开源编解码器编译说明

An artisan must first sharpen his tools if he is to do his work well. 工欲善其事,必先利其器. 前言 想研究和学习H.264/AVC视频编解码标准的入门的伙伴们,不论是学术研究还是工程应用都离不开对源码的分析,因此首要工作是对各类编解码器进行编译,本文针对主流的一些符…...

Xilinx FPGA支持的FLASH型号汇总

以博主这些年的FPGA开发使用经验来看,FPGA开发的主流还是以Xilinx FPGA为主,贸易战关税战打了这么多年,我们做研发的也不可避免的要涉及一些国产替代的工作;这里把Xilinx FPGA官方支持的各类(国产和非国产)…...

【C++ 类和数据抽象】消息处理示例(1):从设计模式到实战应用

目录 一、数据抽象概述 二、消息处理的核心概念 2.1 什么是消息处理? 2.2 消息处理的核心目标 三、基于设计模式的消息处理实现 3.1 观察者模式(Observer Pattern) 3.2 命令模式(Command Pattern) 四、实战场景…...

LiveCharts.WPF图表模块封装

WPF LiveCharts.WPF 封装实现 下面是一个完整的 WPF LiveCharts.WPF 封装实现,提供了常用图表的简单使用方式,并支持数据绑定和更新。 一、LiveCharts.WPF 封装类 1. 图表基类 (ChartBase.cs) using LiveCharts; using LiveCharts.Wpf; using System.Collections.Generic;…...

微信小程序,基于uni-app的轮播图制作,轮播图本地文件图片预览

完整代码 <template><swiper class"banner" indicator-dots circular :autoplay"false"><swiper-item v-for "item in picture" :key"item.id"><view><image tap"onPreviewImage(item.img)" :…...

【QQmusic】复习笔记第四章分点讲解

4.1 音乐加载 功能概述 该部分实现了从本地磁盘加载音乐文件到程序中&#xff0c;并在界面上显示的功能。通过QFileDialog类创建文件选择对话框&#xff0c;用户可选择多个音乐文件&#xff0c;程序筛选出有效音频文件后&#xff0c;交由MusicList类管理&#xff0c;并更新到…...

设置右键打开VSCode

在日常的开发工作中&#xff0c;VSCode 是一款非常受欢迎的代码编辑器。为了更加便捷地使用它&#xff0c;我们可以将 VSCode 添加到右键菜单中&#xff0c;这样只需右键点击文件或文件夹&#xff0c;就能快速用 VSCode 打开&#xff0c;极大地提高工作效率。下面我就来介绍一下…...

数据结构和算法(八)--2-3查找树

目录 一、平衡树 1、2-3查找树 1.1、定义 1.2、查找 1.3、插入 1.3.1、向2-结点中插入新键 1.3.2、向一棵只含有一个3-结点的树中插入新键 1.3.3、向一个父结点为2-结点的3-结点中插入新键 1.3.4、向一个父结点为3-结点的3-结点中插入新键 1.3.5、分解根结点 1.4、2…...

JSAPI2.4——正则表达式

一、语法 const str 一二三四五六七八九十 //判断内容 const reg /二/ //判断条件 console.log(reg.test(str)); //检查 二、test与exec方法的区别 test方法&#xff1a;用于判断是否符合规则的字符串&#xff0c;返回值是布尔值 exec方法&…...

FPGA 100G UDP纯逻辑协议栈

随着器件等级的升高&#xff0c;高速serdes的线速率也随之提高&#xff0c;RFSOC 4x最大可支持100G&#xff0c;主流方案为RDMA方案&#xff0c;该方案相对比较复杂&#xff0c;除了需要负责逻辑端的开发&#xff0c;还需操作系统中开发RDMA的驱动&#xff0c;对于对丢包不那么…...

分享一个可以批量巡检GET和POST接口的Shell脚本

一、场景痛点与需求分析 在分布式系统架构中&#xff0c;服务接口的可用性和稳定性直接影响业务连续性。当面临以下场景时&#xff0c;需批量巡检GET和POST接口&#xff1a; 上线验证&#xff1a;新版本发布后批量验证核心接口 故障恢复&#xff1a;异常数据修复后的批量重试…...

机器学习之一:机械式学习

正如人们有各种各样的学习方法一样&#xff0c;机器学习也有多种学习方法。若按学习时所用的方法进行分类&#xff0c;则机器学习可分为机械式学习、指导式学习、示例学习、类比学习、解释学习等。这是温斯顿在1977年提出的一种分类方法。 有关机器学习的基本概念&#xff0c;…...

区分PROJECT_SOURCE_DIR, CMAKE_SOURCE_DIR,CMAKE_CURRENT_SOURCE_DIR

目录 示例工程 PROJECT_SOURCE_DIR的行为 CMAKE_SOURCE_DIR的行为 CMAKE_CURRENT_SOURCE_DIR 示例工程 根目录 |-----CMakeLists.txt |-----sub1 |--------CMakeLists.txt |-----sub2 |--------CMakeLists.txt 根目录下的CMakeList.txt: project(main)message("main …...

Python循环结构深度解析与高效应用实践

引言&#xff1a;循环结构在编程中的核心地位 循环结构作为程序设计的三大基本结构之一&#xff0c;在Python中通过while和for-in两种循环机制实现迭代操作。本文将从底层原理到高级应用&#xff0c;全面剖析Python循环机制的使用技巧与优化策略&#xff0c;助您掌握高效迭代的…...

25【干货】在Arcgis中根据字段属性重新排序并自动编号的方法(二)

上一篇关于属性表自动编号的文章因为涉及到代码&#xff08;【干货】在Arcgis中根据字段属性重新排序并自动编号的方法&#xff08;一&#xff09;&#xff09;&#xff0c;担心大家有些东西确实不熟悉&#xff0c;今天就更新一篇不需要代码也能达到这个目的的方法。主要的思路…...

SinSR模型剪枝实验报告

SinSR模型剪枝实验报告 实验概述 我成功地对SinSR模型进行了L1范式剪枝&#xff0c;剪枝比例为50%。通过分析剪枝前后的模型参数和性能&#xff0c;我们得出了以下结论。 剪枝实现方法 创建专用的main_prune.py脚本&#xff0c;用于剪枝训练。创建quick_prune.py脚本&#…...

IT社团分析预测项目(pandas、numpy、sklearn)

IT社团人数的增长陷入迟滞&#xff0c;同时不同目标任务和不同经营模式的社团更是层出不穷。在面临内忧外患的情况下&#xff0c;本社团希望结合社团行业现状&#xff0c;分析同学和出勤的数据&#xff0c;挖据数据中的信息&#xff0c;通过对人数流失进行预测寻找到相应的对策…...

C语言中位段的应用

一&#xff0c;位段的主要应用场景 硬件寄存器操作 嵌入式开发中&#xff0c;硬件寄存器通常以位为单位控制设备状态。位段可直接映射到寄存器&#xff0c;简化位操作&#xff1a; typedef struct {unsigned int enable : 1; // 使能位unsigned int mode : 3; // 模式选择&…...

【Linux网络#1】:网络基础知识

1、网络发展 在计算机发展历程中&#xff0c;经历过下面四个阶段&#xff1a; 1.独立模式 独立模式&#xff1a;计算机之间相互独立&#xff0c;每台计算机做自己的事情&#xff0c;彼此之间没有直接信息传递。如果两台计算机需要通信就需要将当前计算机的数据通过某种方式拷贝…...

基于物联网的园林防火监测系统

标题:基于物联网的园林防火监测系统 内容:1.摘要 随着全球气候变化和人类活动影响&#xff0c;园林火灾发生频率呈上升趋势&#xff0c;给生态环境和人类生命财产造成巨大损失。为有效预防和应对园林火灾&#xff0c;本文提出基于物联网的园林防火监测系统。该系统综合运用传感…...

华为云loT物联网介绍与使用

&#x1f310; 华为云 IoT 物联网平台详解&#xff1a;构建万物互联的智能底座 随着万物互联时代的到来&#xff0c;物联网&#xff08;IoT&#xff09;已成为推动数字化转型的关键技术之一。华为云 IoT 平台&#xff08;IoT Device Access&#xff09;作为华为云的核心服务之…...

Redis 数据类型全览:特性、场景与操作实例

Redis 是一款开源的内存数据库&#xff0c;支持多种数据类型&#xff0c;以下是对常见 Redis 数据类型的介绍&#xff1a; 1. String&#xff08;字符串&#xff09; 描述 字符串是 Redis 里最基础的数据类型&#xff0c;其值可以是简单的字符串、数字&#xff0c;甚至是二进…...

Qt动态库信号崩溃问题解决方案

在Qt中&#xff0c;当动态库向主程序发送信号导致崩溃时&#xff0c;通常涉及线程安全或对象生命周期问题。以下是逐步解决方案&#xff1a; 1. 检查线程上下文 问题&#xff1a;动态库所在的线程与主程序线程不同&#xff0c;跨线程信号未正确处理。解决方案&#xff1a; 显式…...

Go设计模式-观察者模式

简介 在软件开发中&#xff0c;我们常常会遇到这样的场景&#xff1a;一个对象的状态变化需要通知到多个其他对象&#xff0c;让它们做出相应的反应。观察者模式&#xff08;Observer Pattern&#xff09;就是解决这类问题的一种设计模式。在 Go 语言中&#xff0c;由于其简洁…...

《TCP/IP详解 卷1:协议》之第七、八章:Ping Traceroute

目录 一、ICMP回显请求和回显应答 1、ICMP回显请求 2、ICMP回显应答 二、ARP高速缓存 三、IP记录路由选项&#xff08;Record Route&#xff0c;RR&#xff09; 1、记录路由选项的工作过程 2、RR 选项的 IP 头部格式 2.1、RR 请求 2.2、RR响应 四、ping 的去返路径 五…...

Unity任务系统笔记

数据结构设计 任务基类包括的字段&#xff1a; string 任务内容&#xff1b; Transform 任务目的地&#xff1b; MyCharacter 任务开启后要更新对话的NPC&#xff1b; MyTalkData 任务开启后相关NPC要说的对话数据&#xff1b; 共同方法&#xff1a;开启任务、完成任务。…...

Three.js + React 实战系列-3D 个人主页:构建 Hero 场景组件(项目核心)✨

在本节中&#xff0c;我们将完成整个 3D 主业项目中最核心的组件 —— Hero.jsx。 这个组件作为首页的主视觉部分&#xff0c;整合了 3D 模型、动画相机、交互按钮与自适应布局&#xff0c;构建出一个立体、酷炫、可交互的主场景。 前置准备&#xff1a; ✅安装依赖&#xff…...

线程池(二):深入剖析synchronized关键字的底层原理

线程池&#xff08;二&#xff09;&#xff1a;深入剖析synchronized关键字的底层原理 线程池&#xff08;二&#xff09;&#xff1a;深入剖析synchronized关键字的底层原理一、基本使用1.1 修饰实例方法1.2 修饰静态方法1.3 修饰代码块 二、Monitor2.1 Monitor的概念2.2 Moni…...

网络原理 - 9

目录 数据链路层 以太网 以太网帧格式 MAC 地址 DNS&#xff08;Domain Name System&#xff09; 完&#xff01; 数据链路层 这里的内容也是简单了解&#xff0c;除非是做交换机开发&#xff0c;一般程序员不需要涉及~~ 以太网 ”以太网“不是一种具体的网络&#xf…...

springboot入门-业务逻辑核心service层

在 Spring Boot 中&#xff0c;Service 层是业务逻辑的核心&#xff0c;负责协调数据访问层&#xff08;Repository 或 Mapper&#xff09;和控制器层&#xff08;Controller&#xff09;&#xff0c;处理业务规则、事务管理以及数据转换。以下是 Service 层的详细说明、常用注…...

在RHEL 10上安装和配置TFTP服务器(不使用xinetd)

RHEL10已经废弃xinetd&#xff0c;使用下面的方式安装配置TFTP服务器。 1. 安装TFTP服务器和客户端 sudo dnf install tftp-server tftp -y 2. 配置TFTP服务器 创建TFTP根目录并设置权限 sudo mkdir -p /var/lib/tftpboot sudo chmod -R 777 /var/lib/tftpboot sudo chown -R…...

AIGC在游戏开发中的革命:自动化生成3A级游戏内容

一、智能游戏开发架构 1.1 传统开发痛点与AIGC创新 开发环节 传统痛点 AIGC解决方案 角色原画设计 美术资源产能瓶颈 文生图3D模型自动生成 场景搭建 重复劳动占比高 程序化生成风格迁移 NPC行为设计 模式化严重 强化学习驱动智能行为 任务系统 剧情线性缺乏变化 动态剧情生成系…...

ChatGPT、deepseek、豆包、Kimi、通义千问、腾讯元宝、文心一言、智谱清言代码能力对比

均使用测试时的最强模型 均是一次对话,对话内容一样 均开启深度思考 能联网的都联网了&#xff0c;但是作用不大&#xff0c;因为蓝桥杯刚考完&#xff0c;洛谷题目刚上传没多久 问题一测试了两遍 从问题三开始不再测试智谱清言&#xff08;它思考时间太长了&#xff0c;前两个…...

Linux扩展

目录 扩展 查找如何进行后台运行程序的指令 使用 & 符号 使用 nohup 命令 使用 screen 或 tmux find命令 基本语法 常用选项 grep 命令 基本语法 常用选项 如何使用 vim 直接定位到错误行 1. 使用 :make 和 :copen 2. 使用 :lineno 定位 3. 通过 :grep 或 :…...

Java Hotspot VM researcher

** therefore, careful design and understanding of modules are essential to fully reap the performance benefits. **...

java—基础

目标 ├── 第一阶段&#xff1a;内容清单 │ └── 目标&#xff1a;建立编程思想 ├── 第二阶段&#xff1a;内容清单 │ └── 目标&#xff1a;提升编程能力 └── 第三阶段&#xff1a;内容清单└── 目标&#xff1a;分析需求&#xff0c;代码实现能力以下是根…...

【OpenCV】第二章——图像处理基础

图像处理基础学习笔记 本章节详细介绍了图像处理的基础内容&#xff0c;包括图像的读取、显示、保存&#xff0c;基本属性的查看&#xff0c;图像的变换与操作&#xff0c;以及常用的图像处理方法。 目录 图像的读取与显示图像基本属性图像的灰度化与二值化图像的色彩空间转换…...

在WSL2+Ubuntu22.04中通过conda pack导出一个conda环境包,然后尝试导入该环境包

如何导出一个离线conda环境&#xff1f;有两种方式&#xff0c;一种是导出env.yml即环境配置&#xff0c;一种是通过conda pack导出为一个环境包&#xff0c;前者只是导出配置&#xff08;包括包名、版本等&#xff09;&#xff0c;而后者是直接将环境中所有的内容打包&#xf…...

C++:类和对象(上)---镜中万象:C++类的抽象之境与对象的具体之象

类&#xff08;Class&#xff09;是一种用户自定义的数据类型。 文章目录&#xff1a; 前言一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 3.1类是什么&#xff1f; 3.2类的定义 四、类的访问限定符和封装 4.1类的访问限定符 4.2封装 五、类和对象的关系 六、类对…...

碰一碰发视频源码搭建全解析,支持OEM

在数字化交互体验不断升级的背景下&#xff0c;“碰一碰发视频” 功能凭借其便捷性和趣味性&#xff0c;逐渐成为营销推广、社交分享等场景中的热门需求。该功能基于近场通信技术&#xff0c;实现设备间快速的数据传输。本文将详细介绍其源码搭建过程&#xff0c;助力开发者实现…...

搭建spark-local模式

要搭建Spark的local模式&#xff0c;你可以按照以下步骤进行操作&#xff08;以在Linux系统上安装为例&#xff0c;假设你已经安装了Java环境&#xff09;&#xff1a; 1. 下载Spark安装包&#xff1a;访问Spark官方网站&#xff08;https://spark.apache.org/downloads.html&a…...