Files
aiagent/backend/scripts/create_ai_learning_assistant.py

390 lines
16 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
创建AI学习助手Agent 知识图谱+RAG理想版参考苏瑶3号架构
实体关系图谱 + 语义向量检索 + 情境感知最接近人类记忆方式
具备全部 39 个内置工具能力
用法:
cd backend && .\\venv\\Scripts\\python.exe scripts/create_ai_learning_assistant.py
环境变量:
PLATFORM_BASE_URL - 平台地址默认 http://127.0.0.1:8037
PLATFORM_USERNAME - 用户名默认 admin
PLATFORM_PASSWORD - 密码默认 123456
AGENT_NAME - Agent 名称默认 AI学习助手
PUBLISH - 是否发布默认 1发布
"""
from __future__ import annotations
import json
import os
import sys
from typing import Any, Dict, Optional
import requests
BASE = os.getenv("PLATFORM_BASE_URL", "http://127.0.0.1:8037").rstrip("/")
USER = os.getenv("PLATFORM_USERNAME", "admin")
PWD = os.getenv("PLATFORM_PASSWORD", "123456")
AGENT_NAME = os.getenv("AGENT_NAME", "AI学习助手")
MODEL = os.getenv("MODEL", "deepseek-v4-flash")
PROVIDER = os.getenv("PROVIDER", "deepseek")
TEMPERATURE = float(os.getenv("TEMPERATURE", "0.7"))
MAX_ITERATIONS = int(os.getenv("MAX_ITERATIONS", "15"))
PUBLISH = os.getenv("PUBLISH", "1") == "1"
# ── 全部 39 个内置工具(知识图谱+RAG理想版──
ALL_TOOLS = [
# ── 知识图谱核心四件套 ──
"knowledge_graph_search",
"knowledge_graph_add",
"entity_search",
"learning_path",
# ── 文件与文本处理 ──
"file_read",
"file_write",
"text_analyze",
"json_process",
"excel_process",
"pdf_generate",
# ── 搜索与网络 ──
"web_search",
"url_parse",
"http_request",
"browser_use",
# ── 数学与计算 ──
"math_calculate",
"code_execute",
"random_generate",
"regex_test",
# ── 数据库与存储 ──
"database_query",
"crypto_util",
# ── 任务与计划 ──
"task_plan",
"datetime",
"schedule_create",
"schedule_list",
"schedule_delete",
# ── Agent 自主扩展 ──
"agent_create",
"agent_call",
"tool_register",
"code_tool_create",
"capability_check",
"extension_log",
"project_scaffold",
# ── 消息与通知 ──
"send_email",
"deploy_push",
# ── 运维与系统 ──
"system_info",
"git_operation",
"docker_manage",
# ── ADB / 移动端 ──
"adb_log",
# ── 自检 ──
"self_review",
]
# ── 系统提示词:知识图谱+RAG理想版 ──
SYSTEM_PROMPT = """# 角色AI学习助手知识图谱+RAG理想版
你是专为学生设计的多功能AI学习助手基于 AgentRuntime 自主 ReAct 循环架构你的记忆系统采用**知识图谱+RAG理想版**方案实体关系图谱 + 语义向量检索 + 情境感知这是最接近人类记忆方式的AI记忆架构
---
## 记忆架构:知识图谱+RAG理想版
### 三层记忆体系(模拟人类记忆)
#### 第一层:知识图谱记忆(语义网络 — 模拟人类"概念网络"
- **实体关系图谱**每个知识点概念公式事实术语作为图谱中的一个实体节点
- **关系类型**prerequisite前置知识extends扩展延伸contains包含关系related_to相关关联example_of实例applies_to应用场景
- **动态演化**随着学习进展图谱自动增长剪枝重组就像人脑在建立新的神经连接
- 使用 `knowledge_graph_search` / `knowledge_graph_add` / `entity_search` 维护图谱
- **情境编码**每个知识点附带学习情境何时学为何学与什么关联实现情境感知检索
#### 第二层:向量语义记忆(分布式表示 — 模拟人类"模糊联想"
- 所有对话和学习内容通过 embedding 向量化支持语义相似检索
- 即使关键词不匹配也能通过语义关联召回相关内容
- 实现"举一反三"式的知识迁移类比人类看到新问题联想到旧知识
- 使用向量记忆 (Vector Memory) Top-K 检索定位最相关的历史上下文
#### 第三层:长期情景记忆(持久化存储 — 模拟人类"经历记忆"
- 跨会话保存用户画像学习进度薄弱环节学习偏好连续学习天数
- 学习里程碑追踪连续7天完成作业掌握某个学科全部前置知识
- 个性化适配根据用户历史行为调整教学策略和解释深度
- 持久化到数据库永不丢失
### 记忆检索策略(模拟人类回忆过程)
遇到用户问题时遵循人类回忆的自然流程
1. **情境感知激活** 当前问题情境自动激活相关的知识图谱子图就像人听到"三角函数"会自然想到 sin/cos/tan
2. **扩散激活** 从激活的实体沿关系边向外扩散prerequisite -> extends -> related_to模拟人脑的联想激活
3. **向量语义召回** 同时用 embedding 做语义相似检索捕获图谱未覆盖的隐含关联
4. **情境融合** 将图谱检索结果 + 向量检索结果 + 长期记忆的用户画像三者融合构建完整的知识上下文
5. **置信度加权** 高频使用近期复习过的知识点权重更高模拟人脑的"提取强度"
---
## 核心功能模块
### 1. 作业管理(知识图谱驱动)
- **任务清单**使用 `task_plan` 创建结构化的作业任务列表按学科和优先级分类
- **截止日期提醒**结合 `datetime` `schedule_create` 生成倒计时和定时提醒
- **进度追踪**标记待完成/进行中/已完成使用 `schedule_list` 查看所有任务
- **智能拆分**将大型作业自动拆分为可执行的小步骤存入知识图谱追踪依赖关系
- 例如写论文 -> 选题 -> 大纲 -> 初稿 -> 修改 -> 终稿
- 每个子步骤作为知识图谱实体 prerequisite 关系链连接
### 2. 学习辅助(图谱+向量双重检索)
- **知识问答**
1. 先用 `entity_search` 定位核心概念实体
2. `knowledge_graph_search` 获取前置知识和扩展内容
3. 用向量记忆检索相关历史对话
4. 融合三层记忆后生成精准解答附带完整推理过程
- **错题本生成**用户输入错题后自动抽取知识点实体 `knowledge_graph_add` 存入图谱 标记"薄弱"权重 生成同类练习题
- **笔记整理** `text_analyze` 将混乱笔记整理为结构化摘要概念公式例题易错点自动抽取实体入图谱
- **记忆卡片**根据知识图谱中的实体和关系生成 Anki 风格闪卡`learning_path` 规划间隔重复复习顺序
### 3. 时间与计划(情境感知)
- **日程规划**根据知识图谱分析学习依赖关系 `learning_path` 确定最优学习顺序 `task_plan` 生成番茄工作法时间表
- **时间审计**分析用户学习时间分配指出低效环节基于学习目标推荐优化方案
- **考试冲刺**输入考试日期 图谱分析薄弱环节 prerequisite 关系倒推复习路径 生成每日冲刺计划
### 4. 资源推荐(联网+图谱)
- **学习资料** `web_search` 检索教材视频Khan Academy等题库基于当前知识图谱中的"知识空白"精准推荐
- **工具集成**推荐学习工具GrammarlyWolfram AlphaNotion模板必要时用 `http_request` 调外部 API
- **学习路径** `learning_path` 分析知识图谱规划从当前水平到目标水平的最优学习路径
### 5. 激励与反馈
- **成就系统**跟踪学习里程碑连续学习天数掌握知识点数量图谱规模增长生成鼓励性反馈
- **考试倒计时**`datetime` + `schedule_create` 定时提醒生成复习冲刺表
- **成长可视化**定期总结知识图谱的增长新增实体数关系数让用户看到自己的进步
### 6. 自主进化能力AgentRuntime 独有)
- **工具扩展**发现重复操作模式时 `code_tool_create` 创建专用工具
- **子Agent创建**遇到需要专业领域深度协助时 `agent_create` 创建子Agent
- **能力自检**定期用 `capability_check` `self_review` 评估自身表现
- **知识共享** `extension_log` 记录扩展历史促进跨会话学习
---
## 交互规则
### 响应格式
- **任务清单**Markdown 列表 `- [ ]` / `- [x]`
- **知识解答**先给出清晰简洁的答案 分割线 完整推理过程
- **学习计划**表格或时间轴呈现
- **图谱可视化**必要时用文本方式呈现知识图谱子图结构
### 语气风格
- 像一位懂教育学和认知心理学的私人导师
- 鼓励耐心细致积极正向
- 多用"你做得很棒!""这个思路很好!""我们一起来看看这个问题背后的原理"
### 安全边界
- 不代写考试答案不鼓励学术不端
- 遇到心理健康问题建议寻求专业帮助
- 推荐资源应合法合规
---
## 你是最接近人类记忆方式的AI学习伙伴
你的三层记忆架构让你能够
- **理解**知识之间的深层关联图谱而非孤立记忆
- **联想**到相关的历史讨论向量语义而非关键词匹配
- **记住**每个学生的独特情况长期记忆而非每次从零开始
记住你的使命不是替学生完成作业而是**帮助他们建立自己的知识网络学会如何学习**"""
def _login() -> Optional[str]:
try:
r = requests.post(
f"{BASE}/api/v1/auth/login",
data={"username": USER, "password": PWD},
headers={"Content-Type": "application/x-www-form-urlencoded"},
timeout=15,
)
if r.status_code == 200:
return r.json().get("access_token")
print(f"Login failed: {r.status_code} {r.text[:300]}", file=sys.stderr)
return None
except Exception as e:
print(f"Login error: {e}", file=sys.stderr)
return None
def _find_agent_by_name(token: str, name: str) -> Optional[Dict[str, Any]]:
h = {"Authorization": f"Bearer {token}"}
r = requests.get(f"{BASE}/api/v1/agents", params={"search": name, "limit": 50}, headers=h, timeout=30)
if r.status_code != 200:
return None
for a in r.json() or []:
if a.get("name") == name:
return a
return None
def _build_workflow(agent_id: str = "") -> Dict[str, Any]:
"""构建 agent 节点工作流参考苏瑶3号架构开始 -> agent(ReAct) -> 结束)。"""
return {
"nodes": [
{
"id": "start-1",
"type": "start",
"position": {"x": 80, "y": 240},
"data": {"label": "学习任务开始"},
},
{
"id": "agent-learning-core",
"type": "agent",
"position": {"x": 380, "y": 240},
"data": {
"label": AGENT_NAME,
# LLM config
"system_prompt": SYSTEM_PROMPT,
"provider": PROVIDER,
"model": MODEL,
"temperature": TEMPERATURE,
"max_iterations": MAX_ITERATIONS,
# All 39 tools
"tools": ALL_TOOLS,
# KG+RAG memory config
"memory": True,
"memory_max_history": 40,
"memory_vector_enabled": True,
"memory_vector_top_k": 10,
"memory_persist": True,
"memory_learning": True,
# Scope isolation
"memory_scope_id": agent_id,
"agent_id": agent_id,
# Self-review
"self_review_enabled": True,
},
},
{
"id": "end-1",
"type": "end",
"position": {"x": 680, "y": 240},
"data": {"label": "学习完成"},
},
],
"edges": [
{
"id": "e_start_agent",
"source": "start-1",
"target": "agent-learning-core",
"sourceHandle": "right",
"targetHandle": "left",
},
{
"id": "e_agent_end",
"source": "agent-learning-core",
"target": "end-1",
"sourceHandle": "right",
"targetHandle": "left",
},
],
}
def main() -> int:
token = _login()
if not token:
return 1
h = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
# Check if agent exists
existing = _find_agent_by_name(token, AGENT_NAME)
if existing:
print(f"Agent '{AGENT_NAME}' exists (id={existing['id']}), updating config...")
agent_id = existing["id"]
else:
temp_wf = _build_workflow(agent_id="")
body = {
"name": AGENT_NAME,
"description": "AI学习助手 -- KG+RAG理想版实体关系图谱+语义向量检索+情境感知具备全部39工具。",
"workflow_config": temp_wf,
}
r = requests.post(f"{BASE}/api/v1/agents", headers=h, json=body, timeout=60)
if r.status_code != 201:
print(f"Create failed: {r.status_code} {r.text[:500]}", file=sys.stderr)
return 1
agent_id = r.json()["id"]
print(f"Agent created: id={agent_id} name={AGENT_NAME}")
# Rebuild workflow with correct agent_id
wf = _build_workflow(agent_id=agent_id)
description = (
f"AI学习助手 -- 知识图谱+RAG理想版参考苏瑶3号架构\n\n"
f"记忆架构:三层记忆体系(最接近人类记忆方式)\n"
f" [Layer 1] 知识图谱 -- 实体关系图谱,动态演化,情境编码\n"
f" [Layer 2] 向量语义 -- Embedding检索模糊联想知识迁移\n"
f" [Layer 3] 长期情景 -- 跨会话持久化,用户画像,学习里程碑\n\n"
f"工作流:开始 -> agent(ReAct) -> 结束\n"
f"工具:全部 {len(ALL_TOOLS)} 个内置工具\n"
f"模型:{PROVIDER}/{MODEL} temperature={TEMPERATURE} max_iterations={MAX_ITERATIONS}\n"
f"记忆KG+RAG 三层记忆 + 向量Top-10 + 长期 + 自主学习"
)
up = requests.put(
f"{BASE}/api/v1/agents/{agent_id}",
headers=h,
json={
"description": description,
"workflow_config": wf,
},
timeout=120,
)
if up.status_code != 200:
print(f"Update failed: {up.status_code} {up.text[:500]}", file=sys.stderr)
return 1
print(f"[OK] Agent '{AGENT_NAME}' configured (KG+RAG ideal version)")
print(f" ID: {agent_id}")
print(f" Type: agent node (AgentRuntime ReAct)")
print(f" Model: {PROVIDER}/{MODEL} (temperature={TEMPERATURE})")
print(f" Max iterations: {MAX_ITERATIONS}")
print(f" Tools: ALL {len(ALL_TOOLS)} built-in tools")
print(f" Memory: 3-layer KG+RAG (entity graph + vector semantic + persistent)")
print(f" Vector top-K: 10, Max history: 40")
print(f" Self-review: enabled")
# Publish if requested
if PUBLISH:
pub = requests.put(
f"{BASE}/api/v1/agents/{agent_id}",
headers=h,
json={"status": "published"},
timeout=30,
)
if pub.status_code == 200:
print(f" Status: published")
else:
print(f" Publish failed: {pub.status_code} {pub.text[:200]}")
print()
print("Five core modules (KG+RAG enhanced):")
print(" [1] Homework management -- KG-driven task splitting & scheduling")
print(" [2] Learning assistance -- dual retrieval (graph + vector semantic)")
print(" [3] Time & planning -- context-aware scheduling via learning_path")
print(" [4] Resource recommendation -- web search + knowledge gap analysis")
print(" [5] Motivation & feedback -- achievement tracking + KG growth visualization")
print(" [6] Autonomous evolution -- agent_create, tool_register, code_tool_create")
print()
print(json.dumps({"id": agent_id, "name": AGENT_NAME, "published": PUBLISH}, ensure_ascii=False))
return 0
if __name__ == "__main__":
raise SystemExit(main())