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

langchain 实现 任务分解器

需要使用任务分解器的情况:

1.复杂长期目标:当任务过于复杂,无法一步完成时

例如:“制定一个完整的产品发布计划”
需要分解为市场调研、产品设计、测试、营销策略等子任务

2.多步骤依赖关系:任务间存在明确的先后顺序

例如:软件开发流程(需求分析 → 设计 → 编码 → 测试 → 部署)

3.并行处理需求:某些子任务可以同时进行

例如:内容创作项目中的文本撰写和图片设计可以并行

4.资源分配优化:需要合理分配计算资源或时间

大型数据处理任务可以分解为多个批次处理


from langchain.prompts import PromptTemplatefrom langchain.schema import BaseOutputParser
from pydantic import BaseModel, Field
from typing import List, Dict
import json
import re
from llm.llm import get_chatmodelclass SubTask(BaseModel):"""子任务数据模型"""task_name: str = Field(description="任务名称")task_description: str = Field(description="任务详细描述")task_steps: List[str] = Field(description="执行步骤列表")dependencies: List[str] = Field(default=[], description="依赖的其他任务")priority: int = Field(default=1, description="优先级(1-5)")class TaskDecomposition(BaseModel):"""任务分解结果"""original_request: str = Field(description="原始用户请求")total_tasks: int = Field(description="总任务数")sub_tasks: List[SubTask] = Field(description="子任务列表")class TaskDecompositionParser(BaseOutputParser):"""自定义解析器"""def parse(self, text: str) -> TaskDecomposition:try:# 清理文本,提取JSON部分json_match = re.search(r'\{.*\}', text, re.DOTALL)if json_match:json_str = json_match.group()data = json.loads(json_str)return TaskDecomposition(**data)except:pass# 如果JSON解析失败,使用规则解析return self._rule_based_parse(text)def _rule_based_parse(self, text: str) -> TaskDecomposition:"""基于规则的解析方法"""lines = text.strip().split('\n')sub_tasks = []current_task = Nonefor line in lines:line = line.strip()if line.startswith('任务') or line.startswith('Task'):if current_task:sub_tasks.append(current_task)current_task = {'task_name': line,'task_description': '','task_steps': [],'dependencies': [],'priority': 1}elif line.startswith('步骤') or line.startswith('Step'):if current_task:current_task['task_steps'].append(line)if current_task:sub_tasks.append(current_task)return TaskDecomposition(original_request="解析的用户请求",total_tasks=len(sub_tasks),sub_tasks=[SubTask(**task) for task in sub_tasks])def create_task_decomposition_chain():"""创建任务分解链"""template = """你是一个智能任务规划助手。请将用户的复杂请求分解为具体的子任务。用户请求: {user_request}请按照以下JSON格式返回结果:{{"original_request": "用户的原始请求","total_tasks": 子任务总数,"sub_tasks": [{{"task_name": "任务名称","task_description": "详细描述这个任务要做什么","task_steps": ["步骤1", "步骤2", "步骤3"],"dependencies": ["依赖的其他任务名称"],"priority": 优先级数字(1-5)}}]}}分解原则:1. 每个子任务应该是独立可执行的2. 任务之间的依赖关系要清晰3. 步骤要具体可操作4. 优先级要合理安排"""prompt = PromptTemplate(template=template,input_variables=["user_request"])get_chatmodel()parser = TaskDecompositionParser()llm = get_chatmodel()chain = prompt | llm | parserreturn chainif __name__ == "__main__":chain = create_task_decomposition_chain()user_request = "查询我申报了哪些补贴,并查询补贴的状态"result = chain.invoke(user_request)print(result)
http://www.xdnf.cn/news/7571.html

相关文章:

  • 深度学习中的正则化方法与卷积神经网络基础
  • leetcode hot100:三、解题思路大全:哈希(两数之和、字母异位词分组、最长连续序列)、双指针(移动零、盛最多水的容器、三数之和、接雨水)
  • beanstalk一直被重新保留(reserved 状态)消息删除
  • BACnet协议详解:架构、应用、挑战与未来发展
  • WIFI信号状态信息 CSI 深度学习之数据集
  • 基于自然语言转SQL的BI准确率如何?
  • C语言指针深入详解(四):指针变量、二维数组传参的本质、函数指针数组、转移表
  • FastDatasets新功能,让模型学会“思考”!
  • 双指针法高效解决「移除元素」问题
  • python学习打卡day31
  • vue+springboot+element-ui实现table的树懒加载
  • 【windows】音视频处理工具-FFmpeg(合并/分离)
  • SpringCloud+Vue实现大文件分片下载(支持开始、暂停、继续、取消)
  • 微店商品详情接口开发指南
  • 创建thinkphp项目并配置数据库
  • 策略梯度方法(Policy Gradient Methods)
  • 物流项目第四期(运费模板列表实现)
  • 电网中窃电分析:概念、算法与应用
  • uview 2.x 下载安装配置 border=“surround“ 不生效
  • STM32+ESP8266+ONENET+微信小程序上传数据下发指令避坑指南
  • Python Selenium 使用指南
  • 第九节第二部分:常用API:Object类、包装类
  • LLM笔记(十)vLLM(1)PagedAttention论文笔记
  • ubuntu18.04安装nerfstudio
  • DataBinding深度解析:从编译原理到抖音级性能优化
  • window 显示驱动开发-准备 DMA 缓冲区
  • 关于 APK 反编译与重构工具集
  • 【HTML-3】HTML 中的水平线与换行:基础元素详解
  • React表单开发的瑞士军刀:Formik与Yup实战指南
  • [luogu12541] [APIO2025] Hack! - 交互 - 构造 - 数论 - BSGS