spring-ai-alibaba-deepresearch 學習(十四)——CoderNode

本篇為spring-ai-alibaba學習系列第四十篇

前面介紹?ParalellExecutorNode 會為后續的 m?個 CoderNode 分配任務

現在來看一下處理型任務的處理節點 coder_{i}

該類節點主要負責執行一些操作,例如執行python代碼、調用mcp等

提示詞

以下是該文檔的中文翻譯:---
當前時間: {{ CURRENT_TIME }}
---你是一個由 `supervisor` 代理管理的 `coder` 代理。
你是一名專業的軟件工程師,精通 Python 腳本編寫。你的任務是分析需求、使用 Python 實現高效的解決方案,并清晰地記錄你的方法和結果。# 步驟1. **需求分析**:仔細審查任務描述,理解目標、約束條件和預期成果。
2. **制定解決方案**:確定任務是否需要 Python。概述實現解決方案所需的步驟。
3. **實現解決方案**:- 使用 Python 進行數據分析、算法實現或問題解決。- 在 Python 中使用 `print(...)` 打印輸出以顯示結果或調試值。
4. **列出所有必需的第三方依賴項**:以 `requirements.txt` 的格式列出此 Python 代碼所需的所有第三方依賴項,例如 `numpy==2.2.6`。如果沒有第三方依賴項,則跳過此步驟。
5. **測試解決方案**:驗證實現以確保其滿足要求并處理邊緣情況。
6. **記錄方法論**:提供對你方法的清晰解釋,包括你選擇背后的原因和所做的任何假設。
7. **展示結果**:清楚地顯示最終輸出和任何必要的中間結果。# 注意事項- 始終確保解決方案高效且遵循最佳實踐。
- 優雅地處理邊緣情況,例如空文件或缺失輸入。
- 在代碼中使用注釋以提高可讀性和可維護性。
- 如果你想查看某個值的輸出,必須使用 `print(...)` 將其打印出來。
- 始終且僅使用 Python 進行數學運算。
- 始終使用 `yfinance` 獲取金融市場數據:- 使用 `yf.download()` 獲取歷史數據- 使用 `Ticker` 對象訪問公司信息- 使用適當的時間范圍進行數據檢索
- 所需的 Python 包未預安裝,你應該提供 `requirements.txt`:- `pandas` 用于數據操作- `numpy` 用于數值運算- `yfinance` 用于金融市場數據
- 始終以 **{{ locale }}** 語言環境進行輸出。
- 如果代碼執行失敗,在最多重試 3 次后必須中止。

使用方法

spring.ai.alibaba.deepresearch.python-coder 相關配置

Coder節點的Python執行器跑在Docker容器中,需要額外為其配置Docker信息

在配置文件的spring.ai.alibaba.deepreserch.python-coder.docker-host字段中設置DockerHost,默認為unix:///var/run/docker.sock

本項目需要使用python:3-slim鏡像創建臨時容器,也可以自己定制包含一些常用的第三方庫的鏡像,第三方庫需要安裝在鏡像的/app/dependency文件夾里,在配置文件中設置spring.ai.alibaba.deepreserch.python-coder.image-name的值指定鏡像名稱

節點產出

coder_content_{i}:碼農節點大模型返回的響應數據

源碼跟蹤

跟蹤:在 DeepResearchConfiguration 中,會根據用戶配置的碼農節點個數生成 m?個coder_{i} 節點實例,類型為 CoderNode,每個節點有唯一的節點 id;

添加從 paralell_executor 到 coder_{i} 的邊和從 coder_{i} 到 research_team 的邊,這意味著 m?個 coder_{i} 節點會并行處理

創建時需要4個參數 coderAgent, String.valueOf(i), reflectionProcessor,?mcpProviderFactory

i 為當前節點編號

coderAgent:ChatClient類型,添加了 coder 提示詞,并注冊了一個可以執行 python 代碼的工具

reflectionProcessor:反思處理器

mcpProviderFactory:mcp提供者工廠

研究:CoderNode 的 apply 方法整體流程如下:

1)首先獲取研究計劃中屬于當前節點需要處理的步驟

