AI搜学助手是基于 PydanticAI 框架构建的智能学习助手系统,能够自动收集、分析和总结网络学习资料,帮助用户快速理解和掌握各种知识概念。
ai_learning/ ├── public/ # 静态资源 │ ├── echarts/ # ECharts 图表库 │ ├── libs/ # 工具库(html2canvas、html2pdf) │ └── novnc/ # noVNC 远程桌面库 ├── src/ │ ├── backend/ # 后端服务(Python) │ │ ├── requirements.txt # Python 依赖 │ │ └── src/ │ │ ├── main.py # 主程序入口 │ │ ├── agent.py # Agent 逻辑 │ │ ├── analysis_standards.py # 分析标准 │ │ └── event_queue.py # 事件队列 │ └── frontend/ # 前端服务(Next.js) │ ├── package.json # Node.js 依赖 │ ├── next.config.ts # Next.js 配置 │ ├── tsconfig.json # TypeScript 配置 │ └── src/ │ ├── app/ # 应用页面 │ ├── components/ # React 组件 │ ├── hooks/ # 自定义 Hooks │ └── lib/ # 工具库 ├── publish.yaml # 发布配置(应用中心) ├── src/s.yaml # 部署配置(Serverless Devs) ├── build.yaml # 构建配置 ├── Makefile # 构建脚本 └── README.md # 项目文档
系统采用 Server-Sent Events (SSE) 实现前后端实时通信,确保用户能够实时查看 Agent 执行进度和状态更新。
SSE 连接建立流程:
事件推送流程:
关键文件说明:
src/backend/src/main.py (第 88-170 行)src/backend/src/event_queue.pysrc/backend/src/agent.py (第 680-695 行)src/frontend/src/hooks/useAgentState.ts采用单 Agent 设计,该 Agent 具备多项能力:
Agent 在执行过程中会经历多个状态,每个状态对应不同的执行阶段。系统通过 SSE 实时推送状态更新,前端可以实时展示 Agent 的执行进度。
状态转换流程:
状态说明:
| 状态 | 说明 | current_phase | 发生时机 |
|---|---|---|---|
idle | 空闲状态 | - | Agent 初始化或任务完成后 |
collecting | 收集中 | "资料收集" | 调用 collect_data 工具时 |
collected | 收集完成 | - | 数据收集工具执行完成 |
analyzing | 分析中 | "数据分析" | 调用 analyze_data 工具时 |
analyzed | 分析完成 | - | 数据分析工具执行完成 |
writing | 撰写中 | "报告撰写" | 调用 write_report 工具时 |
written | 撰写完成 | - | 报告撰写工具执行完成 |
rendering | 渲染中 | "HTML 渲染" | 调用 render_html 工具时 |
complete | 完成 | - | 所有工具执行完成 |
error | 错误 | "错误" | 任何阶段发生错误时 |
相关文件:
src/backend/src/agent.py (OpinionState 类)src/backend/src/agent.py (push_state_event 函数)系统数据从用户输入到最终输出的完整流转过程,展示数据在各阶段的转换和处理。
数据流转流程:
数据结构说明:
| 数据字段 | 类型 | 说明 | 生成阶段 |
|---|---|---|---|
keyword | string | 用户输入的关键词 | 用户输入 |
raw_data | List[SearchResult] | 原始搜索结果列表 | 数据收集 |
collected_data_summary | List[Dict] | 数据摘要列表 | 数据收集 |
analysis.keywords | List[str] | 提取的关键词列表 | 数据分析 |
analysis.sentiment_score | float | 情感得分 | 数据分析 |
analysis.summary | string | 分析摘要 | 数据分析 |
analysis.key_opinions | List[Dict] | 关键观点列表 | 数据分析 |
report_text | string | 报告文本 | 报告撰写 |
final_html | string | 最终 HTML 报告 | HTML 渲染 |
数据转换过程:
SearchResult 对象raw_data 和 collected_data_summaryAnalysisResultreport_textfinal_htmlgit clone https://github.com/devsapp/agentrun-template.git
cd ai_learning
cd src/backend
pip install -r requirements.txt
cd ../frontend
npm install
cd backend
python src/main.py
cd frontend
npm run dev
访问 http://localhost:3000 查看应用。
npm install -g @serverless-devs/s s config add
编辑 src/s.yaml,设置以下变量:
vars:
region: cn-hangzhou # 部署地域
agent_name: opinion_analysis # Agent 名称
role: AliyunAgentRunDefaultRole # 权限角色
cd src
s deploy
s info
cd src/frontend
npm run build
构建产物将输出到 src/frontend/out 目录。
资料采集模块
分析处理模块
报告生成模块
environmentVariables:
PYTHONPATH: /code/python:/opt/python:/code:/code/python
AGENTRUN_MODEL_NAME: '{{ modelServiceName }}' # 模型服务名称
MODEL_NAME: '{{ modelName }}' # 模型名称
AGENTRUN_BROWSER_SANDBOX_NAME: '{{ browserTemplate }}' # 浏览器沙箱
environmentVariables:
ENDPOINT: '${resources.opinion_analysis.output.agent.endpoints.0.url}'
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
region | string | cn-hangzhou | 部署地域(cn-beijing/cn-hangzhou) |
role | string | AliyunAgentRunDefaultRole | 权限角色 |
modelServiceName | string | - | 大语言模型服务名称 |
modelName | string | - | 模型名称(建议 qwen3-max) |
agentRuntimeName | string | opinion_analysis | AgentRuntime 名称 |
browserTemplate | string | '' | 浏览器沙箱模板 |
模型配置
Sandbox 配置
backend/ ├── requirements.txt # Python 依赖 └── src/ ├── main.py # 主程序入口 ├── agent.py # Agent 逻辑 ├── analysis_standards.py # 分析标准 └── event_queue.py # 事件队列
agent.py 中定义新的 Agent 方法main.py 中注册新的路由requirements.txt 中添加依赖pip install -r requirements.txt
frontend/ ├── src/ │ ├── app/ # 应用页面 │ │ ├── layout.tsx # 布局组件 │ │ ├── page.tsx # 主页面 │ │ └── globals.css # 全局样式 │ ├── components/ # React 组件 │ │ ├── OpinionDashboard.tsx # 仪表板 │ │ ├── ThemeSwitcher.tsx # 主题切换 │ │ └── VncViewer.tsx # VNC 查看器 │ ├── hooks/ # 自定义 Hooks │ │ ├── useAgentState.ts # Agent 状态管理 │ │ └── useTheme.tsx # 主题管理 │ └── lib/ # 工具库 │ ├── const.ts # 常量定义 │ └── types.ts # 类型定义
src/components/ 中创建新组件src/app/page.tsx 中引入并使用src/lib/types.tsnpm install <package-name>
cd src/frontend
npm run build
构建产物将输出到 src/frontend/out 目录。
cd src/backend
python -m pytest
cd ../frontend
npm test
场景 1:快速学习新概念
用户输入:帮我学习"机器学习"的基础知识
Agent 执行流程:
输出示例:
# 机器学习知识讲解报告
## 概念简介
- 资料来源:20 条优质学习资料
- 难度等级:入门级
- 学习时长建议:2-4周
## 核心原理
1. 什么是机器学习
2. 监督学习与无监督学习
3. 常见算法介绍
## 应用案例
- 图像识别
- 自然语言处理
- 推荐系统
场景 2:技术文档整理
用户输入:帮我整理"React Hooks"的学习资料
Agent 执行流程:
ENDPOINT 环境变量是否正确设置s logs 命令查看通过 AgentRun 控制台的可视化配置,无需编写代码即可快速部署和定制您的AI搜学助手。