Files
aiagent/backend/scripts/create_ai_learning_assistant.py
renjianbo eabf90c496 feat: add AI学习助手 agent (KG+RAG ideal) and renshenguo feishu bot
- Add AI学习助手 agent creation script with all 39 tools, 3-layer KG+RAG memory
- Add renshenguo (人参果) feishu bot integration (app_service + ws_handler)
- Register renshenguo WS client in main.py startup
- Add RENSHENGUO_APP_ID / RENSHENGUO_APP_SECRET / RENSHENGUO_AGENT_ID config
- Reorganize docs from root into docs/ subdirectories
- Move startup scripts to scripts/startup/
- Various backend optimizations and tool improvements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-06 01:37:13 +08:00

390 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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等、题库基于当前知识图谱中的"知识空白"精准推荐
- **工具集成**推荐学习工具Grammarly、Wolfram Alpha、Notion模板必要时用 `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())