2)若開啟反思且步驟狀態為待反思,則進入反思處理邏輯,反思通過則修改狀態為完成,否則修改狀態為待處理

3)修改步驟狀態為處理中

4)若開啟mcp,將mcp注冊進 coderAgent,然后將當前步驟內容及反思內容傳入 coderAgent 獲取響應

5)根據是否開啟反思,將步驟狀態修改為待反思或完成

附 apply 方法源碼

    public Map<String, Object> apply(OverAllState state) throws Exception {logger.info("coder node {} is running for thread: {}", executorNodeId, state.value("thread_id", "__default__"));Plan currentPlan = StateUtil.getPlan(state);Map<String, Object> updated = new HashMap<>();Plan.Step assignedStep = findAssignedStep(currentPlan);if (assignedStep == null) {logger.info("No remaining steps to be executed by {}", nodeName);return updated;}// Handle reflection logicif (reflectionProcessor != null) {ReflectionProcessor.ReflectionHandleResult reflectionResult = reflectionProcessor.handleReflection(assignedStep, nodeName, "coder");if (!ReflectionUtil.shouldContinueAfterReflection(reflectionResult)) {logger.debug("Step {} reflection processing completed, skipping execution", assignedStep.getTitle());return updated;}}// Mark step as processingassignedStep.setExecutionStatus(StateUtil.EXECUTION_STATUS_PROCESSING_PREFIX + nodeName);try {// Build task messagesList<Message> messages = List.of(new UserMessage(buildTaskMessageWithReflectionHistory(assignedStep, state.value("locale", "en-US"))));logger.debug("{} Node message: {}", nodeName, messages);// 調用agentvar requestSpec = coderAgent.prompt().messages(messages);// 使用MCP工廠創建MCP客戶端AsyncMcpToolCallbackProvider mcpProvider = mcpFactory != null? mcpFactory.createProvider(state, "coderAgent") : null;if (mcpProvider != null) {requestSpec = requestSpec.toolCallbacks(mcpProvider.getToolCallbacks());}// Create stream with error handlingvar streamResult = requestSpec.stream().chatResponse().doOnError(error -> StateUtil.handleStepError(assignedStep, nodeName, error, logger));// Add step titleboolean isReflectionNode = assignedStep.getReflectionHistory() != null&& !assignedStep.getReflectionHistory().isEmpty();String prefix = isReflectionNode ? StreamNodePrefixEnum.CODER_REFLECT_LLM_STREAM.getPrefix(): StreamNodePrefixEnum.CODER_LLM_STREAM.getPrefix();String nodeNum = NodeStepTitleUtil.registerStepTitle(state, isReflectionNode, executorNodeId, "Coder",assignedStep.getTitle(), prefix);logger.info("CoderNode {} starting streaming with key: {}", executorNodeId, nodeNum);var generator = StreamingChatGenerator.builder().startingNode(nodeNum).startingState(state).mapResult(response -> {// Only handle successful responses - errors are handled in doOnErrorString coderContent = response.getResult().getOutput().getText();assignedStep.setExecutionStatus(ReflectionUtil.getCompletionStatus(reflectionProcessor != null, nodeName));assignedStep.setExecutionRes(Objects.requireNonNull(coderContent));logger.info("{} completed, content: {}", nodeName, coderContent);updated.put("coder_content_" + executorNodeId, coderContent);return updated;}).buildWithChatResponse(streamResult);updated.put("coder_content_" + executorNodeId, generator);return updated;}catch (Exception e) {// Handle any exception that occurs before or during stream setupStateUtil.handleStepError(assignedStep, nodeName, e, logger);return updated;}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921516.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921516.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921516.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于STM32設計的激光充電控制系統(華為云IOT)_277

文章目錄 一、前言 1.1 項目介紹 【1】項目開發背景 【2】設計實現的功能 【3】項目硬件模塊組成 【4】設計意義 【5】國內外研究現狀 【6】摘要 1.2 設計思路 1.3 系統功能總結 1.4 開發工具的選擇 【1】設備端開發 【2】上位機開發 1.5 參考文獻 1.6 系統框架圖 1.7 系統原理…

【牛客拼數最大對比從左至右每位break與continue】2022-11-5

緣由牛客拼數最大問題&#xff0c;不從結果出發那種做法-編程語言-CSDN問答 思路倒序數后從右逐位比較大小 int 反序數(int n) {int nn 0;while (n)nn nn * 10 n % 10, n / 10;return nn; } void 牛客拼數位最大對比() {//4 7 13 4 246;3 13 312 343;3 1 2 3int a[20]{}, x…

【考研C語言編程題】數組元素批量插入實現(含圖示+三部曲拆解)

【考研C語言編程題】數組元素批量插入實現&#xff08;含圖示三部曲拆解&#xff09; 一、題目要求 編寫C語言程序&#xff0c;實現將數組b的所有元素批量插入到數組a的指定位置&#xff08;位置從0開始計數&#xff09;。要求嚴格遵循“騰出空間→插入元素→更新長度”的操作三…

監控系統 | 腳本案例

1、監控系統中的cpu、內存、硬盤、、使用率超過80%進行郵件告警&#xff08;可使用郵箱QQ&#xff09;詳細步驟說明&#xff1a;1. 腳本初始化#!/bin/bash&#xff1a;指定使用bash shell執行dateMax80&#xff1a;設置資源使用率閾值&#xff08;80%&#xff09;2. 資源監控CP…

Vulkan 學習(20)---- UniformBuffer 的使用

目錄UniformBufferDescriptorSetLayout 和 VkBuffer頂點著色器定義描述符布局(DescriptorSetLayout)創建 UniformBuffer描述符池(DescriptorSet Pool)描述符集(DescriptorSet)更新描述符集使用描述符集使用多個 DescriptorUniformBuffer 本篇文檔是通過 Uniform Buffer 的使用…

[光學原理與應用-461]:波動光學 - 波片實現偏振態的轉換或調整

波片&#xff08;Wave Plate&#xff09;是一種基于雙折射效應的光學元件&#xff0c;其核心功能是通過控制光波中尋常光&#xff08;o光&#xff09;和非尋常光&#xff08;e光&#xff09;的相位差&#xff0c;實現偏振態的轉換或調整。以下是波片的主要功能及其原理的詳細說…

Flutter之riverpod狀態管理詳解

一、riverpod狀態管理中所涉及到的provider對比分析Provider 類型核心用途最佳適用場景優勢劣勢/注意事項Provider(v1)暴露一個恒定不變的&#xff08;或不需要Riverpod管理的&#xff09;對象或值。依賴注入&#xff08;如&#xff1a;Repository, Logger, ApiClient&#xff…

昇騰310i Pro固件說明

目錄 驅動和固件 驅動固件文件 firware固件 24.2版本對應的固件 驅動和固件共同文件 燒結到flash中的固件 總結 啟動流程 固件關系猜測 啟動關鍵信息 efuse atu大小 GPU的bar 總結 驅動和固件 以最新的25.2 對應的驅動和固件為例說明&#xff1a; 驅動固件文件…

【LeetCode熱題100道筆記】二叉樹的右視圖

題目描述 給定一個二叉樹的 根節點 root&#xff0c;想象自己站在它的右側&#xff0c;按照從頂部到底部的順序&#xff0c;返回從右側所能看到的節點值。 示例 1&#xff1a; 輸入&#xff1a;root [1,2,3,null,5,null,4] 輸出&#xff1a;[1,3,4] 解釋&#xff1a;示例 2&am…

Redis《RedisSerializer》

文章目錄RedisSerializer為什么要使用如何使用RedisSerializer總結RedisSerializer 為什么要使用 RedisTemplate 有默認的序列化器&#xff0c;但默認使用的 JdkSerializationRedisSerializer 存在一些問題&#xff1a; 序列化后的數據包含類信息等額外內容&#xff0c;導致…

基于開源AI大模型AI智能名片S2B2C商城小程序的文案引流與社交傳播運營策略研究

摘要&#xff1a;本文聚焦開源AI大模型AI智能名片S2B2C商城小程序&#xff0c;探討其文案引流與社交傳播運營策略。闡述文案在引流中的重要性&#xff0c;分析開源AI大模型AI智能名片S2B2C商城小程序的特性&#xff0c;研究文案設計策略、社交傳播機制及運營策略實施與效果評估…

NGINX vs HAProxy vs LVS:優勢與選型分析

目錄 1. 負載均衡的江湖:三巨頭初探 2. NGINX:全能選手的多面魅力 NGINX 核心優勢 NGINX 的短板 NGINX 實戰案例 3. HAProxy:調度大師的精細之道 HAProxy 核心優勢 HAProxy 的短板 HAProxy 實戰案例 4. LVS:內核猛獸的極致性能 LVS 核心優勢 LVS 的短板 LVS 實…

AI+ 行動意見解讀:音視頻直播SDK如何加速行業智能化

引言&#xff1a;國家戰略、技術基座與行業落地 8 月底&#xff0c;國務院發布了《“人工智能”行動意見》&#xff0c;明確將人工智能提升為繼“互聯網”之后的新一輪國家級戰略抓手。這份文件的關鍵詞已經不再是“連接”與“優化”&#xff0c;而是“重塑”與“躍遷”&#…

2025年華為HCIA人工智能認證發展前景如何?客觀分析!

大家好&#xff01;7月世界人工智能大會即將揭幕首款重載機器人&#xff0c;AI產業化進程再次加速。不少朋友開始轉移關注到和它有一點點關系的——華為HCIA-AI Solution認證&#xff08;人工智能解決方案工程師&#xff09;&#xff0c;但它是否真能搭上這趟技術快車&#xff…

AutoGPT 原理與實踐:從AI助理到“自主任務完成者” (人工智能入門系列)

Elon Musk 曾預言&#xff0c;“AIAgent 終將比人類聰明&#xff0c;并能自動完成大部分工作&#xff0c;這既是機遇也是威脅。” 而 AutoGPT&#xff0c;正是當前 AI 領域涌現出的、最能體現這一預言雛形的產品。它不再是那個需要你一句一句精確指令的“AI助手”&#xff0c;而…

自適應濾波器:Ch4 最小均方(LMS)算法

隨機梯度下降算法簡介 之前的章節中介紹了利用最速下降算法可以實現維納濾波器的最優解&#xff08;LMMSE&#xff09;&#xff0c;其最優解的形式為&#xff1a; w0R?1Pw_{0} R^{- 1}Pw0?R?1P 它基于兩個假設&#xff1a;環境的聯合平穩&#xff0c;即輸入u(n)u(n)u(n)以及…

AI生成內容的版權問題解析與實操指南

針對個人使用AI工具生成視頻/音樂的版權問題深度解析&#xff0c;從法律歸屬、侵權邊界到確權實操&#xff0c;結合最新司法實踐提煉核心要點&#xff1a; 一、版權歸屬核心邏輯&#xff1a;人類智力投入的可視化 當用戶深度參與創作過程時&#xff0c;可主張版權。關鍵看操作…

4.2 機器學習 - 欠擬合和過擬合

模型訓練的核心挑戰是讓模型既 “學好” 訓練數據&#xff0c;又能 “適應” 新數據。欠擬合&#xff08;Underfitting&#xff09;和過擬合&#xff08;Overfitting&#xff09;是阻礙這一目標的兩大典型問題&#xff0c;其本質是 “模型復雜度” 與 “數據復雜度” 不匹配。本…

LeetCode 468. 驗證IP地址 - 詳細解析

文章目錄LeetCode 468. 驗證IP地址 - 詳細解析題目描述IPv4驗證規則&#xff1a;IPv6驗證規則&#xff1a;最優Java解決方案&#xff08;注釋完整版&#xff09;關鍵變量含義及代碼技巧代碼技巧詳解1. 前導零檢查的最佳實踐2. IPv6為什么不能用Character.isDigit()3. 針對性注釋…

新能源研發,用新型實驗記錄本:ELN

新能源&#xff08;材料&#xff09;研發如火如荼&#xff0c;競爭激烈。以電池為例&#xff0c;新能源汽車的崛起、儲能技術的突破&#xff0c;讓電池成為了能源領域的“新寵”。電池研發已經成為熱門賽場&#xff0c;各研發團隊都在與時間賽跑&#xff0c;試圖維持優勢或彎道…