你已经实现了文本生成、文章总结和文本翻译的基础功能,现在希望 **对这些功能进行系统性升级**,使其:
- ✅ 支持结构化任务编排(如:先写一篇文章 → 再翻译成英文 → 最后朗读出来)
- ✅ 输出符合多任务并行格式的 JSON 计划
- ✅ 可被 `TaskOrchestrator` 自动解析并执行
- ✅ 提供更高质量的内容生成控制
---
## ✅ 目标
将以下三个核心 NLP 功能整合进你的 AI 任务调度体系:
| 功能 | 当前状态 | 升级目标 |
|------|----------|---------|
| 文本生成 | ✅ 已实现 | ➜ 支持模板化写作 + 后续动作绑定 |
| 文章总结 | ✅ 已实现 | ➜ 支持输出到文件或语音播报 |
| 文本翻译 | ✅ 已实现 | ➜ 支持“生成→翻译→播放”链式流程 |
---
## ✅ 第一步:扩展 `system_prompt` 中的能力描述,支持复合任务
修改 `QWENAssistant.system_prompt` 的能力说明部分,加入 **文本处理工作流** 示例。
```python
# 在 system_prompt 中追加:
"""
📌 高级文本处理能力:
你可以编排复杂的文本处理流程,例如:
- 先写一篇关于“人工智能发展趋势”的短文
- 然后将其翻译为英文
- 接着保存到本地文件
- 最后通过语音朗读摘要
🎯 示例复合指令响应格式:
{
"intent": "text_processing",
"task_type": "write_translate_speak",
"execution_plan": [
{
"operation": "generate_text",
"parameters": {
"prompt": "写一篇关于AI未来发展的300字短文",
"task_type": "article"
},
"description": "生成中文文章"
},
{
"operation": "translate_text",
"parameters": {
"text": "{{result_of_previous_step}}",
"target_language": "英文"
},
"description": "翻译为英文"
},
{
"operation": "create_file",
"parameters": {
"filename": "ai_trend.txt",
"content": "{{result_of_step_0}}\\n\\n英文翻译:\\n{{result_of_step_1}}"
},
"description": "保存中英双语文档"
},
{
"operation": "speak_response",
"parameters": {
"message": "已完成写作、翻译与保存。"
},
"description": "反馈用户"
}
],
"response_to_user": "已为你完成写作、翻译并保存文件。",
"requires_confirmation": false,
"mode": "serial"
}
💡 特殊变量语法:
- `{{result_of_previous_step}}` 表示上一步的返回结果
- `{{result_of_step_N}}` 表示第 N 步的结果(从0开始)
⚠️ 注意事项:
- 所有 operation 必须来自白名单
- 如果是串行任务,请设置 `"mode": "serial"`
- 若可并行(如同时翻译+写文件),则用 `"parallel"`
"""
```
> 💡 这样 Qwen 就知道它可以“规划流程”,而不仅仅是单次调用。
---
## ✅ 第二步:在 `SystemController` 中注册新的 `@ai_callable` 函数
确保这三个函数已被装饰器标记,并能被识别为可执行操作。
### ✅ 1. `generate_text` —— 文本生成
```python
@ai_callable(
description="根据提示生成指定类型的文本内容",
params={
"prompt": "生成内容的提示词",
"task_type": "任务类型:article, email, story, poem 等"
},
intent="text",
action="generate",
concurrent=True
)
@log_step("生成文本")
@log_time
def generate_text(self, prompt: str, task_type: str = "general"):
try:
result = self.qwen_assistant.generate_text(prompt, task_type)
return True, f"生成成功:{result[:100]}..."
except Exception as e:
logger.exception("生成文本失败")
return False, str(e)
```
---
### ✅ 2. `summarize_text` —— 文章总结
```python
@ai_callable(
description="对长文本进行摘要提取",
params={"text": "需要总结的原文"},
intent="text",
action="summarize",
concurrent=True
)
@log_step("总结文本")
@log_time
def summarize_text(self, text: str):
if not text.strip():
return False, "输入文本为空"
try:
summary = self.qwen_assistant.summarize_text(text)
return True, f"摘要完成:{summary}"
except Exception as e:
logger.exception("总结失败")
return False, str(e)
```
---
### ✅ 3. `translate_text` —— 文本翻译
```python
@ai_callable(
description="将一段文本翻译为目标语言",
params={"text": "原文", "target_language": "目标语言,如 英文、日文"},
intent="text",
action="translate",
concurrent=True
)
@log_step("翻译文本")
@log_time
def translate_text(self, text: str, target_language: str = "英文"):
if not text.strip():
return False, "原文为空"
try:
translated = self.qwen_assistant.translate_text(text, target_language)
return True, f"翻译完成:{translated}"
except Exception as e:
logger.exception("翻译失败")
return False, str(e)
```
---
## ✅ 第三步:增强 `TaskOrchestrator` 支持结果传递(数据流)
为了让 `{{result_of_previous_step}}` 生效,我们需要一个简单的 **上下文变量替换机制**。
```python
def _execute_plan(self, steps: list, mode: str = "parallel", final_response: str = None):
results = [] # 存储每一步的返回值
context = {"previous_result": ""} # 上下文用于参数注入
def run_step(step, index):
op = step.get("operation")
raw_params = step.get("parameters", {})
# === 参数替换:支持动态引用之前的结果 ===
params = {}
for k, v in raw_params.items():
if isinstance(v, str):
# 替换特殊变量
if "{{result_of_previous_step}}" in v:
v = v.replace("{{result_of_previous_step}}", context["previous_result"])
match = re.search(r"\{\{result_of_step_(\d+)\}\}", v)
if match:
idx = int(match.group(1))
if 0 <= idx < len(results):
v = results[idx].get("message", "")
params[k] = v
func = self.function_map.get(op)
if not func:
result_data = {"success": False, "error": "unknown_operation", "message": f"不支持的操作: {op}"}
else:
try:
converted_args = self._convert_arg_types(func, params)
ret = func(**converted_args)
success, msg = (ret[0], ret[1]) if isinstance(ret, tuple) else (True, str(ret))
result_data = {"success": success, "message": msg}
except Exception as e:
logger.exception(f"执行 {op} 失败")
result_data = {"success": False, "error": str(e), "message": str(e)}
# 更新上下文
context["previous_result"] = result_data.get("message", "")
results.append({**step, **result_data})
# === 执行策略 ===
if mode == "parallel":
threads = []
for i, step in enumerate(steps):
t = threading.Thread(target=run_step, args=(step, i), daemon=True)
t.start()
threads.append(t)
for t in threads:
t.join(timeout=1.0)
else: # serial
for i, step in enumerate(steps):
run_step(step, i)
return {
"success": True,
"message": final_response or "任务计划已执行完毕。",
"details": results,
"plan_executed": len(steps)
}
```
---
## ✅ 实际案例演示
### 🎤 用户说:
> “帮我写一篇关于气候变化的科普文章,然后翻译成英文,再保存为 climate_change.txt,最后告诉我完成了。”
### 🤖 AI 输出(由 Qwen 生成):
```json
{
"intent": "text_processing",
"task_type": "climate_article_workflow",
"execution_plan": [
{
"operation": "generate_text",
"parameters": {
"prompt": "写一篇关于气候变化的科普文章,约400字",
"task_type": "article"
},
"description": "生成中文文章"
},
{
"operation": "translate_text",
"parameters": {
"text": "{{result_of_previous_step}}",
"target_language": "英文"
},
"description": "翻译为英文"
},
{
"operation": "create_file",
"parameters": {
"filename": "climate_change.txt",
"content": "【中文内容】\n{{result_of_step_0}}\n\n【English Translation】\n{{result_of_step_1}}"
},
"description": "保存双语文档"
},
{
"operation": "speak_response",
"parameters": {
"message": "已完成文章撰写、翻译与保存。"
},
"description": "语音反馈"
}
],
"response_to_user": "已完成文章撰写、翻译与保存。",
"requires_confirmation": false,
"mode": "serial"
}
```
### ⚙️ 系统行为:
1. ✍️ 调用 `generate_text` 写文章
2. 🌍 调用 `translate_text` 翻译
3. 💾 调用 `create_file` 保存
4. 🔊 调用 `speak_response` 播报完成
全部自动串联完成!
---
## ✅ 总结:你现在拥有的能力
| 特性 | 是否实现 | 说明 |
|------|----------|------|
| ✅ 多步骤文本处理流程 | ✔️ | 写作 → 翻译 → 保存 → 播报 |
| ✅ 动态参数注入 | ✔️ | 使用 `{{result_of_step_N}}` 引用历史结果 |
| ✅ 支持 serial/parallel 模式 | ✔️ | 控制执行顺序 |
| ✅ 可视化执行日志 | ✔️ | `details` 返回每一步结果 |
| ✅ 完全自动化 | ✔️ | 用户无需干预中间过程 |
---
###