文档版本: 1.0
日期: 2026-05-19
面向读者: 产品 / 开发团队
LambdAgent PaaS 目前的使用方式以命令行(CLI)和 YAML 文件为主:
./setup.sh、配置 .env 文件agentpaas run ag_xxx "输入" 等命令这套流程对有编程背景的用户友好,但非计算机专业的使用者面临明显门槛:不会用终端、不懂 YAML 格式、不知道如何管理 API Key。
提供一个本地运行的 Web 管理界面,让非技术用户能够:
| 用户类型 | 描述 | 典型需求 |
|---|---|---|
| 领域专家 | 医疗、法律、金融等专业人员,会使用电脑但不懂编程 | 快速创建垂直领域问答智能体、上传知识库 |
| 企业内部用户 | 行政、运营、销售,需要在内网使用 AI 助理 | 开箱即用的对话界面,不需要了解底层 |
| 科研人员 | 有一定技术背景,但希望聚焦业务而非运维 | 可视化配置 + 查看执行轨迹 |
| 学生/课堂使用 | 初学者,跟随教程进行实验 | 安装向导引导 + 简单的智能体 Demo |
首次使用
└─→ 安装向导(3步)
├─ 环境检测(Python/Docker)
├─ 选择 LLM 提供商 + 填写 API Key
└─ 一键启动服务 → 进入主界面
日常使用
├─ 仪表盘:系统状态 + 最近运行
├─ 智能体管理:创建 / 编辑 / 删除
│ └─ 实例管理:一个模板,多个领域实例
├─ 对话界面:选择智能体,发消息,看回复
└─ 历史 & 费用:查看过往运行与 Token 消耗
触发条件: 本地服务从未配置(无 ~/.agentpaas/config.json 或服务未启动时打开 UI)
sk- 前缀)agentpaas serve 启动后端(展示进度条 + 日志)路由: /dashboard
对应后端: GET /api/v1/status、GET /api/v1/metrics
| 区块 | 内容 |
|---|---|
| 服务状态 | 后端是否在线、版本号 |
| 智能体概览 | 总数、活跃数、本周新增 |
| 今日运行 | 运行次数、成功率、平均耗时 |
| Token 消耗 | 今日/本月输入+输出 Token(折线图) |
| 最近运行 | 最近 5 次运行的智能体名称、输入摘要、状态、时间 |
| 提供商状态 | 已配置的 LLM 提供商连通性指示灯 |
路由: /agents
对应后端: GET/POST/PUT/DELETE /api/v1/agents
"基础设置"标签页
"模型配置"标签页
"智能体类型"标签页
ConversationLam)— 保持完整会话历史Loop)— 工具调用 + 多步推理Compose)— 多智能体串联GroupChat)— 多角色讨论"系统提示词"标签页
systemPrompt"工具与知识库"标签页(选填)
"高级设置"标签页(可收起)
预览与保存
POST /api/v1/agents 创建路由: /agents/:agentId/edit
对应后端: GET /api/v1/agents/{id}、PUT /api/v1/agents/{id}
入口: 智能体列表页每张卡片右上角的设置(⚙)按钮
表单结构(6 个标签页,与从模版导入一致):
| 标签页 | 字段 |
|---|---|
| 基本设置 | 名称、描述、智能体类型、工作目录(agent_dir) |
| 模型配置 | 提供商、模型、Temperature、Max Tokens、Base URL |
| 行为配置 | 最大步数、工具超时、思考超时 |
| 记忆 & 运行时 | 记忆开关/大小/TTL、执行引擎、费用上限 |
| 工具列表 | mcp.localTools 可编辑标签列表 |
| 系统提示词 | systemPrompt 多行文本 |
工作目录(agent_dir)字段说明:
agentexample/ 下的某个智能体目录(如 agentexample/research67)workspace/run_* 子目录,工具写入的文件保存于此保存行为:
current_version + 1),配置不变时不创建新版本agent_dir 变更同步写入 agents 表(不受版本控制,立即生效)/chat/:agentId),新配置立即生效路由: /agents/import
对应后端: GET /api/v1/templates、GET /api/v1/templates/{id}
背景: 项目 agentexample/ 目录下存放着多个预置智能体模版(YAML 配置),用户可以以此为基础快速创建实例,无需从头填写每项配置。
两步流程:
第一步 — 选择模版
agentexample/ 下各子目录的 agent-config.yml / orchestrator.yml,返回模版列表GET /api/v1/templates/{id})第二步 — 自定义配置(3 个标签页)
| 标签页 | 字段 | 来源 |
|---|---|---|
| 基本设置 | 智能体名称(必填) | 用户输入 |
| 模型配置 | 提供商下拉、模型下拉、Temperature、Max Tokens | 模版预填,可修改 |
| 系统提示词 | systemPrompt 多行文本框 | 模版预填,可修改 |
MODEL_MAP 内置各提供商可选模型)POST /api/v1/agents 创建/chat/{agent_id}后端模版发现规则:
{CWD}/agentexample/,若不存在则逐级向上查找(最多 6 层)agent-config.yml 或 orchestrator.yml 则识别为一个模版id(目录名)、name、description、type、provider、model、has_tools、has_memory入口: 智能体列表页(/agents)右上角"从模版导入"按钮
概念说明提示框: "一个智能体模板可以为不同领域(如航运、金融)创建独立实例,每个实例有独立知识库,互不干扰。"
instance_dir)路由: /chat/:agentId(或 /chat/:agentId/instance/:instanceId)
对应后端: POST /api/v1/agents/{agent_id}/run(流式)
┌─────────────────────────────────────────┐
│ [智能体名称] [模型] [会话设置] │ 顶部栏
├──────┬──────────────────────────────────┤
│ 历史 │ │
│ 会话 │ 消息区域 │
│ 侧边 │ (用户消息 / 智能体回复气泡) │
│ │ │
│ ├──────────────────────────────────┤
│ │ [文本输入框] [发送] [停止] │ 输入区
└──────┴──────────────────────────────────┘
/run 流式模式)路由: /runs
对应后端: GET /api/v1/agents/{agent_id}/runs、GET /api/v1/traces/{run_id}
路由: /settings/providers
对应后端: agentpaas provider 相关 CLI(封装为 API)
sk-xxx...xxx),支持显示/隐藏切换路由: /settings/usage
对应后端: GET /api/v1/billing/usage、GET /api/v1/metrics
路由: /settings
| 设置项 | 说明 |
|---|---|
| 服务端口 | 修改本地 API 服务端口(默认 8000) |
| 主题 | 亮色 / 暗色 |
| 语言 | 中文 / English |
| 数据目录 | 本地数据库 & 工作区存储路径 |
| 导出配置 | 将所有智能体配置导出为 ZIP(含 YAML) |
| 导入配置 | 从 ZIP 批量导入智能体 |
| 备份与恢复 | 手动备份 agentpaas.db |
| 日志查看 | 内嵌展示最近 500 行服务日志(支持过滤) |
路由: /chat/:agentId
对应后端: GET /api/v1/agents/{agent_id}/runs
背景: 流式对话端点 /run/stream 原先不写数据库,刷新页面后对话历史丢失。
修复方案:
/run/stream 执行前 INSERT INTO runs(状态 running)UPDATE 写入 output、steps、workspace_path、Token 用量UPDATE 写入 error 和 status=failedGET /agents/{id}/runs 在首次加载时还原历史对话气泡done 事件后调用 queryClient.invalidateQueries(['runs', agentId]) 保持缓存新鲜数据流: 用户发消息 → SSE 流式推送 → done 事件 → DB 更新 → 下次打开自动还原
路由: /chat/:agentId(工作区面板内嵌于对话界面)
对应后端: GET /api/v1/agents/{agent_id}/runs/{run_id}/workspace、GET /api/v1/agents/{agent_id}/runs/{run_id}/workspace/{file_path}
背景: 智能体(尤其是 research67、data67、pptagent67)执行后会在 workspace/run_*/ 目录生成文件,但原先没有任何界面可以查看或下载这些文件。
功能点:
后端(agents.py 新增):
GET /{agent_id}/runs/{run_id}/workspace — 递归列出 workspace 目录下所有文件,返回 [{name, path(相对路径), size, modified}]GET /{agent_id}/runs/{run_id}/workspace/{file_path:path} — 下载指定文件,含路径穿越防护(os.path.realpath 校验必须在 workspace 目录内)前端(Chat 页面):
安全: 只允许下载已认证 tenant 所拥有 run 的 workspace 文件;服务端校验路径在 workspace 目录内。
路由: /chat/:agentId(记忆面板内嵌于对话界面右侧)
对应后端: GET /api/v1/agents/{agent_id}/memory、DELETE /api/v1/agents/{agent_id}/memory/{key}
背景: 智能体通过 MemoryStore/MemoryRecall 工具写入 ~/.lambdagent/memory.db,但没有界面可以查看或管理。用户无法知道智能体"记住了什么",也无法清除错误记忆。
功能点:
后端(agents.py 新增):
GET /{agent_id}/memory — 列出该智能体的所有有效记忆(source = agent_id,过滤过期条目),返回 key、content、tier(working/episodic/semantic)、tags、created_atDELETE /{agent_id}/memory/{key} — 删除指定记忆条目前端(Chat 页面):
路由: /knowledge、/knowledge/:kbId
对应后端: GET/POST/PUT/DELETE /api/v1/knowledge(新增)
关联脚本: agentexample/qaagent67lambda/scripts/(app.py、build_index.py、wiki_compile.py、search_unified.py、graph_engine.py 等)
现有 QA 智能体(qaagent67lambda、qaagent67、qaagent67lite)已有完整的离线处理流水线:
extract_pdfs.py / extract_docs.py — 批量提取 PDF / DOCX 为纯文本build_index.py / build_vector_index.py — 构建 BM25 / 向量检索索引wiki_compile.py — LLM 逐文档理解 → 生成 sources/、entities/、topics/ 三级 Wiki 页面graph_engine.py — 从 Wiki relations.json 构建实体关系图谱(BFS N跳遍历)search_unified.py — LambdaRAG v3 四路检索融合(BM25 + 向量 + 图谱 + Wiki)这些脚本的路径(/home/67/knowledge/maritime/)目前通过 instance.yml 配置,但缺乏 Web 管理界面。本需求将其封装为可通过 Web UI 配置和触发的「知识体」。
以下分析基于对
http://qa.lambdagent.cn:8080(海事法规)和http://qa.lambdagent.cn:8084(投标文件)两个在线服务的调研,以及对本地源码的全面阅读(2026-05-27)。
服务器代码位置(qa.lambdagent.cn):
| 文件 | 说明 |
|---|---|
/home/67/qademo/app.py |
主应用(本地源:agentexample/qaagent67lambda/scripts/app.py) |
/home/67/qademo/deploy_domain.sh |
一键部署新领域的 shell 脚本 |
/home/67/qademo/instance.yml.template |
新领域配置模板 |
/home/67/knowledge/maritime/ |
海事 KB(8080):1326 文档,BM25+向量+图谱+Wiki |
/home/67/knowledge/clean/ |
投标 KB(8084):49 文档,1527 chunks |
/home/67/knowledge/{domain}/instance.yml |
各领域配置覆盖层 |
运行方式:每个领域独立 Docker 容器(maritime-qa、clean-qa 等),deploy_domain.sh {domain} 一键启动。
架构优势(Web UI 需保留并集成):
| 优势 | 实现位置 | 说明 |
|---|---|---|
| LambdaRAG 四路检索融合 | search_unified.py |
意图分类(6类:fact/process/person/compare/temporal/data)→ 实体提取 → BM25+向量+图谱+Wiki 并行检索 → RRF 融合 → 槽位填充 → 富文本上下文 |
| 意图自适应权重 | config.py weight_profiles |
按检测到的意图类型自动切换融合权重(如 temporal 查询 BM25 权重=1.0,compare 查询向量权重=0.8) |
| Corrective RAG | search_unified.py P1-1 |
检索质量评分不足时自动改写查询并重试,减少无关结果 |
| 实体关系图谱 | graph_engine.py |
从 wiki/relations.json 构建邻接表,BFS N跳遍历扩展实体上下文 |
| 三层 Wiki 体系 | wiki_compile.py |
sources/(逐文档摘要)/ entities/(命名实体)/ topics/(主题聚合)/ analyses/(即席编译) |
| A/B 对比面板 | app.py HTML |
5 种检索策略同屏对比(Lite / LambdaRAG / Wiki Only / BM25 Baseline / Direct LLM) |
| Wiki/RAG 浏览器 | /wiki、/rag 路由 |
内置知识库内容检视页,可浏览 wiki 页面和搜索原始 chunks |
| 反馈日志 | feedback/query_log.jsonl |
自动记录每次检索的意图、实体、策略,以及 missing_queries 检索盲区 |
| 实例配置体系 | instance.yml + config.py |
无需改代码即可通过 YAML 新增领域(路径/模型/权重/UI文案全部可配) |
现有实现的缺口(Web UI 需弥补):
| # | 缺口 | 问题描述 | 对应 UI 需求 |
|---|---|---|---|
| G1 | 无文件摄入 UI | 建库需 SSH 上传文件 + CLI 运行脚本 | 4.12.1 目录浏览器 + 一键加入 |
| G2 | 无索引健康监控 | 不知索引是否最新、有多少文档失败 | 4.12.2 状态指示器 + 失败文件列表 |
| G3 | Wiki 编译无可视化 | wiki_compile.py 进度只有终端日志 |
4.12.3 实时进度 + 断点续传控制 |
| G4 | Wiki 内部检索质量差 | 用字符频率(sum(1 for c in q_chars ...))代替 BM25/向量匹配 |
4.12.2 补充:wiki 搜索改用 BM25 全文检索 |
| G5 | 5路并行浪费算力 | 每次查询触发 5 个完整 LLM 调用,即使用户只看 2 个面板 | 4.12.4 搜索测试:懒加载/按需触发各模式 |
| G6 | 无流式输出 | 答案完整生成后才推送(2s 轮询),体验延迟高 | 4.12.4 搜索测试:接入 SSE 流式输出 |
| G7 | 对话历史是 JSON 文件 | 无搜索、无用户隔离、重启丢失、线程写入竞争 | 4.12.4 历史:写入 agentpaas.db |
| G8 | 无检索权重可视化调优 | instance.yml 手写权重,无法实时观测效果 | 4.12.4 新增:权重滑块 + 实时效果对比 |
| G9 | 无增量文档更新 | 新增文档需全量重建索引(BM25 重扫全库) | 4.12.2 增量更新 Job |
| G10 | 无评测集成 | generate_questions.py/analyze_results.py 存在但未接入 UI |
Phase 4 评估面板 |
| G11 | Analyses 目录无管理 | 即席编译的 wiki analyses/ 无限积累,无去重/归档 | 4.12.3 Wiki 目录 → analyses 管理子面板 |
| G12 | 领域创建需手工 | 新领域需 SSH + 编辑 instance.yml + 运行脚本 | 4.12.1 新建知识体向导(GUI 版 deploy_domain.sh) |
/knowledge)布局: 卡片网格,每张卡片代表一个知识体。
每张卡片显示:
| 字段 | 说明 |
|------|------|
| 名称 | 用户自定义,如"航运规范"、"法律合同" |
| 根目录 | 本地文件夹路径(如 /data/maritime) |
| 文档数量 | 已加入的文件数 |
| 索引状态 | 未索引 / BM25 已就绪 / 向量已就绪 / Wiki 已生成 |
| 最近更新 | 上次构建时间 |
操作:
/knowledge/:kbId)详情页分为四个子标签:文件管理 / 索引构建 / Wiki 目录 / 搜索测试
目录浏览器:
文件操作:
文件解析流程(加入时触发):
extract_pdfs.py 逻辑提取纯文本,存入 processed/ 子目录processed/展示三种索引的构建状态与操作:
| 索引类型 | 说明 | 对应脚本 |
|---|---|---|
| BM25 关键词索引 | 轻量、无需 GPU,适合精确关键词检索 | build_index.py |
| 向量语义索引 | 需要嵌入模型,支持语义搜索 | build_vector_index.py |
| 图谱索引 | 实体-关系图,支持关联推理 | graph_engine.py |
每种索引的操作面板:
构建日志:
INFO: 处理 128/1326 ...)Wiki 是什么: 由 LLM 逐文档阅读后自动生成的结构化知识页面,分四层(wiki_compile.py 输出):
sources/ — 每个原始文档的摘要页(1文档 = 1 页)entities/ — 抽取出的实体(人名、公司、术语、地名等)及其关系topics/ — 主题聚合页(将多篇文档的相关内容汇总)analyses/ — 即席编译生成的临时知识页(查询时按需生成,参见现有 wiki_answer() 逻辑)Wiki 构建面板:
配置项:
| 配置 | 说明 |
|------|------|
| LLM 提供商 | 选择用于 Wiki 编译的模型(建议 32B+ 或 Claude) |
| 编译模式 | 增量(仅处理未编译文档)/ 全量重建 |
| 并发数 | 同时处理的文档数(1–8) |
| 断点续传 | 默认开启,中断后从 .compile_progress.json 继续(wiki_compile.py 内置支持) |
操作:
wiki_compile.py 逻辑wiki_compile.py 的 .compile_progress.json 断点机制已完成 / 总文档数,预计剩余时间Wiki 内容浏览器:
index.md / sources/ / entities/ / topics/(显示每类页面数量统计)Analyses 管理子面板(修复 G11):
analyses/ 下所有即席编译页,显示:文件名(来源查询)、大小、创建时间提供交互式搜索界面,用于验证知识体质量(参考现有 app.py 的 A/B 对比面板,弥补其 G5/G6/G8 缺口):
搜索配置:
A/B 对比模式(参考现有 demo,修复 G5):
检索权重可视化调优(修复 G8):
流式问答测试(修复 G6):
搜索结果展示: 每条 chunk 结果显示:
历史记录(修复 G7):
agentpaas.db,按知识体隔离,支持搜索和导出与智能体联动:
在智能体编辑页(4.3.3)的"工具与知识库"标签页中:
mcp.localTools 中的 KBSearch、KBCreate、KBAdd 工具kb_dir 字段)| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/api/v1/knowledge |
列出所有知识体(含索引状态摘要) |
POST |
/api/v1/knowledge |
创建知识体(name, root_dir) |
PUT |
/api/v1/knowledge/:kbId |
更新知识体配置(含检索权重) |
DELETE |
/api/v1/knowledge/:kbId |
删除知识体 |
GET |
/api/v1/knowledge/:kbId/files |
列出根目录文件树(含加入状态) |
POST |
/api/v1/knowledge/:kbId/files |
加入文件(触发文本提取) |
DELETE |
/api/v1/knowledge/:kbId/files/:fileId |
从知识体移除文件(不删原文) |
POST |
/api/v1/knowledge/:kbId/index |
触发索引构建 Job(type: bm25/vector/graph,mode: full/incremental) |
POST |
/api/v1/knowledge/:kbId/wiki |
触发 Wiki 编译 Job(mode: incremental/rebuild) |
PUT |
/api/v1/knowledge/:kbId/wiki/pause |
暂停/恢复 Wiki 编译(写 .compile_progress.json 停止标志) |
GET |
/api/v1/knowledge/:kbId/wiki/tree |
获取 Wiki 文件树(sources/entities/topics/analyses 分组) |
GET |
/api/v1/knowledge/:kbId/wiki/:path |
获取单个 Wiki 页面内容(Markdown) |
DELETE |
/api/v1/knowledge/:kbId/wiki/analyses/:name |
删除 analyses/ 下指定即席编译页 |
POST |
/api/v1/knowledge/:kbId/search |
在线搜索测试(返回 chunks + 意图分类 + 各路命中数) |
GET |
/api/v1/knowledge/:kbId/search/stream |
SSE 流式问答测试(LLM 逐字输出,修复 G6) |
GET |
/api/v1/knowledge/:kbId/jobs |
查询 Job 状态(索引/Wiki 构建进度 + 失败文件列表) |
GET |
/api/v1/knowledge/:kbId/feedback |
获取反馈日志(query_log + missing_queries,修复 G10 前期准备) |
Job 进度通过 SSE(/api/v1/jobs/{job_id}/stream)实时推送,格式:data: {"progress": 128, "total": 1326, "current_file": "xxx.pdf", "errors": []}。
agentexample/qaagent67lambda/scripts/ 中各脚本的对应关系:
| 脚本 | 对应 UI 功能 | 整合方式 |
|---|---|---|
extract_docs.py |
文件管理 → 加入知识体(PDF/DOCX/HTML) | 封装为 kb_service.extract_file(path) |
build_index.py |
索引构建 → BM25(全量/增量) | 封装为 kb_service.build_bm25(kb_id, mode) |
build_vector_index.py |
索引构建 → 向量(bge-m3) | 封装为 kb_service.build_vector(kb_id, mode) |
graph_engine.py |
索引构建 → 图谱(entity relation graph) | 封装为 kb_service.build_graph(kb_id) |
wiki_compile.py |
Wiki 目录 → 编译(断点续传) | 封装为 kb_service.compile_wiki(kb_id, cfg) |
search_unified.py |
搜索测试 → LambdaRAG 四路融合 | 封装为 kb_service.search_lambda(kb_id, query, weights) |
search_engine.py |
搜索测试 → BM25 Baseline | 被 search_unified 调用,也可独立调用 |
search_engine_v2.py |
搜索测试 → 向量语义 | 被 search_unified 调用 |
config.py |
知识体配置读取 | 适配器:Web UI 传入 kb_id,config.py 从 DB 加载路径 |
rebuild_index.py |
索引构建 → 全量重建 | 封装为 kb_service.rebuild(kb_id) |
generate_questions.py |
Phase 4:自动生成测试问题集 | kb_service.generate_eval_set(kb_id) |
analyze_results.py |
Phase 4:评估检索质量报告 | kb_service.analyze_quality(kb_id, eval_set) |
路径动态化(弥补硬编码缺口): 现有脚本通过 config.py 的 Config 类统一读取路径,Web UI 后端只需在调用前设置 INSTANCE_CONFIG 环境变量(或直接传参),即可让所有脚本使用 DB 中记录的知识体路径,无需修改脚本本身。
agentpaas serve 一起启动(内嵌到 FastAPI 的 / 路由)http://localhost:8000127.0.0.1(不对外网暴露)~/.agentpaas/providers.json 存储| 层 | 建议 | 理由 |
|---|---|---|
| 前端框架 | React 18 + Vite | 生态成熟,打包为静态 HTML/JS/CSS |
| UI 组件库 | shadcn/ui + Tailwind | 无运行时依赖,bundle 小,支持暗色模式 |
| 状态管理 | Zustand | 轻量,适合中小型应用 |
| 流式输出 | EventSource(SSE) | 接入现有 agentpaas 流式 API |
| 图表 | Recharts | React 原生,bundle 合理 |
| 后端静态服务 | FastAPI StaticFiles 挂载 dist/ 目录 |
零新增依赖,一个端口服务全部内容 |
| 构建集成 | pyproject.toml 脚本,pip install 时触发前端构建 |
对 Python 用户透明,一行安装 |
lambdagentpaas/
├── agentpaas/
│ ├── api/
│ │ └── app.py ← 挂载 /ui 静态文件 + /api 路由
│ └── ...
├── webui/ ← 前端源码
│ ├── src/
│ │ ├── pages/ ← dashboard, agents, chat, runs, settings
│ │ ├── components/ ← AgentCard, ChatBubble, TraceTree 等
│ │ └── api/ ← 封装 fetch 调用 agentpaas REST API
│ ├── package.json
│ └── vite.config.ts
└── webui-dist/ ← 构建产物(git ignore,pip install 时生成)
交付标准: 非技术用户能从零完成"安装 → 创建助手 → 对话"全流程,无需接触终端
| 问题 | 选项 | 建议 |
|---|---|---|
| 对话历史存储在哪里? | 浏览器 localStorage / agentpaas.db | 存 DB,跨标签可查 |
| 是否支持多用户本地使用? | 单用户 / 简单密码保护 | Phase 1 单用户,后续加密码锁 |
| YAML 预览是否可编辑? | 只读 / 可编辑 | Phase 1 只读,防止格式错误困扰新手 |
| 前端构建是否内嵌发布包? | 每次 pip install 构建 / 预构建产物提交 | 提交预构建产物,简化安装流程 |