函数求值专家是基于 LangChain 框架开发的智能数学助手模板,专门用于解决函数求值和数值计算问题。该模板集成了代码解释器能力,可以处理复杂的数学表达式、方程求解、数值分析等任务。
克隆项目
git clone https://cnb.cool/XMZZUZHI/AgentRun/math-expert.git
cd math-expert
配置环境变量
在 AgentRun 控制台配置以下参数:
MODEL_SERVICE: 模型服务地址MODEL_NAME: 模型名称(推荐 qwen3-max)CODE_INTERPRETER_TEMPLATE: 代码解释器沙箱模板名称部署应用
使用阿里云 Serverless Devs 工具部署:
cd src
s deploy
访问应用
部署完成后,访问提供的 URL 即可使用函数求值助手。
在界面中输入以下测试问题:
帮我计算一下 y=sin(x)+2x 和 y=x² 的交点
系统将自动分析问题、生成计算代码、执行计算并返回结果。
workspace/ ├── README.md # 项目文档 ├── LICENSE # AGPL-3.0 开源协议 ├── agentrun-app.yaml # 应用元数据配置 ├── publish.yaml # 发布配置 ├── .cnb.yml # CNB 构建配置 ├── install_agents.sh # 安装 iFlow 智能体脚本 ├── install_gpg_keys.sh # 安装 GPG 密钥脚本 ├── src/ │ ├── build.yaml # 构建配置 │ ├── s.yaml # Serverless 应用配置 │ └── code/ │ ├── agentrun-backend/ # 后端代码 │ │ ├── main.py # Agent 主程序 │ │ └── requirements.txt # Python 依赖 │ └── agentrun-frontend/ # 前端代码 │ ├── server.py # HTTP 服务器 │ ├── index.html # 主界面 │ ├── math-render-test.html # 数学渲染测试 │ ├── math-test.html # 数学公式测试 │ ├── test-math-api.html # API 测试 │ ├── placeholder-test.html # 占位符测试 │ ├── render-test.html # 渲染测试 │ └── start.sh # 启动脚本
| 目录/文件 | 说明 |
|---|---|
src/code/agentrun-backend/ | 后端服务代码,包含 Agent 实现 |
src/code/agentrun-frontend/ | 前端服务代码,包含 Web 界面 |
src/s.yaml | Serverless 应用配置文件 |
src/build.yaml | 构建配置文件 |
agentrun-app.yaml | 应用元数据和模板参数 |
publish.yaml | 发布配置和版本信息 |
使用框架: LangChain
Agent 架构: 单 Agent 架构,专注于数学计算任务
技术特点: 集成代码解释器,支持 Python 代码执行和数值计算
该模板采用单一专业 Agent 设计,通过大语言模型的推理能力结合代码执行工具,实现高精度的数学计算。用户可在控制台选择适合的大语言模型(如 GPT-4、Claude 等)来驱动 Agent。
职责: 提供用户界面,处理用户交互,渲染响应内容
主要组件:
技术特点:
职责: 处理业务逻辑,调用 AI 模型,执行代码计算
主要组件:
技术特点:
请求阶段:
处理阶段:
响应阶段:
数据流阶段分解:
阶段 1: 用户输入
阶段 2: 前端请求
{
"messages": [
{
"role": "user",
"content": "帮我计算一下y=sin(x)+2x和y=x^2的交点"
}
],
"stream": true
}
Content-Type: application/json, x-agentrun-session-id: agentrun-math-demo阶段 3: Agent 处理
{
"messages": [
{"role": "user", "content": "..."}
],
"tools": [...], # 代码解释器工具
"system_prompt": "..." # 系统提示词
}
阶段 4: LLM 调用
{
"model": "qwen3-max",
"messages": [...],
"stream": true
}
data: {"choices": [{"delta": {"content": "..."}}]}{"choices": [{"message": {"content": "..."}}]}阶段 5: 工具调用
{
"tool_calls": [
{
"name": "code_interpreter",
"arguments": {
"code": "import numpy as np\n..."
}
}
]
}
阶段 6: 沙箱执行
{
"code": "import numpy as np\n...",
"timeout": 300
}
{
"output": "计算结果...",
"error": null,
"execution_time": 1.5
}
阶段 7: 响应生成
通过数值计算,我们找到了函数 $ y = \\sin x + x $ 和 $ y = x^2 $ 的交点。
这些交点对应于方程:
$$\\sin x + x = x^2$$
经过计算,得到两个交点的横坐标近似为:
1. $ x_1 \\approx 0 $
2. $ x_2 \\approx 1.6175 $
阶段 8: 流式输出
data: {"content": "通过数值计算,"} data: {"content": "我们找到了函数"} data: {"content": " $ y = \\sin x + x $ ..."}
Content-Type: text/event-stream, Cache-Control: no-cache阶段 9: 前端渲染
流式处理:
数据转换:
数据隔离:
性能优化:
LangChain Agent 采用分层架构设计,包含输入层、推理层、执行层和输出层:
输入层组件:
推理层组件:
执行层组件:
输出层组件:
数据流向:
Agent 交互流程分为两个主要模式:流式响应模式和非流式响应模式。
流式响应模式流程:
请求阶段
流式生成阶段
工具调用阶段(如需要)
响应阶段
非流式响应模式流程:
与流式模式类似,但所有内容在服务端完整生成后一次性返回,适合短时间可完成的简单计算任务。
关键特性:
函数求值专家 Agent 依赖于完整的生态系统,从用户界面到基础设施各层协同工作。
用户层:
应用层:
Agent 核心:
AgentRun 平台:
AI 服务层:
计算库层:
基础设施层:
生态依赖关系:
优势:
Agent 在执行数学计算任务时,会经历多个状态转换,每个状态都有明确的职责和转换条件。
状态说明:
初始化状态
create_agent() 创建 Agent 实例等待请求状态
推理中状态
工具调用状态
沙箱执行状态
流式输出状态
stream_generator() 逐步生成内容并返回完成状态
错误状态
状态转换规则:
超时处理机制:
Config(timeout=180) 设置,默认 180 秒sandbox_idle_timeout_seconds=300 设置,默认 300 秒timeout=300,默认 300 秒流式与非流式模式差异:
| 特性 | 流式模式 | 非流式模式 |
|---|---|---|
| 响应方式 | 逐步返回 | 一次性返回 |
| 用户体验 | 实时展示计算过程 | 等待完整结果 |
| 适用场景 | 复杂计算、长时间任务 | 简单计算、快速响应 |
| 状态流转 | 经过流式输出状态 | 直接完成 |
关键代码位置:
main.py:9000 - create_agent()main.py:9000 - invoke_agent()main.py:9000 - stream_generator()main.py:9000 - try-except 块性能优化建议:
本节详细展示函数求值专家应用中各核心组件之间的关系、接口和通信方式,帮助开发者理解系统的组件结构和职责划分。
用户交互层
职责: 提供用户访问入口,接收用户输入和展示计算结果
核心组件:
通信方式:
前端服务层
职责: 提供 Web 界面,处理用户交互,渲染响应内容
核心组件:
通信方式:
关键接口:
GET /:返回主页面POST /api/*:API 代理接口,转发请求到后端后端服务层
职责: 处理业务逻辑,调用 AI 模型,执行代码计算
核心组件:
通信方式:
关键接口:
POST /openai/v1/chat/completions:聊天完成接口AI 服务层
职责: 提供 AI 推理能力和代码执行能力
核心组件:
通信方式:
关键接口:
基础设施层
职责: 提供计算、网络、存储等基础服务
核心组件:
部署关系:
组件职责划分
| 组件层 | 核心职责 | 关键组件 |
|---|---|---|
| 用户交互层 | 用户访问 | 浏览器、客户端 |
| 前端服务层 | 用户界面 | HTTP 服务器、UI、JS |
| 后端服务层 | 业务逻辑 | Server、Agent、规划引擎 |
| AI 服务层 | AI 能力 | LLM 服务、代码解释器 |
| 基础设施层 | 基础服务 | FC3、AgentRun、网络、存储 |
通信协议
| 通信路径 | 协议 | 说明 |
|---|---|---|
| 用户交互层 → 前端服务层 | HTTP | 标准 HTTP 请求 |
| 前端服务层 → 后端服务层 | HTTP | API 代理 |
| 后端服务层 → AI 服务层 | 自定义协议 | 模型调用、工具调用 |
| 前端服务层 → 基础设施层 | 部署协议 | 函数计算部署 |
| 后端服务层 → 基础设施层 | 托管协议 | Agent 托管 |
优势
| 依赖名称 | 版本 | 用途 |
|---|---|---|
| Python | 3.12 | 运行时环境 |
| agentrun-sdk | 0.0.7 | AgentRun SDK,包含 LangChain 和 Server 集成 |
| LangChain | - | Agent 框架 |
| NumPy | - | 数值计算库(代码解释器中) |
| Pandas | - | 数据处理库(代码解释器中) |
| 依赖名称 | 版本 | 用途 |
|---|---|---|
| Marked.js | 11.0.0 | Markdown 渲染 |
| KaTeX | 0.16.9 | 数学公式渲染 |
| Highlight.js | 11.9.0 | 代码语法高亮 |
| 依赖名称 | 说明 |
|---|---|
| 阿里云函数计算 FC3 | 云函数计算平台 |
| AgentRun 平台 | Agent 托管和管理平台 |
| 大语言模型 (qwen3-max) | AI 推理引擎 |
| 代码解释器沙箱 (qwen3-coder-plus) | Python 代码执行环境 |
步骤详解:
用户输入数学问题
Agent 分析问题
生成计算策略
判断是否需要代码执行
Agent 处理结果
格式化为 Markdown
流式返回前端
前端渲染
展示给用户
关键特性:
在 AgentRun 控制台中进行可视化配置:
| 环境变量 | 说明 | 默认值 |
|---|---|---|
MODEL_SERVICE | 模型服务地址 | - |
MODEL_NAME | 模型名称 | qwen3-max |
CODE_INTERPRETER_TEMPLATE | 代码解释器沙箱模板名称 | - |
BACKEND_URL | 后端服务 URL(前端使用) | - |
| 资源项 | 前端 | 后端 |
|---|---|---|
| 内存 | 1024MB | 2048MB |
| CPU | 1核 | 1.0核 |
| 超时 | 600秒 | 180秒 |
| 并发 | 100 | 10 |
本节展示函数求值专家应用部署到阿里云函数计算 FC3 后的完整架构,包括各个组件之间的关系和资源配置。
前端服务 (agentrun_frontend)
后端服务 (agentrun_backend)
MODEL_SERVICE:模型服务地址MODEL_NAME:模型名称(qwen3-max)CODE_INTERPRETER_TEMPLATE:代码解释器沙箱模板名称BACKEND_URL:后端服务 URLAI 服务层
基础设施层
本节展示从零开始部署函数求值专家应用到阿里云 FC3 的完整流程,包括前置准备、构建、部署、配置和验证五个阶段。
阶段 1: 前置准备
安装 Serverless Devs 工具
npm install -g @serverless-devs/s
-g 参数全局安装配置阿里云凭证
s config add
准备模型和沙箱
阶段 2: 构建后端依赖
进入项目目录
cd src
构建后端服务
s build agentrun_backend
build.yaml 配置python 目录./python 目录阶段 3: 部署应用
s deploy
s.yaml 配置阶段 4: 配置环境变量
MODEL_SERVICE:模型服务地址MODEL_NAME:模型名称(qwen3-max)CODE_INTERPRETER_TEMPLATE:代码解释器沙箱模板名称BACKEND_URL:后端服务 URL阶段 5: 验证部署
获取部署信息
s info
测试前端访问
curl http://<frontend-url>
测试 API 调用
curl http://<backend-url>/openai/v1/chat/completions \
-X POST \
-H "Content-Type: application/json" \
-d '{
"messages": [
{
"role": "user",
"content": "帮我计算一下y=sin(x)+2x和y=x^2的交点"
}
],
"stream": true
}'
安装 Serverless Devs 工具
npm install -g @serverless-devs/s
配置阿里云凭证
s config add
进入项目目录
cd src
构建后端依赖
s build agentrun_backend
部署应用
s deploy
记录部署完成后提供的 URL
安装依赖
cd src/code/agentrun-backend
pip install -r requirements.txt
设置环境变量
export MODEL_SERVICE="your-model-service"
export MODEL_NAME="your-model-name"
export CODE_INTERPRETER_TEMPLATE="your-sandbox-template"
启动后端服务
python main.py
启动前端服务
cd src/code/agentrun-frontend
python server.py
访问 http://localhost:8000
main.py 中导入新的工具create_agent() 的 tools 参数中index.html 中添加 UI 元素logger.info() 输出调试信息阶段详解:
需求阶段
需求分析
制定开发计划
开发阶段
后端开发
main.py 中实现后端逻辑前端开发
index.html 中添加 UI 元素测试
提交阶段
提交代码
git commit 提交代码推送到远程
git push 推送到远程仓库审查阶段
创建 Pull Request
代码审查
修改和合并
部署阶段
部署到生产环境
s deploy 部署应用验证部署
最佳实践:
| 接口 | 方法 | 说明 |
|---|---|---|
/openai/v1/chat/completions | POST | 聊天完成接口 |
请求 URL: POST /openai/v1/chat/completions
请求头:
Content-Type: application/json x-agentrun-session-id: agentrun-math-demo
请求体:
{
"messages": [
{
"role": "user",
"content": "帮我计算一下y=sin(x)+2x和y=x^2的交点"
}
],
"stream": true
}
请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| messages | array | 是 | 消息列表 |
| stream | boolean | 否 | 是否流式响应(默认 true) |
响应(流式):
data: {"content": "通过数值计算,我们找到了函数..."} data: {"content": "这些交点对应于方程..."} data: [DONE]
响应(非流式):
{
"messages": [
{
"role": "assistant",
"content": "计算结果..."
}
]
}
| 错误码 | 说明 |
|---|---|
| 400 | 请求参数错误 |
| 500 | 服务器内部错误 |
| 504 | 请求超时 |
本节详细展示函数求值专家应用中 SSE(Server-Sent Events)流式通信的完整流程,包括连接建立、数据传输、错误处理和性能优化等技术细节。
阶段 1:请求建立
用户输入
构建请求
const requestBody = {
messages: [{ role: 'user', content: message }],
stream: true
};
stream: true 启用流式模式发送请求
const response = await fetch('/api/openai/v1/chat/completions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(requestBody)
});
转发请求
阶段 2:连接建立
接收请求
检查流式
request.stream 是否为 true调用 Agent
invoke_agent(request) 函数创建生成器
stream_generator() 生成器函数def stream_generator():
result = agent.stream(input, stream_mode="messages")
for chunk in result:
yield pydash.get(chunk, "[0].content")
return stream_generator()
设置响应头
Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive
阶段 3:流式数据传输循环
流式生成
agent.stream(input, stream_mode="messages")返回片段
Yield 数据
yield 返回内容片段SSE 封装
data: {"content": "内容片段"}
SSE 推送
读取数据
reader.read() 读取数据const reader = response.body.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) break;
// 处理数据
}
解码数据
TextDecoder 解码数据const decoder = new TextDecoder();
const chunk = decoder.decode(value, { stream: true });
解析格式
data: {...}const lines = buffer.split('\n');
buffer = lines.pop() || '';
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = line.slice(6).trim();
// 处理数据
}
}
JSON 解析
JSON.parse(data) 解析 JSONconst json = JSON.parse(data);
const delta = json.choices?.[0]?.delta;
if (delta?.content) {
accumulatedText += delta.content;
}
累积内容
accumulatedText实时渲染
const UPDATE_INTERVAL = 200;
if (now - lastUpdateTime > UPDATE_INTERVAL) {
showStreamingStatus(currentMessageElement, accumulatedText);
lastUpdateTime = now;
}
显示内容
阶段 4:工具调用(可选)
调用工具
执行代码
返回结果
继续生成
阶段 5:流式结束
Yield DONE
[DONE] 标记SSE 封装
data: [DONE]
SSE 推送
读取数据
[DONE] 标记解析标记
[DONE] 标记if (data === '[DONE]') {
isComplete = true;
break;
}
流式完成
最终渲染
renderCompleteContent(currentMessageElement, accumulatedText);
显示结果
1. SSE 格式规范
data: {"content": "内容片段"} data: {"content": "更多内容"} data: [DONE]
data: 开头[DONE] 表示结束2. 响应头设置
Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive
text/event-stream:SSE 专用媒体类型no-cache:禁用缓存keep-alive:保持长连接3. 前端读取流程
const reader = response.body.getReader();
const decoder = new TextDecoder();
let buffer = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value, { stream: true });
buffer += chunk;
const lines = buffer.split('\n');
buffer = lines.pop() || '';
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = line.slice(6).trim();
// 处理数据
}
}
}
4. 缓冲区管理
5. 性能优化
6. 错误处理
try {
const response = await fetch('/api/openai/v1/chat/completions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(requestBody)
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
// 处理流式数据
} catch (error) {
console.error('请求失败:', error);
// 显示错误信息
}
| 特性 | SSE | WebSocket |
|---|---|---|
| 通信方向 | 单向(服务器 → 客户端) | 双向 |
| 协议 | HTTP | HTTP + WebSocket |
| 连接保持 | 长连接 | 长连接 |
| 数据格式 | 文本(event-stream) | 文本/二进制 |
| 浏览器支持 | 广泛支持 | 广泛支持 |
| 适用场景 | 实时推送、流式响应 | 实时双向通信 |
选择 SSE 的原因:
输入: "计算 f(x) = x³ - 2x² + 3x - 1 在 x=2 时的值"
Agent 处理过程:
def f(x):
return x**3 - 2*x**2 + 3*x - 1
result = f(2)
print(f"f(2) = {result}")
输出: "f(2) = 5"
输入: "求解方程 2x² - 5x + 2 = 0"
输出: "方程的解为 x₁ = 2, x₂ = 0.5"
输入: "计算函数 f(x) = x² 在区间 [0, 1] 上的定积分"
Agent 处理过程:
import numpy as np
def f(x):
return x**2
# 使用数值积分
x = np.linspace(0, 1, 10000)
integral = np.trapz(f(x), x)
print(f"定积分的值为: {integral}")
输出: "定积分的值为: 0.3333"
输入: "计算矩阵 A = [[1, 2], [3, 4]] 和 B = [[5, 6], [7, 8]] 的乘积"
Agent 处理过程:
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
result = np.dot(A, B)
print("矩阵乘积:")
print(result)
输出:
矩阵乘积: [[19 22] [43 50]]
输入: "计算数据集 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 的平均值、中位数和标准差"
Agent 处理过程:
import numpy as np
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
mean = np.mean(data)
median = np.median(data)
std = np.std(data)
print(f"平均值: {mean}")
print(f"中位数: {median}")
print(f"标准差: {std}")
输出:
平均值: 5.5 中位数: 5.5 标准差: 2.872
输入: "求函数 f(x) = x³ - 3x² + 2 的极值"
Agent 处理过程:
import numpy as np
def f(x):
return x**3 - 3*x**2 + 2
def df(x):
return 3*x**2 - 6*x
# 找到导数为零的点
roots = np.roots([3, -6, 0])
critical_points = [root.real for root in roots if abs(root.imag) < 1e-10]
for x in critical_points:
y = f(x)
second_derivative = 6*x - 6
if second_derivative > 0:
print(f"极小值点: x = {x:.4f}, f(x) = {y:.4f}")
else:
print(f"极大值点: x = {x:.4f}, f(x) = {y:.4f}")
输出:
极大值点: x = 0.0000, f(x) = 2.0000 极小值点: x = 2.0000, f(x) = -2.0000
Q: 如何提高计算准确性?
A: 选择更强大的模型(如 qwen3-max),并将温度参数设置为较低值(0-0.3)。
Q: 遇到计算超时怎么办?
A: 在控制台增加超时时间设置,或将复杂问题拆解为多个简单步骤。
Q: 支持哪些数学函数?
A: 支持 Python 标准库中的所有数学函数,包括三角函数、对数、指数等。在代码解释器中还可以使用 NumPy 和 Pandas 的所有功能。
Q: 如何处理复杂的数学表达式?
A: 将复杂问题拆解为多个步骤,或者使用更明确的描述。例如,不要只说"求解这个方程",而是说"求解方程 x³ - 2x² + x - 1 = 0 的所有实数根"。
Q: 前端无法连接到后端怎么办?
A: 检查 BACKEND_URL 环境变量是否正确配置,确保后端服务正常运行。
Q: 数学公式渲染不正常怎么办?
A: 检查 KaTeX CDN 是否可访问,确保网络连接正常。
Q: 代码执行结果不显示怎么办?
A: 检查代码解释器沙箱是否正常启动,查看后端日志获取错误信息。
Q: 部署失败怎么办?
A: 检查阿里云凭证是否正确配置,确保有足够的权限和资源配额。
Q: 如何更新应用?
A: 修改代码后,重新执行 s deploy 命令即可更新应用。
Q: 如何查看应用日志?
A: 在阿里云函数计算控制台中查看日志,或使用 s logs 命令。
我们欢迎任何形式的贡献!
步骤详解:
Fork 项目
创建特性分支
git clone https://github.com/your-username/math-expert.git
cd math-expert
git checkout -b feature/AmazingFeature
feature/功能描述 或 fix/问题描述开发修改
提交更改
git add .
git commit -m 'Add some AmazingFeature'
feat: 添加矩阵计算功能、fix: 修复公式渲染错误推送到分支
git push origin feature/AmazingFeature
开启 Pull Request
代码审查
合并代码
贡献类型:
注意事项:
如果您发现任何问题,请在 GitHub Issues 中提交,包含:
本项目采用 GNU Affero General Public License v3.0 (AGPL-3.0) 开源协议。
根据 AGPL-3.0 协议,如果您修改了本项目的代码并在网络上提供服务(如部署为 Web 应用),您必须向用户提供修改后的源代码。
联系方式: 如有问题或建议,请通过 GitHub Issues 联系我们。
最后更新: 2026-01-18