feat: 所有页面添加「← 返回知识库」导航链接
Deploy Wiki to Production / deploy (push) Has been cancelled

覆盖 27 个此前缺少返回链接的报告页和独立页面(共 50 个 HTML 页,index.html 首页除外)
- 标准报告页:header/header-bar 内插入 back-link
- 特殊页面:深国际、中医馆、YqBoot、交互式演示等单独适配
- 统一文案「← 返回知识库」,URL 按目录深度自动推算
This commit is contained in:
zdh
2026-06-05 19:07:17 +08:00
parent 798200cdd2
commit 5167d9e36e
70 changed files with 12334 additions and 1323 deletions
+512
View File
@@ -0,0 +1,512 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI 核心技能原理说明</title>
<style>
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
html{font-size:16px;-webkit-text-size-adjust:100%}
body{
font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei","Noto Sans SC","Helvetica Neue",sans-serif;
color:#1d1d1f;background:#fff;line-height:1.7;-webkit-font-smoothing:antialiased;
}
.wrapper{max-width:800px;margin:0 auto;padding:56px 48px 72px}
h1{font-size:2rem;font-weight:700;letter-spacing:.04em;margin-bottom:8px}
h2{font-size:.875rem;font-weight:600;color:#86868b;text-transform:uppercase;letter-spacing:.08em;margin:40px 0 16px;padding-bottom:8px;border-bottom:1px solid #e5e5ea}
h3{font-size:1.05rem;font-weight:600;color:#1d1d1f;margin:20px 0 8px}
h4{font-size:.875rem;font-weight:600;color:#515154;margin:12px 0 4px}
p{margin-bottom:8px;font-size:.9375rem;color:#333}
ul,ol{margin:6px 0 6px 20px;font-size:.9rem;color:#333}
li{margin-bottom:4px}
pre{background:#f5f5f7;border-radius:6px;padding:14px 18px;overflow-x:auto;font-size:.8125rem;line-height:1.6;margin:10px 0;white-space:pre}
code{font-family:"SF Mono","Cascadia Code","Consolas",monospace;font-size:.8125rem}
p code,li code{background:#f5f5f7;padding:1px 6px;border-radius:3px;font-size:.8125rem}
table{width:100%;border-collapse:collapse;margin:12px 0;font-size:.85rem}
thead th{text-align:left;padding:8px 12px;font-size:.75rem;font-weight:600;color:#86868b;text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid #e5e5ea}
tbody td{padding:8px 12px;border-bottom:1px solid #f0f0f3;vertical-align:top}
tr:last-child td{border-bottom:none}
strong{color:#1d1d1f}
.tag-row{display:flex;flex-wrap:wrap;gap:8px;margin:16px 0 24px}
.tag-row span{font-size:.75rem;color:#515154;background:#f5f5f7;padding:4px 12px;border-radius:4px;font-weight:500}
.summary-box{background:#f5f5f7;border-radius:8px;padding:18px 22px;margin:14px 0;font-size:.9rem}
@media(max-width:640px){
.wrapper{padding:28px 16px 48px}
h1{font-size:1.625rem}
table{font-size:.78rem}
pre{padding:10px 14px;font-size:.75rem}
}
@media print{
.wrapper{max-width:100%;padding:0}
h2{margin-top:28px}
}
</style>
</head>
<body>
<div class="wrapper">
<a href="./index.html" style="display:inline-block;margin-bottom:8px;color:var(--color-primary);text-decoration:none;font-size:13px;">← 返回知识库</a>
<h1>AI 核心技能原理说明</h1>
<p style="color:#86868b;font-size:.875rem">系统梳理大模型应用开发的关键技术原理,涵盖从基础模型到上层应用的完整技术栈。</p>
<div class="tag-row">
<span>LLM 基础</span><span>Prompt Engineering</span><span>Agent 架构</span>
<span>Skills 编排</span><span>RAG 知识库</span><span>AI Coding</span><span>YOLO 视觉</span>
</div>
<!-- ===== 1. LLM ===== -->
<h2>大语言模型(LLM)基础</h2>
<h3>核心原理</h3>
<ul>
<li><strong>Transformer 架构</strong>:所有现代 LLM 的基础。核心是 Self-Attention 机制——每个 token 计算与序列中所有其他 token 的相关性权重,并行处理,突破 RNN 的串行瓶颈,解决长距离依赖问题。</li>
</ul>
<h4>训练三阶段</h4>
<ol>
<li><strong>Pre-training(预训练)</strong>:海量语料上做 Next Token Prediction,学习语言的统计规律和世界知识</li>
<li><strong>SFT(监督微调)</strong>:用高质量指令-回答对训练,让模型学会"对话"</li>
<li><strong>RLHF(人类反馈强化学习)</strong>:用人类偏好数据训练奖励模型,再用 PPO 优化,对齐人类价值观。解决"模型能力强但不一定听话"的对齐问题</li>
</ol>
<h3>关键概念</h3>
<table>
<thead><tr><th>概念</th><th>说明</th></tr></thead>
<tbody>
<tr><td><strong>Token</strong></td><td>模型处理的最小文本单元,中文约 1.5-2 字符/token</td></tr>
<tr><td><strong>Context Window</strong></td><td>模型一次能处理的 token 上限(如 128K、200K</td></tr>
<tr><td><strong>Temperature</strong></td><td>控制输出随机性,0 = 确定性,1 = 高随机</td></tr>
<tr><td><strong>Top-P / Top-K</strong></td><td>采样策略,限制候选 token 范围,平衡多样性与质量</td></tr>
</tbody>
</table>
<h3>主流模型对比</h3>
<table>
<thead><tr><th>模型</th><th>特点</th><th>适用场景</th></tr></thead>
<tbody>
<tr><td><strong>GPT-4o</strong></td><td>多模态,综合能力最强</td><td>复杂推理、多模态任务</td></tr>
<tr><td><strong>Claude 4</strong></td><td>长上下文 200K,安全性高,代码能力强</td><td>长文档分析、代码生成</td></tr>
<tr><td><strong>DeepSeek-V3</strong></td><td>开源,MoE 架构,性价比极高</td><td>国内部署、成本敏感场景</td></tr>
<tr><td><strong>通义千问</strong></td><td>中文优化,阿里云生态深度集成</td><td>政务、企业中文场景</td></tr>
</tbody>
</table>
<!-- ===== 2. Prompt ===== -->
<h2>Prompt Engineering</h2>
<h3>核心方法论</h3>
<table>
<thead><tr><th>技术</th><th>原理</th><th>示例</th></tr></thead>
<tbody>
<tr><td><strong>Zero-shot</strong></td><td>不给示例,直接提问</td><td>"将以下文本分类为正面/负面:..."</td></tr>
<tr><td><strong>Few-shot</strong></td><td>给 2-5 个示例,模型学习输入输出模式</td><td>示例 1 → 示例 2 → 新输入</td></tr>
<tr><td><strong>CoT(思维链)</strong></td><td>要求模型"一步步思考",激活推理能力</td><td>"让我们一步步分析:首先...其次..."</td></tr>
<tr><td><strong>结构化输出</strong></td><td>约束输出格式(JSON / XML</td><td>"请以 JSON 格式返回,包含 name、age 字段"</td></tr>
<tr><td><strong>Self-Consistency</strong></td><td>多次采样 + 投票,提升推理准确率</td><td>同一问题跑 5 次,取多数答案</td></tr>
</tbody>
</table>
<h3>为什么 CoT 有效</h3>
<ul>
<li>LLM 是自回归的——每个 token 基于前文生成</li>
<li>写出推理过程 = 给模型更多"思考空间",中间步骤的 token 约束了后续输出的方向</li>
<li>复杂推理任务(数学、逻辑)中 CoT 可将准确率从 ~20% 提升到 ~80%</li>
</ul>
<h3>Function Calling 原理</h3>
<ol>
<li>定义函数的 JSON Schema(函数名、参数、描述)</li>
<li>模型判断用户意图 → 返回函数名 + 结构化参数(而非自然语言)</li>
<li>应用层执行函数 → 结果回传模型 → 模型生成最终回复</li>
<li>本质:让模型"学会"输出结构化指令,模型不直接调用函数,而是输出参数由应用层执行</li>
</ol>
<!-- ===== 3. Agent ===== -->
<h2>Agent 智能体</h2>
<h3>核心架构:ReAct 循环</h3>
<pre>用户输入 → Agent CoreLLM
├─ 规划(Plan)
├─ 调用工具(Tool Use)
├─ 观察结果(Observation
├─ 反思调整(Reflection
└─ 循环直到目标达成 → 输出</pre>
<h3>关键设计模式</h3>
<table>
<thead><tr><th>模式</th><th>原理</th><th>适用场景</th></tr></thead>
<tbody>
<tr><td><strong>ReAct</strong></td><td>Reasoning + Acting 交替:思考一步 → 执行一步 → 观察 → 再思考</td><td>需要与外部交互的任务</td></tr>
<tr><td><strong>Plan-and-Execute</strong></td><td>先生成完整计划,再逐步执行</td><td>复杂多步任务</td></tr>
<tr><td><strong>Multi-Agent</strong></td><td>多个 Agent 分工协作,各司其职</td><td>跨领域复杂流程</td></tr>
</tbody>
</table>
<h3>多 Agent 协作</h3>
<ul>
<li><strong>分工原则</strong>:每个 Agent 有明确角色和工具集,互不越界</li>
<li><strong>通信方式</strong>:共享内存/消息队列(Agent A 输出 → Agent B 输入)、中央调度器(Orchestrator 统一分发任务、汇总结果)</li>
<li><strong>冲突仲裁</strong>:定义优先级规则或由调度 Agent 决策</li>
</ul>
<h3>安全护栏(Guardrails</h3>
<ul>
<li><strong>输入护栏</strong>:敏感词过滤、注入攻击检测</li>
<li><strong>输出护栏</strong>:内容合规校验、事实性核查</li>
<li><strong>行为护栏</strong>:限制可调用的工具范围、设置最大循环次数防止死循环</li>
</ul>
<div class="summary-box">
<strong>Agent vs 普通 LLM 调用</strong>:Agent 的核心区别在于拥有自主规划 + 工具调用 + 循环决策能力,不是一次问答,而是多步自主完成任务。
</div>
<!-- ===== 4. Skills ===== -->
<h2>Skills 编排系统</h2>
<h3>设计理念</h3>
<p>将业务能力封装为标准化、可复用的 Skill 模块,由 LLM 根据用户意图自动选择并编排执行。</p>
<h3>架构流程</h3>
<pre>用户输入
意图识别(LLM
Skill 路由(语义匹配最相关的 Skill 组合)
编排执行(串行 / 并行 / 条件分支)
结果聚合 → 输出</pre>
<h3>Skill 定义规范</h3>
<pre>{
"name": "report_generator",
"description": "根据查询条件生成业务报表",
"parameters": {
"report_type": "销售报表 / 库存报表 / 财务报表",
"date_range": "起止日期",
"format": "PDF / Excel"
},
"auth_required": true
}</pre>
<h3>关键机制</h3>
<table>
<thead><tr><th>机制</th><th>说明</th></tr></thead>
<tbody>
<tr><td><strong>热加载</strong></td><td>Skill 注册/下线不重启系统,通过配置中心或数据库动态生效</td></tr>
<tr><td><strong>自动路由</strong></td><td>LLM 用语义匹配(Embedding 相似度)找到最相关的 Skill</td></tr>
<tr><td><strong>依赖解析</strong></td><td>Skill A 的输出可能是 Skill B 的输入,编排引擎自动处理依赖顺序</td></tr>
<tr><td><strong>降级策略</strong></td><td>首选 Skill 不可用时,自动回退到备选方案或转人工</td></tr>
</tbody>
</table>
<div class="summary-box">
<strong>与 Function Calling 的关系</strong>:Skills 编排是更高层的抽象,一个 Skill 可能包含多个 Function Call。类比:Skills 编排 ≈ 微服务 + API 网关 + 服务编排,只是"路由规则"由 LLM 动态决定。
</div>
<!-- ===== 5. RAG ===== -->
<h2>知识库(RAG)系统</h2>
<h3>为什么需要 RAG</h3>
<ul>
<li>LLM 训练数据有截止日期,无法回答最新问题</li>
<li>LLM 可能产生幻觉(编造不存在的事实)</li>
<li>企业私有数据不能用于训练公共模型</li>
<li>RAG = 检索(<strong>R</strong>etrieve+ 增强(<strong>A</strong>ugment+ 生成(<strong>G</strong>enerate</li>
</ul>
<h3>核心流程</h3>
<pre><strong>文档入库(离线)</strong>
原始文档 → 解析 → 分块 → Embedding → 存入向量数据库
<strong>在线问答</strong>
用户提问 → Embedding → 向量检索(Top-K)→ 拼接 Prompt → LLM 生成 → 返回</pre>
<h3>分块策略(Chunking</h3>
<table>
<thead><tr><th>策略</th><th>适用场景</th><th>优缺点</th></tr></thead>
<tbody>
<tr><td><strong>固定长度</strong></td><td>通用场景</td><td>实现简单但可能切断语义</td></tr>
<tr><td><strong>语义分块</strong></td><td>长文档</td><td>按段落/章节切分,语义完整</td></tr>
<tr><td><strong>滑动窗口</strong></td><td>需要上下文</td><td>相邻块有重叠,避免信息断裂</td></tr>
</tbody>
</table>
<h3>Embedding 模型选择</h3>
<ul>
<li>中文:bge-large-zh、text2vec-large-chinese、m3e</li>
<li>多语言:text-embedding-3-largeOpenAI)、bge-m3</li>
<li>Embedding 本质:将文本映射到高维向量空间,语义相近的文本向量距离近</li>
</ul>
<h3>检索优化</h3>
<table>
<thead><tr><th>技术</th><th>说明</th></tr></thead>
<tbody>
<tr><td><strong>混合检索</strong></td><td>语义检索(向量)+ 关键词检索(BM25)加权融合,提升召回率</td></tr>
<tr><td><strong>Rerank</strong></td><td>粗召回后用精排模型重排序,提升 Top-N 精度</td></tr>
<tr><td><strong>元数据过滤</strong></td><td>按时间/分类/权限等结构化字段预过滤,缩小检索范围</td></tr>
</tbody>
</table>
<!-- ===== 6. AI Coding ===== -->
<h2>AI Coding</h2>
<h3>主流工具原理</h3>
<table>
<thead><tr><th>工具</th><th>底层原理</th><th>特点</th></tr></thead>
<tbody>
<tr><td><strong>Claude Code</strong></td><td>Claude 模型 + 工具调用(文件读写/Shell/搜索),Agent 模式自主执行</td><td>复杂任务拆解,长期上下文</td></tr>
<tr><td><strong>GitHub Copilot</strong></td><td>Codex 模型,实时上下文(当前文件+相邻Tab+项目结构)补全</td><td>IDE 深度集成,毫秒级响应</td></tr>
<tr><td><strong>Cursor</strong></td><td>多模型支持,全文件上下文编辑,Composer 模式</td><td>重构友好,Diff 预览</td></tr>
<tr><td><strong>Aider</strong></td><td>CLI 工具,Git 集成,Map-Reduce 处理大代码库</td><td>终端场景,可脚本化</td></tr>
</tbody>
</table>
<h3>三种工作模式</h3>
<ol>
<li><strong>补全模式</strong>:根据光标上下文,实时续写代码(Copilot 类)</li>
<li><strong>对话模式</strong>:自然语言描述需求 → AI 生成/修改代码(Cursor / Claude Code</li>
<li><strong>Agent 模式</strong>:AI 自主规划 → 读写文件 → 执行命令 → 检查结果 → 迭代修复(Claude Code</li>
</ol>
<h3>工程化实践</h3>
<ul>
<li><strong>小步提交</strong>:每次 AI 修改控制在 200 行 diff 以内,便于 Review 和回滚</li>
<li><strong>测试驱动</strong>:先让 AI 写测试,再写实现——"测试是 AI 的 spec"</li>
<li><strong>代码审查</strong>:AI 生成代码必须人工 Review,重点关注边界条件和安全问题</li>
<li><strong>上下文质量</strong>:清晰的上下文(项目结构 + 技术栈 + 编码规范)大幅提升 AI 输出质量</li>
</ul>
<!-- ===== 7. YOLO ===== -->
<h2>AI 视觉(YOLO</h2>
<h3>核心思想</h3>
<ul>
<li><strong>You Only Look Once</strong>:将目标检测转化为回归问题</li>
<li>输入图片 → 单次 CNN 前向传播 → 同时输出边界框 + 类别概率</li>
<li>相比 R-CNN 系列的两阶段方法(先提候选区 → 再分类),YOLO 更快,适合实时场景</li>
</ul>
<h3>演进路线</h3>
<table>
<thead><tr><th>版本</th><th>关键改进</th><th>年份</th></tr></thead>
<tbody>
<tr><td><strong>YOLOv5</strong></td><td>工程化最成熟,社区生态好</td><td>2020</td></tr>
<tr><td><strong>YOLOv8</strong></td><td>无锚框检测,多任务(检测/分割/姿态)统一框架</td><td>2023</td></tr>
<tr><td><strong>YOLOv10</strong></td><td>NMS-Free,端到端,效率进一步提升</td><td>2024</td></tr>
</tbody>
</table>
<h3>训练部署流程</h3>
<pre>数据采集 → 标注(LabelImg / LabelStudio)→ 数据集划分(训练/验证/测试)
→ 数据增强(翻转/旋转/色彩抖动/Mosaic)
→ 模型训练(预训练权重微调)
→ 模型转换(ONNX / TensorRT
→ 边缘/服务端部署</pre>
<h3>网络架构:Backbone + Neck + Head</h3>
<table>
<thead><tr><th>组件</th><th>作用</th><th>YOLOv8 示例</th></tr></thead>
<tbody>
<tr><td><strong>Backbone</strong></td><td>特征提取网络,从原始图像中提取多尺度特征图</td><td>CSPDarknet + C2f 模块(跨阶段局部网络,提升梯度流动)</td></tr>
<tr><td><strong>Neck</strong></td><td>特征融合层,将不同尺度的特征图进行融合,增强多尺度检测能力</td><td>PAN-FPN(路径聚合网络 + 特征金字塔),自顶向下 + 自底向上双向融合</td></tr>
<tr><td><strong>Head</strong></td><td>检测头,输出最终的边界框坐标 + 类别概率 + 置信度</td><td>解耦头(Decoupled Head):分类和回归分支分离,各自优化</td></tr>
</tbody>
</table>
<h3>关键技术原理</h3>
<h4>锚框(Anchor Box</h4>
<ul>
<li>预定义的一组宽高比和尺度的候选框,模型预测的是相对于锚框的偏移量而非绝对坐标</li>
<li>YOLOv5:基于训练集聚类(K-Means)自动生成锚框尺寸</li>
<li>YOLOv8:引入 <strong>Anchor-Free</strong> 机制,直接预测目标中心点和宽高,消除锚框超参数调优</li>
</ul>
<h4>NMS(非极大值抑制)</h4>
<ul>
<li>同一目标可能产生多个重叠的检测框,NMS 用于去除冗余框</li>
<li>流程:按置信度排序 → 选取最高分框 → 计算与其他框的 IoU → 抑制 IoU > 阈值的框 → 重复</li>
<li>YOLOv10:引入 <strong>NMS-Free</strong> 训练,通过一对一标签分配(One-to-One Assignment)在推理时不再需要 NMS 后处理</li>
</ul>
<h4>损失函数</h4>
<table>
<thead><tr><th>损失类型</th><th>说明</th><th>常用函数</th></tr></thead>
<tbody>
<tr><td><strong>分类损失</strong></td><td>衡量类别预测的准确性</td><td>BCE Loss(二元交叉熵)</td></tr>
<tr><td><strong>定位损失</strong></td><td>衡量边界框坐标的准确性</td><td>CIoU Loss(考虑重叠面积 + 中心点距离 + 宽高比)</td></tr>
<tr><td><strong>置信度损失</strong></td><td>衡量"该框包含目标"的置信度</td><td>BCE Loss + Focal Loss(聚焦难分样本)</td></tr>
</tbody>
</table>
<h3>核心评估指标</h3>
<table>
<thead><tr><th>指标</th><th>定义</th><th>意义</th></tr></thead>
<tbody>
<tr><td><strong>IoU</strong></td><td>预测框与真实框的交集 / 并集</td><td>衡量定位精度,> 0.5 通常认为检测正确</td></tr>
<tr><td><strong>mAP</strong></td><td>所有类别 AP 的平均值</td><td>综合衡量检测精度,最常用的整体指标</td></tr>
<tr><td><strong>mAP@0.5</strong></td><td>IoU 阈值 = 0.5 时的 mAP</td><td>宽松标准,反映"找得到"的能力</td></tr>
<tr><td><strong>mAP@0.5:0.95</strong></td><td>IoU 从 0.5 到 0.95(步长 0.05)取平均</td><td>严格标准,反映"定位准"的能力(COCO 数据集主要指标)</td></tr>
<tr><td><strong>FPS</strong></td><td>每秒处理帧数</td><td>衡量推理速度,实时场景通常需要 ≥ 25 FPS</td></tr>
</tbody>
</table>
<h3>模型优化与加速</h3>
<table>
<thead><tr><th>技术</th><th>原理</th><th>效果</th></tr></thead>
<tbody>
<tr><td><strong>模型量化(INT8</strong></td><td>将 FP32 权重和激活值映射到 INT8,降低计算精度换取速度</td><td>推理速度 2-4x 提升,精度损失 < 1%</td></tr>
<tr><td><strong>模型剪枝</strong></td><td>移除不重要的通道/层,减少参数量和计算量</td><td>模型体积缩减 30-50%,速度提升</td></tr>
<tr><td><strong>TensorRT 加速</strong></td><td>NVIDIA 推理优化引擎:层融合、显存优化、内核自动调优</td><td>推理速度 3-5x 提升,适合 GPU 部署</td></tr>
<tr><td><strong>ONNX 导出</strong></td><td>将 PyTorch 模型导出为 ONNX 通用格式,跨框架/跨硬件部署</td><td>一次导出,多端部署(GPU / CPU / Edge TPU</td></tr>
<tr><td><strong>OpenVINO</strong></td><td>Intel 推理引擎,针对 CPU / VPU / FPGA 优化</td><td>x86 平台 CPU 推理加速,无需 GPU</td></tr>
</tbody>
</table>
<h3>主流检测模型对比</h3>
<table>
<thead><tr><th>模型</th><th>类型</th><th>精度 (mAP)</th><th>速度</th><th>适用场景</th></tr></thead>
<tbody>
<tr><td><strong>YOLOv8</strong></td><td>单阶段 Anchor-Free</td><td></td><td></td><td>实时检测、边缘部署</td></tr>
<tr><td><strong>YOLOv10</strong></td><td>单阶段 NMS-Free</td><td>更高</td><td>更快</td><td>端到端实时检测</td></tr>
<tr><td><strong>Faster R-CNN</strong></td><td>两阶段</td><td>最高</td><td></td><td>高精度离线分析</td></tr>
<tr><td><strong>SSD</strong></td><td>单阶段</td><td>中等</td><td></td><td>轻量级移动端</td></tr>
<tr><td><strong>RT-DETR</strong></td><td>基于 Transformer</td><td></td><td>较快</td><td>端到端 + 全局上下文建模</td></tr>
</tbody>
</table>
<h3>视频流推理 Pipeline(工程实践)</h3>
<pre>
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ RTSP │───→│ 解码 │───→│ 抽帧 │───→│ YOLO │───→│ 告警 │
│ 取流 │ │ FFmpeg │ │ (1-N fps)│ │ 推理 │ │ 推送 │
└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘
┌──────────┐
│ 目标跟踪 │
│ DeepSORT │
└──────────┘
</pre>
<ul>
<li><strong>取流</strong>FFmpeg / GStreamer 拉取 RTSP 视频流,支持 H.264/H.265 硬解码</li>
<li><strong>抽帧</strong>:按业务需求设置帧率(实时监控 5-10 fps,高精度场景 25 fps),跳帧策略节省算力</li>
<li><strong>推理</strong>:预处理(Resize + Normalize)→ GPU 推理 → 后处理(NMS / 坐标映射)</li>
<li><strong>目标跟踪</strong>:DeepSORT(卡尔曼滤波 + 匈牙利匹配 + ReID 特征),跨帧关联同一目标,实现轨迹追踪与计数</li>
<li><strong>告警推送</strong>:检测到目标 → 截图存证 → 通过 MQTT / WebSocket / 钉钉机器人实时推送告警</li>
</ul>
<h3>常见应用场景与模型选型</h3>
<table>
<thead><tr><th>场景</th><th>检测目标</th><th>推荐模型</th><th>部署方式</th></tr></thead>
<tbody>
<tr><td><strong>安全生产</strong></td><td>安全帽、反光衣、烟火、区域入侵</td><td>YOLOv8s</td><td>边缘盒子(Jetson Orin</td></tr>
<tr><td><strong>智慧交通</strong></td><td>车牌、车型、车流统计、违停</td><td>YOLOv8m + LPRNet</td><td>边缘服务器(T4 GPU</td></tr>
<tr><td><strong>农业物联网</strong></td><td>病虫害识别、果实计数、生长阶段</td><td>YOLOv8n</td><td>边缘网关 / 云端 GPU</td></tr>
<tr><td><strong>工业质检</strong></td><td>产品缺陷、尺寸偏差、装配完整性</td><td>YOLOv8x</td><td>工业相机 + GPU 工控机</td></tr>
<tr><td><strong>安防监控</strong></td><td>人脸、人体、异常行为、物品遗留</td><td>YOLOv8l</td><td>NVR + 算力卡 / 中心服务器</td></tr>
</tbody>
</table>
<h3>实施场景注意事项(实战经验)</h3>
<div class="summary-box">
以下基于实际项目踩坑经验总结——涉及 GB/T 28181 国标平台、海康/大华 SDK、开源方案(FastBee / WVP-GB28181 / FFmpeg + YOLO)在真实场景中的落地要点。
</div>
<h4>摄像头接入与取流</h4>
<table>
<thead><tr><th>问题</th><th>常见坑</th><th>对策</th></tr></thead>
<tbody>
<tr><td><strong>协议兼容</strong></td><td>不同品牌摄像头支持的协议不同——海康优先 ISUP / EHOME,大华有私有 SDK,ONVIF 各厂商实现程度不一</td><td>优先对接 GB/T 28181 国标(强制标准),兜底 RTSP;海康/大华单独适配 SDK 以获得完整 PTZ 控制和报警回调</td></tr>
<tr><td><strong>RTSP 稳定性</strong></td><td>RTSP 基于 UDP,网络抖动导致花屏、断流;长时间运行 TCP 会话可能被防火墙断开</td><td>使用 TCP 传输模式(<code>?tcp</code> 参数);增加断线重连 + 指数退避策略;FFmpeg 设置 <code>-rtsp_transport tcp -stimeout 5000000</code></td></tr>
<tr><td><strong>多路并发</strong></td><td>直接拉 50+ 路 RTSP 流导致带宽和连接数爆炸,单台服务器网卡成为瓶颈</td><td>分级架构:边缘网关(NVR / 工控机)本地拉流 + 推理,只上传告警事件到中心;或使用流媒体服务(ZLM / SRS)统一收流转发</td></tr>
<tr><td><strong>视频编码</strong></td><td>H.265 摄像头越来越普及,但部分开源推理框架对 H.265 硬解支持不佳</td><td>确认 GPU 硬解能力(NVIDIA NVDEC / Intel QSV);必要时在接入层统一转码为 H.264;优先选 H.264 流的摄像头子码流做推理</td></tr>
</tbody>
</table>
<h4>推理性能与资源规划</h4>
<table>
<thead><tr><th>问题</th><th>常见坑</th><th>对策</th></tr></thead>
<tbody>
<tr><td><strong>GPU 资源估算</strong></td><td>低估了多路视频并发推理的显存和算力需求,上线后发现 GPU 跑不满或 OOM</td><td>单路 YOLOv8s 约占用 1.5-2GB 显存;一张 T4(16GB)实际可跑 8-12 路(需留显存给解码 + 前后处理);做好压测再承诺路数</td></tr>
<tr><td><strong>抽帧策略</strong></td><td>全部 25fps 逐帧推理,GPU 资源浪费且告警风暴(同一个目标连续告警几十次)</td><td>按场景定抽帧率:周界入侵 5fps、烟火检测 2fps、车牌识别 10fps;配合跳帧 + 告警去重(同一目标同一区域 N 秒内只告警一次)</td></tr>
<tr><td><strong>子码流推理</strong></td><td>用主码流(1080P/4K)做推理,分辨率远超模型输入尺寸(640×640),浪费解码 + 预处理算力</td><td>摄像头开启子码流(704×576 或 640×480),专门用于 AI 推理;主码流仅用于录像存储和人工调阅</td></tr>
<tr><td><strong>批处理 vs 实时</strong></td><td>为提升吞吐量攒批次推理,但引入几百毫秒延迟,告警不及时</td><td>安防场景优先低延迟:单帧推理、不攒批;离线分析(如事后检索)可以用大 batch 提升吞吐</td></tr>
<tr><td><strong>模型选型误区</strong></td><td>追求大模型高精度(YOLOv8x),忽略边缘设备算力限制</td><td>边缘设备用 YOLOv8n/s + TensorRT INT8 量化;中心服务器可用大模型做二次复核(小模型初筛 → 大模型确认)</td></tr>
</tbody>
</table>
<h4>告警策略与误报控制</h4>
<table>
<thead><tr><th>问题</th><th>常见坑</th><th>对策</th></tr></thead>
<tbody>
<tr><td><strong>误报泛滥</strong></td><td>检测灵敏度设太高或未做区域过滤,一天几百条误报告警,客户直接关系统</td><td>多级过滤:置信度阈值(≥0.6)+ 检测区域 ROI 绘制(排除马路/绿化带等干扰区)+ 时间策略(工作时间告警、非工作时间静默)</td></tr>
<tr><td><strong>告警风暴</strong></td><td>同一事件持续触发(如一个烟头在画面中 5 分钟,告警 300 次)</td><td>告警去重窗口:同一摄像头 + 同一目标类别 + N 秒内合并为一条;告警升级机制:持续超过 M 分钟升级为严重告警</td></tr>
<tr><td><strong>目标跟踪丢失</strong></td><td>DeepSORT 在遮挡、光照变化、密集场景下 ID Switch 严重,导致计数不准</td><td>结合 ROI 区域限定跟踪范围;遮挡后给 ReID 特征匹配设置合理的超时时间(如 30 帧);密集场景考虑 ByteTrack(低分框也做匹配,抗遮挡更好)</td></tr>
<tr><td><strong>昼夜差异</strong></td><td>白天训练模型用在夜间红外画面,检测率断崖下降</td><td>训练集必须包含红外/微光场景样本(至少 20%);或分时段加载不同模型(白天模型 + 夜间模型)</td></tr>
<tr><td><strong>天气影响</strong></td><td>雨雪雾天气导致画面模糊,检测失效</td><td>数据增强时加入高斯模糊、亮度抖动、模拟雨雪噪声;极端天气自动切换为移动侦测兜底方案</td></tr>
</tbody>
</table>
<h4>存储与回溯</h4>
<table>
<thead><tr><th>问题</th><th>常见坑</th><th>对策</th></tr></thead>
<tbody>
<tr><td><strong>告警截图丢失</strong></td><td>只存告警记录不存截图/短视频,事后追查无依据</td><td>告警触发时同时保存:告警时刻前后各 3 秒的短视频片段 + 关键帧截图 + 检测框标注图;存储策略:热数据 SSD(7 天)、冷数据 NAS/对象存储(90 天)</td></tr>
<tr><td><strong>录像回溯</strong></td><td>告警记录和录像时间戳不对齐,事后查证时找不到对应录像片段</td><td>告警记录强制记录 NTP 时间戳(精确到毫秒)+ 摄像头编号 + 帧序号;对接 NVR 录像回放 API 实现一键跳转到告警时刻回放</td></tr>
<tr><td><strong>存储成本</strong></td><td>全量录像 7×24 存储,100 路 1080P 一个月几十 TB</td><td>常态录像:低码率 + 移动侦测录像(只录有动静的);告警录像:高清 + 完整片段;定期清理策略自动化</td></tr>
</tbody>
</table>
<h4>系统可靠性与运维</h4>
<table>
<thead><tr><th>问题</th><th>常见坑</th><th>对策</th></tr></thead>
<tbody>
<tr><td><strong>单点故障</strong></td><td>AI 推理服务挂了,所有摄像头告警全部中断,且没有感知</td><td>服务健康检查 + 自动重启(systemd / k8s 探针);关键通道双机热备;监控告警通道本身的心跳(超过 1 分钟无数据触发运维告警)</td></tr>
<tr><td><strong>GPU 掉卡</strong></td><td>GPU 长时间运行温度过高掉卡或驱动崩溃,进程无感知卡死</td><td>定时检测 GPU 可用性(nvidia-smi + CUDA 可用性探针);异常时自动重启推理服务;边缘设备注意散热和防尘</td></tr>
<tr><td><strong>模型更新</strong></td><td>模型迭代后直接全量替换,新模型在某个点位效果变差,缺乏回滚能力</td><td>灰度发布:先在 10% 通道上验证新模型,对比告警准确率;保留上一版本模型,支持一键回滚;记录模型版本 + 通道的告警效果基线</td></tr>
<tr><td><strong>时钟同步</strong></td><td>服务器、摄像头、NVR 时钟不同步,告警时序混乱,多路联动失败</td><td>全系统强制 NTP 对时;摄像头每天自动校时;告警时间以服务器收到帧的时间戳为准(而非摄像头 OSD 时间)</td></tr>
<tr><td><strong>日志与审计</strong></td><td>出了事故查不到为什么没告警——是模型没检测到?还是告警规则过滤了?还是推送通道断了?</td><td>全链路埋点:取流状态 → 抽帧计数 → 推理耗时 → 检测结果 → 过滤规则命中 → 告警推送状态,每个环节都可追溯</td></tr>
</tbody>
</table>
<h4>国标 GB/T 28181 对接注意事项</h4>
<ul>
<li><strong>SIP 信令</strong>:国标基于 SIP 协议,摄像头/NVR 作为 SIP UA 注册到平台。注意 SIP 超时设置(默认 3600 秒),需定期发送心跳保持在线</li>
<li><strong>目录推送</strong>:平台通过 Catalog 订阅获取设备列表。设备增删改后需触发目录同步,否则平台看不到新设备</li>
<li><strong>流媒体分发</strong>:AI 推理不要直接从摄像头拉流(摄像头并发拉流能力有限,通常 3-5 路),应通过国标平台的流媒体服务(ZLM / SRS)统一分发</li>
<li><strong>PTZ 控制</strong>:球机预置位巡航 + AI 检测联动——检测到目标后自动调用预置位、变焦放大做二次确认</li>
<li><strong>报警订阅</strong>:国标支持摄像头自带报警(移动侦测/IO 输入)的 SIP 订阅推送,可结合 AI 告警做交叉验证</li>
</ul>
<!-- ===== Summary ===== -->
<h2>技术全景总结</h2>
<table>
<thead><tr><th>方向</th><th>核心原理</th></tr></thead>
<tbody>
<tr><td><strong>LLM</strong></td><td>Transformer + 三阶段训练,Self-Attention 是核心</td></tr>
<tr><td><strong>Prompt</strong></td><td>通过输入设计引导模型行为,CoT 通过中间推理 token 约束输出路径</td></tr>
<tr><td><strong>Agent</strong></td><td>LLM + 规划 + 工具调用 + 循环决策 = 自主完成任务</td></tr>
<tr><td><strong>Skills 编排</strong></td><td>业务能力模块化,LLM 语义匹配 + 动态路由,自动编排执行</td></tr>
<tr><td><strong>RAG</strong></td><td>检索外部知识增强 LLM,离线入库 + 在线问答双 Pipeline,解决幻觉与知识时效</td></tr>
<tr><td><strong>AI Coding</strong></td><td>AI 辅助代码生成/审查/测试,Agent 模式实现自主开发闭环</td></tr>
<tr><td><strong>YOLO</strong></td><td>单阶段目标检测,Backbone+Neck+Head 架构,一次前向传播同时输出检测框与类别,适合实时视频流推理</td></tr>
</tbody>
</table>
</div>
</body>
</html>
+268
View File
@@ -0,0 +1,268 @@
# AI 核心技能原理说明
> 面试快速回顾用,每条控制在 2-3 分钟可讲完。
---
## 1. 大语言模型(LLM)基础
### 核心原理
- **Transformer 架构**:所有现代 LLM 的基础。核心是 Self-Attention 机制——每个 token 计算与序列中所有其他 token 的相关性权重,并行处理,突破 RNN 的串行瓶颈。
- **训练三阶段**
1. **Pre-training**(预训练):海量语料上做 Next Token Prediction,学习语言的统计规律和世界知识
2. **SFT**(监督微调):用高质量指令-回答对训练,让模型学会"对话"
3. **RLHF**(人类反馈强化学习):用人类偏好数据训练奖励模型,再用 PPO 优化,对齐人类价值观
### 关键概念
| 概念 | 说明 |
|------|------|
| **Token** | 模型处理的最小文本单元,中文约 1.5-2 字符/token |
| **Context Window** | 模型一次能处理的 token 上限(如 128K、200K |
| **Temperature** | 控制输出随机性,0=确定性,1=高随机 |
| **Top-P / Top-K** | 采样策略,限制候选 token 范围 |
### 主流模型对比
| 模型 | 特点 | 适用场景 |
|------|------|----------|
| GPT-4o | 多模态,综合最强 | 复杂推理、多模态任务 |
| Claude 4 | 长上下文 200K,安全性高 | 长文档分析、代码生成 |
| DeepSeek-V3 | 开源,性价比高,MoE 架构 | 国内部署、成本敏感场景 |
| 通义千问 | 中文优化,阿里云生态 | 政务、企业中文场景 |
### 面试要点
- 说清楚 Transformer 的 Self-Attention 解决了什么问题(长距离依赖、并行化)
- 能解释为什么需要 RLHF(对齐问题——模型能力强但不一定听话)
- 知道怎么选模型:看场景(精度/成本/延迟)、看上下文长度、看部署方式
---
## 2. Prompt Engineering
### 核心方法论
| 技术 | 原理 | 示例 |
|------|------|------|
| **Zero-shot** | 不给示例,直接提问 | "将以下文本分类为正面/负面:..." |
| **Few-shot** | 给 2-5 个示例,模型学会模式 | 示例1 → 示例2 → 新输入 |
| **CoT**(思维链) | 要求模型"一步步思考",激活推理能力 | "让我们一步步分析:首先...其次..." |
| **结构化输出** | 约束输出格式(JSON/XML| "请以 JSON 格式返回,包含 name、age 字段" |
| **Self-Consistency** | 多次采样 + 投票,提升推理准确率 | 同一问题跑 5 次,取多数答案 |
### 为什么 CoT 有效
- LLM 是自回归的——每个 token 基于前文生成
- 写出推理过程 = 给模型更多"思考空间",中间步骤的 token 约束了后续输出的方向
- 复杂推理任务(数学、逻辑)中 CoT 可将准确率从 ~20% 提升到 ~80%
### Function Calling 原理
1. 定义函数的 JSON Schema(函数名、参数、描述)
2. 模型判断用户意图 → 返回函数名 + 结构化参数(而非自然语言)
3. 应用层执行函数 → 结果回传模型 → 模型生成最终回复
4. 本质:让模型"学会"输出结构化指令,而非直接回答
### 面试要点
- 能解释 CoT 的原理(通过中间 token 约束推理路径)
- 能说清楚 Function Calling 的流程(不是模型调用函数,是模型输出参数,应用层执行)
- 准备一个实际案例(如:好差评系统中用 Few-shot + CoT 做评价分类)
---
## 3. Agent 智能体
### 核心架构
```
用户输入 → Agent CoreLLM)→ 规划(Plan
→ 调用工具(Tool Use
→ 观察结果(Observation
→ 反思调整(Reflection
→ 循环直到目标达成 → 输出
```
### 关键设计模式
| 模式 | 原理 | 适用场景 |
|------|------|----------|
| **ReAct** | Reasoning + Acting 交替:思考一步 → 执行一步 → 观察 → 再思考 | 需要与外部交互的任务 |
| **Plan-and-Execute** | 先生成完整计划,再逐步执行 | 复杂多步任务 |
| **Multi-Agent** | 多个 Agent 分工协作,各司其职 | 跨领域复杂流程 |
### 多 Agent 协作
- **分工原则**:每个 Agent 有明确角色和工具集,互不越界
- **通信方式**
- 共享内存/消息队列:Agent A 输出 → Agent B 输入
- 中央调度器:Orchestrator 统一分发任务、汇总结果
- **冲突仲裁**:定义优先级规则或由调度 Agent 决策
### 安全护栏(Guardrails
- **输入护栏**:敏感词过滤、注入攻击检测
- **输出护栏**:内容合规校验、事实性核查
- **行为护栏**:限制可调用的工具范围、设置最大循环次数防止死循环
### 面试要点
- 说清楚 Agent 和普通 LLM 调用的区别(Agent 有自主规划 + 工具调用 + 循环决策能力)
- 能画出 Agent 的 ReAct 循环图
- 准备一个落地案例(如:民政 AI 客服中,Agent 判断用户意图 → 调用知识库检索 → 查办事进度 API → 生成回答)
---
## 4. Skills 编排系统
### 设计理念
将业务能力封装为标准化、可复用的 Skill 模块,由 LLM 根据用户意图自动选择并编排执行。
### 架构
```
用户输入
意图识别(LLM
Skill 路由(匹配最相关的 Skill 组合)
编排执行(串行/并行/条件分支)
结果聚合 → 输出
```
### Skill 定义规范
```json
{
"name": "report_generator",
"description": "根据查询条件生成业务报表",
"parameters": {
"report_type": "销售报表 / 库存报表 / 财务报表",
"date_range": "起止日期",
"format": "PDF / Excel"
},
"auth_required": true
}
```
### 关键机制
| 机制 | 说明 |
|------|------|
| **热加载** | Skill 注册/下线不重启系统,通过配置中心或数据库动态生效 |
| **自动路由** | LLM 用语义匹配(Embedding 相似度)找到最相关的 Skill |
| **依赖解析** | Skill A 的输出可能是 Skill B 的输入,编排引擎自动处理依赖顺序 |
| **降级策略** | 首选 Skill 不可用时,自动回退到备选方案或转人工 |
### 面试要点
- 类比:Skills 编排 ≈ 微服务 + API 网关 + 服务编排,只是"路由规则"由 LLM 动态决定
- 能说清楚和 Function Calling 的关系:Skills 编排是更高层的抽象,一个 Skill 可能包含多个 Function Call
- 准备一个例子:用户说"帮我生成上月销售报表并推送到钉钉"→ 路由到 `report_generator` + `dingtalk_notifier` 两个 Skill
---
## 5. 知识库(RAG)系统
### 为什么需要 RAG
- LLM 训练数据有截止日期,无法回答最新问题
- LLM 可能产生幻觉(编造不存在的事实)
- 企业私有数据不能用于训练公共模型
- RAG = **检索(Retrieve+ 增强(Augment+ 生成(Generate**
### 核心流程
```
文档入库(离线):
原始文档 → 解析 → 分块 → Embedding → 存入向量数据库
在线问答:
用户提问 → Embedding → 向量检索(Top-K)→ 拼接 Prompt → LLM 生成 → 返回
```
### 关键技术细节
**分块策略(Chunking**
| 策略 | 适用 | 优缺点 |
|------|------|--------|
| 固定长度 | 通用场景 | 简单但可能切断语义 |
| 语义分块 | 长文档 | 按段落/章节切分,语义完整 |
| 滑动窗口 | 需要上下文 | 相邻块有重叠,避免信息断裂 |
**Embedding 模型选择**
- 中文:bge-large-zh、text2vec-large-chinese、m3e
- 多语言:text-embedding-3-largeOpenAI)、bge-m3
**检索优化**
| 技术 | 说明 |
|------|------|
| 混合检索 | 语义检索(向量)+ 关键词检索(BM25)加权融合 |
| Rerank | 粗召回后用精排模型重排序,提升 Top-N 精度 |
| 元数据过滤 | 按时间/分类/权限等结构化字段预过滤 |
### 面试要点
- 画出 RAG 的架构流程图(离线入库 + 在线问答两条线)
- 能解释 Embedding 的本质(将文本映射到高维向量空间,语义相近的文本向量距离近)
- 准备一个踩坑经验:分块大小怎么定?检索不准怎么优化?
---
## 6. AI Coding
### 主流工具原理
| 工具 | 底层原理 | 特点 |
|------|----------|------|
| **Claude Code** | Claude 模型 + 工具调用(文件读写/Shell/搜索),Agent 模式自主执行 | 复杂任务拆解,长期上下文 |
| **GitHub Copilot** | Codex 模型,实时上下文(当前文件+相邻Tab+项目结构)补全 | IDE 深度集成,毫秒级响应 |
| **Cursor** | 多模型支持,全文件上下文编辑,Composer 模式 | 重构友好,Diff 预览 |
| **Aider** | CLI 工具,Git 集成,Map-Reduce 处理大代码库 | 终端场景,可脚本化 |
### AI Coding 的工作模式
1. **补全模式**:根据光标上下文,实时续写代码(Copilot 类)
2. **对话模式**:自然语言描述需求 → AI 生成/修改代码(Cursor/Claude Code
3. **Agent 模式**:AI 自主规划 → 读写文件 → 执行命令 → 检查结果 → 迭代修复(Claude Code
### 工程化实践
- **小步提交**:每次 AI 修改控制在 200 行 diff 以内,便于 Review 和回滚
- **测试驱动**:先让 AI 写测试,再让 AI 写实现,"测试是 AI 的 spec"
- **代码审查**:AI 生成代码必须人工 Review,关注边界条件和安全问题
- **Prompt 工程**:清晰的上下文(项目结构 + 技术栈 + 编码规范)大幅提升 AI 输出质量
### 面试要点
- 能对比主要工具(Copilot vs Cursor vs Claude Code)的差异和选型理由
- 能用实际案例说明效率提升(如:原本 3 天的 CRUD 模块,AI 辅助 4 小时完成)
- 对 AI 代码的局限性有清醒认识(复杂业务逻辑、安全敏感代码需人工把关)
---
## 7. AI 视觉(YOLO
### YOLO 核心思想
- **You Only Look Once**:将目标检测转化为回归问题
- 输入图片 → 单次 CNN 前向传播 → 同时输出边界框 + 类别概率
- 相比 R-CNN 系列的两阶段方法(先提候选区 → 再分类),YOLO 更快,适合实时场景
### 演进路线
| 版本 | 关键改进 | 年份 |
|------|----------|------|
| YOLOv5 | 工程化最成熟,社区生态好 | 2020 |
| YOLOv8 | 无锚框检测,多任务(检测/分割/姿态)统一框架 | 2023 |
| YOLOv10 | NMS-Free,端到端,效率进一步提升 | 2024 |
### 训练部署流程
```
数据采集 → 标注(LabelImg/LabelStudio)→ 数据集划分(训练/验证/测试)
→ 数据增强(翻转/旋转/色彩抖动/Mosaic)
→ 模型训练(预训练权重微调)
→ 模型转换(ONNX/TensorRT
→ 边缘/服务端部署
```
### 面试要点
- 能解释 YOLO 为什么快(单阶段,一次前向传播出所有结果)
- 能说清楚 mAP@0.5 是什么(IoU 阈值 0.5 时的平均精度)
- 准备一个实际场景(如:安全帽检测的完整 Pipeline——RTSP 取流 → 抽帧 → YOLO 推理 → 告警推送)
---
## 面试速查:一句话总结每个方向
| 方向 | 一句话 |
|------|--------|
| LLM | Transformer + 三阶段训练,Self-Attention 是核心 |
| Prompt | 通过输入设计引导模型行为,CoT 通过中间推理提升准确率 |
| Agent | LLM + 规划 + 工具调用 + 循环决策 = 自主完成任务 |
| Skills 编排 | 业务能力模块化,LLM 动态路由,自动编排执行 |
| RAG | 检索外部知识增强 LLM,解决幻觉和知识截止问题 |
| AI Coding | AI 辅助代码生成/审查/测试,Agent 模式实现自主开发 |
| YOLO | 单阶段目标检测,一次前向传播出检测框+类别,实时性好 |
@@ -355,6 +355,7 @@
<body>
<header class="header">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>Claude Code 工程师使用指南</h1>
<span class="version">v2.1 · 2026-04-29</span>
</header>
@@ -450,6 +450,7 @@ a { color: var(--color-primary); }
<!-- Header -->
<header class="header">
<a href="../index.html" class="back-link" style="color:var(--color-primary);text-decoration:none;font-size:12px;margin-right:16px;">← 返回知识库</a>
<h1>Graphify-rs 深度分析报告</h1>
<div class="badges">
<span class="badge hot">22K+ Stars</span>
@@ -350,6 +350,7 @@
<body>
<header class="header">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>MySQL 转 PostgreSQL 迁移工具对比</h1>
</header>
@@ -57,6 +57,7 @@
</style>
</head>
<body>
<a href="../index.html" style="position:fixed;top:12px;left:16px;z-index:1000;color:#fff;text-decoration:none;font-size:13px;background:rgba(0,0,0,0.5);padding:6px 14px;border-radius:4px;">← 返回知识库</a>
<div class="reveal">
<div class="slides">
@@ -323,6 +323,7 @@
<!-- Hero -->
<header class="hero">
<a href="../index.html" style="display:inline-block;margin-bottom:12px;color:var(--color-primary);text-decoration:none;font-size:13px;">← 返回知识库</a>
<h1>YqBoot 企业级敏捷开发平台</h1>
<p class="subtitle">一套平台 · 多种场景 · 快速交付 · 安全可控</p>
<p class="meta">
+1
View File
@@ -500,6 +500,7 @@ code {
<!-- ===== Header ===== -->
<header class="header">
<div class="header-inner">
<a href="./index.html" class="back-link" style="color:var(--text-secondary);text-decoration:none;font-size:12px;margin-right:16px;">← 返回知识库</a>
<div class="header-title">CRMEB-MER 项目图谱报告</div>
<div class="header-meta">graphify-rs · 2026-05-06 · JAVA-MER-2.2</div>
</div>
@@ -254,6 +254,7 @@ tr:hover td { background: var(--bg-tertiary); }
<body>
<header class="header">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>graphify-rs 使用手册</h1>
<span class="version">v1.x</span>
</header>
+1
View File
@@ -400,6 +400,7 @@ li { margin: 4px 0; color: var(--text-secondary); font-size: 0.92rem; }
<body>
<header class="header">
<a href="../index.html" class="back-link" style="color:var(--color-primary);text-decoration:none;font-size:12px;margin-right:16px;">← 返回知识库</a>
<h1>MCP 服务大全 — 开发者指南</h1>
<span class="version">2026-04 · 20+ 服务</span>
</header>
+1
View File
@@ -119,6 +119,7 @@ body{
<!-- HEADER -->
<header class="header-bar">
<div class="header-bar-inner">
<a href="./index.html" class="back-link" style="color:var(--text-secondary);text-decoration:none;font-size:12px;margin-right:12px;white-space:nowrap;">← 返回知识库</a>
<button class="menu-btn" id="menuBtn" aria-label="菜单">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>
</button>
@@ -359,6 +359,7 @@
<div class="container">
<!-- Header -->
<a href="../../index.html" class="back-link" style="display:inline-block;margin-bottom:12px;color:var(--accent);text-decoration:none;font-size:13px;">← 返回知识库</a>
<div class="report-header">
<h1>中医馆内部管理系统 — 需求分析对比报告</h1>
<div class="subtitle">基于现有需求文档,逐模块进行完整性、合理性和风险分析,每项建议注明理由</div>
@@ -236,6 +236,7 @@ body {
<!-- Header -->
<div class="header">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>中医馆内部管理系统</h1>
<div class="sub">需求分析对比报告 &middot; 2026/05/23</div>
</div>
@@ -36,6 +36,7 @@ canvas:active { cursor: grabbing; }
</style>
</head>
<body>
<a href="../index.html" style="display:inline-block;margin:12px 16px 4px;color:#1677FF;text-decoration:none;font-size:13px;">← 返回知识库</a>
<h2>正四面体旋转动画</h2>
<p class="subtitle">鼠标拖拽旋转 · 铰链展开</p>
<canvas id="canvas" width="500" height="500"></canvas>
@@ -407,6 +407,7 @@
<!-- Header -->
<header class="header">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>代码结构分析工具对比分析</h1>
</header>
@@ -228,6 +228,7 @@ code {
<div class="header-bar">
<div class="brand">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>身份认证中心</h1>
<span class="tagline">技术解析与开源项目匹配度分析报告</span>
</div>
@@ -210,6 +210,7 @@ code {
<div class="header-bar">
<div class="brand">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>开源 IAM 项目选型报告</h1>
<span class="tagline">身份认证中心匹配度分析</span>
</div>
@@ -204,6 +204,7 @@ code {
<div class="header-bar">
<div class="brand">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>全域智能认证与门户平台</h1>
<span class="tagline">需求分析报告</span>
</div>
@@ -169,6 +169,7 @@ pre {
<header class="header-bar">
<div class="brand">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>分销商城推广模式全景调研报告</h1>
<span class="tagline">四大类 20+ 种模式 · 微三云特色模式 · 价格体系 · 合规框架 · 收益分析</span>
</div>
@@ -259,6 +259,7 @@ code {
<header class="header-bar">
<div class="brand">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>在线下单配送抢单小程序调研报告</h1>
<span class="tagline">Top 5 开源项目横向对比分析</span>
</div>
Binary file not shown.
+301 -588
View File
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,411 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI转型:观点独白 + 口播稿 | 软件行业正在发生的变化</title>
<style>
:root {
--color-primary: #1677FF; --color-primary-hover: #4096FF; --color-primary-active: #0958D9; --color-primary-bg: #E6F4FF;
--color-success: #52C41A; --color-success-bg: #F6FFED; --color-success-border: #B7EB8F;
--color-warning: #FAAD14; --color-warning-bg: #FFFBE6; --color-warning-border: #FFE58F;
--color-error: #FF4D4F; --color-error-bg: #FFF2F0; --color-error-border: #FFCCC7;
--bg: #F5F5F5; --bg-container: #FFFFFF; --bg-elevated: #FAFAFA;
--border: #D9D9D9; --border-light: #F0F0F0;
--text-primary: #141414; --text-secondary: #595959; --text-tertiary: #8C8C8C;
--radius-sm: 6px; --radius-md: 8px; --radius-lg: 12px;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.03), 0 1px 6px -1px rgba(0,0,0,0.02);
--shadow-md: 0 2px 4px rgba(0,0,0,0.04), 0 4px 12px -2px rgba(0,0,0,0.04);
--shadow-lg: 0 4px 8px rgba(0,0,0,0.06), 0 8px 24px -4px rgba(0,0,0,0.08);
}
*{margin:0;padding:0;box-sizing:border-box;}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;background:var(--bg);color:var(--text-primary);line-height:1.57;font-size:14px;}
::-webkit-scrollbar{width:6px;height:6px;}
::-webkit-scrollbar-track{background:transparent;}
::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px;}
.header{position:fixed;top:0;left:0;right:0;height:64px;background:rgba(255,255,255,0.88);backdrop-filter:blur(12px);border-bottom:1px solid var(--border-light);display:flex;align-items:center;padding:0 2rem;z-index:100;}
.header h1{font-size:18px;font-weight:700;background:linear-gradient(135deg,var(--color-primary),#722ED1);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;}
.header .back-link{margin-right:16px;font-size:13px;color:var(--color-primary);text-decoration:none;flex-shrink:0;}
.header .back-link:hover{text-decoration:underline;}
.main{max-width:900px;margin:0 auto;padding:96px 32px 64px;}
section{margin:48px 0;scroll-margin-top:80px;}
section h2{font-size:24px;line-height:32px;padding-bottom:8px;border-bottom:1px solid var(--border);margin-bottom:20px;color:var(--color-primary);}
section h3{font-size:20px;line-height:28px;margin:24px 0 12px;color:#722ED1;}
p{color:var(--text-secondary);font-size:14px;margin:10px 0;text-align:justify;}
strong{color:var(--text-primary);}
/* ===== 演讲稿样式 ===== */
.speech-meta{display:flex;flex-wrap:wrap;gap:12px;margin:16px 0 24px;}
.speech-meta .meta-tag{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:20px;font-size:12px;font-weight:600;}
.meta-tag.duration{background:var(--color-primary-bg);color:var(--color-primary);border:1px solid #91CAFF;}
.meta-tag.audience{background:#F9F0FF;color:#722ED1;border:1px solid #D3ADF7;}
.meta-tag.occasion{background:var(--color-success-bg);color:var(--color-success);border:1px solid var(--color-success-border);}
.script-block{margin:16px 0;padding:16px 20px;background:var(--bg-container);border-radius:var(--radius-md);border-left:4px solid var(--color-primary);box-shadow:var(--shadow-sm);}
.script-block.stage-direction{background:var(--bg-elevated);border-left-color:var(--border);font-style:italic;color:var(--text-tertiary);}
.script-block.hook{border-left-color:var(--color-error);background:var(--color-error-bg);}
.script-block.closing{border-left-color:#722ED1;background:#F9F0FF;}
.script-block .block-label{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;margin-bottom:8px;color:var(--text-tertiary);}
.script-block .line{display:block;margin:6px 0;color:var(--text-primary);font-size:15px;line-height:1.8;}
.script-block .line.em{font-weight:700;font-size:16px;color:var(--text-primary);}
.script-block .line.sub{color:var(--text-tertiary);font-size:13px;}
.script-block .pause{display:inline-block;margin:0 4px;color:var(--text-tertiary);font-size:12px;}
/* ===== 口播稿样式 ===== */
.oral-meta{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0 24px;}
.oral-script{background:var(--bg-container);border-radius:var(--radius-lg);padding:24px 28px;box-shadow:var(--shadow-md);}
.oral-script .beat{display:flex;gap:12px;margin:12px 0;padding:10px 0;border-bottom:1px dashed var(--border-light);align-items:flex-start;}
.oral-script .beat:last-child{border-bottom:none;}
.oral-script .beat-num{flex-shrink:0;width:28px;height:28px;border-radius:50%;background:var(--color-primary);color:#fff;font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center;}
.oral-script .beat-num.hook-beat{background:var(--color-error);}
.oral-script .beat-time{flex-shrink:0;font-size:11px;color:var(--text-tertiary);font-family:'SF Mono',Monaco,monospace;min-width:52px;padding-top:4px;}
.oral-script .beat-content{flex:1;}
.oral-script .beat-content .say{font-size:15px;color:var(--text-primary);line-height:1.7;}
.oral-script .beat-content .say.loud{font-weight:700;font-size:16px;}
.oral-script .beat-content .visual{font-size:12px;color:var(--text-tertiary);margin-top:4px;font-style:italic;}
.oral-script .beat-content .visual::before{content:'🎬 ';font-style:normal;}
/* 论点卡片 */
.chain-cards{display:flex;flex-wrap:wrap;gap:10px;margin:20px 0;}
.chain-card{flex:1;min-width:130px;background:var(--bg-container);border-radius:var(--radius-md);padding:14px;border:1px solid var(--border-light);text-align:center;box-shadow:var(--shadow-sm);}
.chain-card .num{font-size:28px;font-weight:800;margin-bottom:4px;}
.chain-card:nth-child(1) .num{color:var(--color-error);}
.chain-card:nth-child(2) .num{color:#FA8C16;}
.chain-card:nth-child(3) .num{color:var(--color-warning);}
.chain-card:nth-child(4) .num{color:var(--color-success);}
.chain-card:nth-child(5) .num{color:var(--color-primary);}
.chain-card:nth-child(6) .num{color:#722ED1;}
.chain-card .label{font-size:12px;font-weight:700;color:var(--text-primary);}
.chain-card .sub{font-size:11px;color:var(--text-tertiary);margin-top:2px;}
blockquote{background:var(--color-primary-bg);border-left:4px solid var(--color-primary);margin:16px 0;padding:12px 20px;border-radius:0 var(--radius-sm) var(--radius-sm) 0;}
blockquote p{text-indent:0;color:var(--text-primary);font-size:14px;}
.golden-line{background:linear-gradient(135deg,#FFF7E6,#FFF1B8);border:2px solid #FFD666;border-radius:var(--radius-md);padding:18px 24px;margin:20px 0;text-align:center;}
.golden-line p{font-size:18px;font-weight:800;color:#AD6800;text-indent:0;text-align:center;line-height:1.6;}
.footer{text-align:center;padding:28px 0;color:var(--text-tertiary);font-size:13px;border-top:1px solid var(--border-light);margin-top:40px;}
@media(max-width:768px){
.main{padding:80px 16px 40px;}
.chain-card{min-width:100px;}
.oral-script{padding:16px;}
}
</style>
</head>
<body>
<div class="header">
<a href="../../index.html" class="back-link">← 返回索引</a>
<h1>AI转型 · 观点独白 + 口播稿</h1>
</div>
<div class="main">
<!-- ==================== 论点总览 ==================== -->
<section>
<h2>📐 六环递进</h2>
<p>一环推出一环,最终指向商业闭环。</p>
<div class="chain-cards">
<div class="chain-card">
<div class="num"></div>
<div class="label">窗口期紧迫</div>
<div class="sub">客户预期已变<br>采购季是deadline</div>
</div>
<div class="chain-card">
<div class="num"></div>
<div class="label">岗位边界消失</div>
<div class="sub">前端=后端=移动端<br>全栈已是默认配置</div>
</div>
<div class="chain-card">
<div class="num"></div>
<div class="label">管理层崩塌</div>
<div class="sub">邓巴数被AI打破<br>中层不再是常设岗</div>
</div>
<div class="chain-card">
<div class="num"></div>
<div class="label">老板用AI"看见"</div>
<div class="sub">亲自用AI读产出<br>不再被中层过滤</div>
</div>
<div class="chain-card">
<div class="num"></div>
<div class="label">精准激励</div>
<div class="sub">奖金跟产出走<br>不是跟办公室政治走</div>
</div>
<div class="chain-card">
<div class="num"></div>
<div class="label">商业闭环</div>
<div class="sub">成本→报价<br>交付→投标→续约</div>
</div>
</div>
</section>
<!-- ==================== 观点独白 ==================== -->
<section>
<h2>🎤 观点独白</h2>
<div class="speech-meta">
<span class="meta-tag duration">⏱ 约 1215 分钟</span>
</div>
<p><strong>标题:</strong>我看到软件行业正在发生的六个变化</p>
<p>不是演讲,不是说教,就是把我最近观察到的事情说清楚。先讲一个正在发生的例子,再说为什么这意味着什么。</p>
<!-- 引子:亲身案例 -->
<h3>▍ 先讲一个正在发生的项目</h3>
<div class="script-block hook">
<span class="line em">我最近跟的一个政务项目,整个过程中,AI深度参与。</span>
</div>
<div class="script-block">
<span class="line">出方案阶段,AI辅助调研、分析、出框架。原型演示阶段,AI辅助出界面、出交互、出文档。</span>
<span class="line">结果呢?<strong>客户满意度非常高,远远超出预期。</strong></span>
<span class="line">我实话实说,这个项目最后能不能拿下来,我不知道。但我知道一件事——客户的预期已经被拉到这个高度了。</span>
<span class="line em">将来不管谁来做这个项目,如果不能用好AI,根本接不住。</span>
<span class="line">以前做项目按周做计划,现在按天交付。客户被喂过一次"三天出全套原型加接口文档",他就回不去了。他的预期被永久性地拉高了。</span>
<span class="line">这就是窗口期。不是技术窗口,是客户预期窗口。下个采购季来的时候,还没跟上节奏的,连投标资格都没有。</span>
<span class="line">而且不光是政务。企业客户也是一样的。今年,不管是哪个行业,客户都会陆续感受到AI对项目交付的冲击——又快又好。然后他们的预期就会上去,下不来。</span>
</div>
<!-- 变化一 -->
<h3>▍ 变化一:岗位边界消失了</h3>
<div class="script-block hook">
<span class="line">前端、后端、移动端——现在是同一个岗位。</span>
</div>
<div class="script-block">
<span class="line">以前说"全栈"是一个高级标签,要加粗写在简历上的。现在呢?默认配置。</span>
<span class="line">一个开发者加Cursor加Claude,前端后端移动端测试运维全干了。一个人就是一支团队,不是比喻,每天都在发生。</span>
<span class="line">但打开招聘网站,还在分三个岗位招人。HR不知道这个变化,老板也不知道。还在看"3年Vue经验"、"5年Java经验"——按技术栈分组已经没意义了。</span>
</div>
<!-- 变化二 -->
<h3>▍ 变化二:管理层崩塌</h3>
<div class="script-block hook">
<span class="line">岗位合并之后,下一个就是管理层。小组长、研发经理、项目经理,不需要设为常设岗位了。</span>
</div>
<div class="script-block">
<span class="line">管理学有个铁律:一个人最多有效管理7个人。大公司必须分层——组长、经理、总监。组织架构的数学基础就是这个"管理幅度"。</span>
<span class="line">但AI打破了这个约束。AI能同时追踪所有人的工作进度、分配任务、评价质量。没有信息衰减,不用靠"跟谁吃饭多"来判断。</span>
<span class="line">那就简单了。按项目临时组队,谁在那个阶段最懂,谁就是当时的负责人。项目结束,角色消散。</span>
<span class="line">这叫<strong>流式组织</strong>——结构随项目流动,不是固定的层级。传统的"组织架构图"可以扔了。</span>
</div>
<!-- 变化三 -->
<h3>▍ 变化三:客户预期已经不可逆</h3>
<div class="script-block hook">
<span class="line">今年不管是企业客户还是政务客户,已经在体验AI项目的交付速度了。按天交付,不是按周。</span>
</div>
<div class="script-block">
<span class="line">客户一旦被"三天出全套原型+接口文档"喂过一次,就回不去了。他的预期永久拉高。</span>
<span class="line">下个采购季,标书里"项目周期"那一栏:一家写60天,一家写15天。评标专家怎么打分?不给你犹豫的时间。</span>
<span class="line">窗口期就一个采购季的长度。这是客户预期窗口,不是技术窗口。</span>
</div>
<!-- 变化四 -->
<h3>▍ 变化四:老板必须亲自用AI</h3>
<div class="script-block hook">
<span class="line">AI转型不是把工具下发给程序员就完了。老板得亲自用。用它来"看见"。</span>
</div>
<div class="script-block">
<span class="line">以前你怎么知道谁在干活?中层告诉你。中层怎么知道的?靠感觉。感觉靠什么?靠谁跟他吃饭多、谁PPT做得好。</span>
<span class="line">AI直接把数据摆在你面前。这个Sprint谁的代码产出最稳定,谁的bug最少,谁的review有深度,谁在关键时刻解决了别人搞不定的问题。</span>
<span class="line">中层以前是一个信息漏斗。AI把这个漏斗砸了。老板可以直接看到真相。</span>
<span class="line">这不是监控员工。这是让优秀的人被看见。以前被看见要靠向上管理,现在不用了。代码不会说谎。</span>
</div>
<!-- 变化五 -->
<h3>▍ 变化五:奖金可以发给正确的人了</h3>
<div class="script-block hook">
<span class="line">看见之后就是发钱。大多数公司变烂,不是没人才,是人才的付出和回报不对等。</span>
</div>
<div class="script-block">
<span class="line">以前奖金靠办公室政治分配——要平衡、要论资排辈、要照顾中层感受。你越过中层奖励一个开发者,中层怎么想?因为这个,很多老板知道该给谁钱,但不敢。</span>
<span class="line">中层没了、岗位没了、只有项目组。AI追踪的产出数据摆在那,谁做了什么一清二楚。奖金直接跟产出走。</span>
<span class="line">代码不会拍马屁,不会做PPT,不会请你吃饭。它就躺在那,AI读得出来谁是好开发者。</span>
</div>
<!-- 变化六 -->
<h3>▍ 变化六:必须落到商业结果上</h3>
<div class="script-block hook">
<span class="line">前面的东西最后落到三个地方:投标文件、报价单、客户满意度。</span>
</div>
<div class="script-block">
<span class="line">研发成本降了。一个人干五个人的活,以前配5个人,现在2个人加AI。成本降了,报价就有竞争力。同样功能同样质量,便宜30%,利润还更高。</span>
<span class="line">交付快了。按天交付不是口号,是真的能做到。标书里你写15天别人写60天——这不是价格战,是代际碾压。</span>
<span class="line">客户满意了。交付快、质量好、响应及时。客户不傻,续约率和口碑就是最终计分板。</span>
</div>
<!-- 收尾 -->
<h3>▍ 收尾</h3>
<div class="script-block closing">
<span class="line em">六个变化串起来就是一句话:AI让我们有机会把公司重新建一遍——更小、更快、更公平。</span>
<span class="line">岗位边界消失 → 管理层崩塌 → 客户预期不可逆 → 老板亲自用AI看见真相 → 奖金按产出分配 → 最终体现在报价、投标和续约上。</span>
<span class="line">窗口还没关上。但下个采购季,就是分水岭。</span>
</div>
<div class="golden-line">
<p>"以前按周做计划,现在按天交付。<br>以前一个人一个岗位,现在一个人就是一支团队。<br>以前中层过滤信息,现在AI让人被看见。<br>以前奖金靠政治,现在奖金靠数据。"</p>
</div>
</section>
<!-- ==================== 口播稿 ==================== -->
<section>
<h2>📱 口播稿(短视频脚本)</h2>
<div class="oral-meta">
<span class="meta-tag duration">⏱ 约 80 秒</span>
</div>
<p><strong>视频标题建议:</strong></p>
<blockquote>
<p>① 前端、后端、移动端,现在是同一个岗位<br>
② 软件公司的中层管理,正在消失<br>
③ 下个采购季,没转型的软件公司会出局</p>
</blockquote>
<div class="oral-script">
<div class="beat">
<div class="beat-num hook-beat">1</div>
<div class="beat-time">0:000:10</div>
<div class="beat-content">
<div class="say loud">我最近跟一个政务项目,AI深度参与——出方案用AI,原型演示用AI。结果客户满意度远远超出预期。这个项目能不能拿下来我不知道,但客户的预期已经被拉到这个高度了。以后谁来做,用不好AI都接不住。</div>
</div>
</div>
<div class="beat">
<div class="beat-num">2</div>
<div class="beat-time">0:100:20</div>
<div class="beat-content">
<div class="say">前端、后端、移动端——现在是同一个岗位。一个开发者加AI等于一个完整团队。全栈以前是高级标签,现在默认配置。一个人干五个人的活,每天都在发生。</div>
</div>
</div>
<div class="beat">
<div class="beat-num">3</div>
<div class="beat-time">0:200:34</div>
<div class="beat-content">
<div class="say">岗位没了,管理层接着没。一个人最多管7个人的铁律被AI打破。AI能同时追踪所有人——分配工作、追进度、评价质量。组长、经理、项目经理不再是常设岗。按项目组队,结束就散。这叫流式组织。</div>
</div>
</div>
<div class="beat">
<div class="beat-num">4</div>
<div class="beat-time">0:340:50</div>
<div class="beat-content">
<div class="say">老板得亲自用AI。不是下发工具,是用AI来"看见"——谁在产出、谁是关键节点、谁在摸鱼。以前中层过滤这些信息,AI把漏斗砸了。代码不会说谎。</div>
</div>
</div>
<div class="beat">
<div class="beat-num">5</div>
<div class="beat-time">0:500:64</div>
<div class="beat-content">
<div class="say">看见之后就发钱。以前奖金靠办公室政治、PPT、吃饭。现在AI追踪产出——代码量、bug率、review深度。把钱发给干活的人。公司变烂不是因为缺人才,是回报不对等。</div>
</div>
</div>
<div class="beat">
<div class="beat-num">6</div>
<div class="beat-time">0:640:78</div>
<div class="beat-content">
<div class="say loud">最后落三个地方:投标文件、报价单、客户满意度。成本降了报价有竞争力,交付快了标书有说服力。客户被AI喂过之后预期回不去了。下个采购季,就是分水岭。</div>
</div>
</div>
</div>
<div style="margin-top:24px;padding:16px 20px;background:var(--bg-elevated);border-radius:var(--radius-md);border:1px solid var(--border);">
<h4 style="margin:0 0 8px;color:var(--text-primary);font-size:13px;">📋 拍摄备注</h4>
<ul style="margin:0 0 0 16px;font-size:13px;color:var(--text-secondary);">
<li><strong>风格:</strong>独白,自己对着镜头说话。不是质问观众,是在分享一个观察。语气笃定、直接、不绕弯。</li>
<li><strong>语速:</strong>偏快,每分钟约300字。全稿约350字,控制在75秒左右。</li>
<li><strong>情绪线:</strong>开头一句话扔出来(0–7s)→ 连续输出事实(7–48s)→ 收束到商业结果(48–75s)。</li>
<li><strong>可拆条:</strong>Beat 1-3可独立成一条("岗位和管理一起消失");Beat 4-5可独立成一条("老板用AI看见+发钱")。</li>
</ul>
</div>
</section>
<!-- ==================== 附录 ==================== -->
<section>
<h2>📋 附:论点速查表</h2>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>#</th>
<th>论点</th>
<th>演讲时长</th>
<th>口播节拍</th>
<th>一句话版本</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td><strong>窗口期紧迫</strong></td>
<td>2 min</td>
<td>Beat 67</td>
<td>客户预期一旦上去就回不来,下个采购季就是分水岭。</td>
</tr>
<tr>
<td></td>
<td><strong>岗位边界消失</strong></td>
<td>2 min</td>
<td>Beat 12</td>
<td>前端、后端、移动端——在AI时代是同一个岗位。</td>
</tr>
<tr>
<td></td>
<td><strong>管理层崩塌</strong></td>
<td>3 min</td>
<td>Beat 3</td>
<td>AI打破了"一个人最多管7个人"的铁律,中层不再需要常设。</td>
</tr>
<tr>
<td></td>
<td><strong>老板用AI"看见"</strong></td>
<td>3 min</td>
<td>Beat 4</td>
<td>老板必须亲自用AI,不是下发给员工,是用它来看到真相。</td>
</tr>
<tr>
<td></td>
<td><strong>精准激励</strong></td>
<td>3 min</td>
<td>Beat 5</td>
<td>代码不会说谎,奖金跟产出走,不跟办公室政治走。</td>
</tr>
<tr>
<td></td>
<td><strong>商业闭环</strong></td>
<td>3 min</td>
<td>Beat 6</td>
<td>成本降→报价有竞争力;交付快→投标有说服力;满意度高→续约。</td>
</tr>
</tbody>
</table>
</div>
</section>
<p class="footer">抖音话题 · 观点独白与口播稿 · 2026.06</p>
</div>
</body>
</html>
@@ -132,6 +132,8 @@
</head>
<body>
<a href="../index.html" style="display:block;padding:8px 24px;color:#1677FF;text-decoration:none;font-size:13px;background:#fff;border-bottom:1px solid #e5e7eb;">← 返回知识库</a>
<!-- Hero -->
<section class="hero">
<h1>政府审批流解决方案</h1>
+189
View File
@@ -0,0 +1,189 @@
---
name: spring-ai-alibaba-deployment-config
description: Spring AI Alibaba 全功能平台部署配置清单 — 账号密码、端口、地址
metadata:
type: project
---
# Spring AI Alibaba 全功能平台 — 配置清单
> 部署时间:2026-06-05
> 环境:WSL2 Debian 13 · 本地内网
> **WSL2 IP172.18.79.129**
> 关联文档:[[spring-ai-alibaba-deployment-guide]]
---
## 一、服务端口与地址
### 中间件
| 服务 | 端口 | 用途 | 本地访问 | 内网访问 |
|------|------|------|----------|----------|
| **PostgreSQL 16** | `5432` | Agent 状态 + 数据集 + 向量检索 | `localhost:5432` | `172.18.79.129:5432` |
| **Nacos** | `8848` | 控制台 + HTTP API | `http://localhost:8848/nacos` | `http://172.18.79.129:8848/nacos` |
| **Nacos gRPC** | `9848` | MCP 服务注册发现(gRPC | `localhost:9848` | — |
| **MinIO API** | `9000` | S3 对象存储 API | `http://localhost:9000` | — |
| **MinIO Console** | `9001` | MinIO Web 管理界面 | `http://localhost:9001` | `http://172.18.79.129:9001` |
### 应用
| 服务 | 端口 | 用途 | 地址 |
|------|------|------|------|
| **Agent Platform** | `8080` | Spring AI Alibaba 主应用 | `http://localhost:8080` |
| **Admin Studio** | `8080/chatui` | 可视化编排 + 评测 + 监控 | `http://localhost:8080/chatui` |
| **Actuator Health** | `8080/actuator/health` | 健康检查 | `http://localhost:8080/actuator/health` |
| **Actuator Metrics** | `8080/actuator/metrics` | 指标采集 | `http://localhost:8080/actuator/metrics` |
### 外网模型 API
| 服务 | 地址 | 说明 |
|------|------|------|
| **DashScope(百炼)** | `https://dashscope.aliyuncs.com` | 通义千问 LLM,外网调用 |
| **DashScope 控制台** | `https://dashscope.console.aliyun.com/` | API Key 管理 |
---
## 二、账号密码(开发环境)
### 中间件凭证
| 服务 | 用户名 | 密码 | 数据库/命名空间 |
|------|--------|------|----------------|
| **PostgreSQL** | `sa_agent` | `agent_2026` | `spring_ai_agent` |
| **Nacos** | `nacos`v2.5.1 默认无鉴权) | `nacos` | — |
| **MinIO** | `minioadmin` | `minioadmin` | — |
### Nacos 命名空间
| 命名空间 ID | 名称 | 用途 |
|-------------|------|------|
| `sa-agent-mcp` | MCP 注册发现 | MCP Server/Client 服务注册 |
| `sa-agent-config` | 动态配置 | Prompt 模板 + 模型参数热更新 |
| `sa-agent-a2a` | A2A 通信 | 多 Agent 跨服务通信(可选) |
### MinIO Bucket
| Bucket | 用途 |
|--------|------|
| `sa-agent-memory` | Agent 记忆文件(MEMORY.md / 快照 / 知识图谱) |
| `sa-agent-datasets` | 评测数据集存储 |
| `sa-agent-skills` | 自定义 Skill 文件存储 |
### 外网 API Key
| 服务 | 环境变量 | 获取地址 |
|------|----------|----------|
| **DashScope** | `DASHSCOPE_API_KEY` | https://dashscope.console.aliyun.com/ |
| **Jina AI**(可选) | `JINA_API_KEY` | https://jina.ai/ |
### systemd 服务
| 服务名 | 用途 |
|--------|------|
| `agent-platform` | Spring AI Alibaba 应用自启动 |
| `docker` | Docker daemon |
---
## 三、文件路径
```
/mnt/d/wiki/智能体平台调研/
├── 代码/
│ ├── docker-compose.yml # 中间件 Docker 编排(Nacos + PG + MinIO
│ ├── start.sh # 一键启动脚本
│ ├── health-check.sh # 健康检查脚本
│ └── agent-platform/ # Spring Boot 应用源码
│ ├── pom.xml # Maven 依赖(全功能)
│ ├── .env # 环境变量模板
│ ├── .mvn/settings.xml # Maven 仓库配置
│ └── src/main/
│ ├── resources/
│ │ └── application.yml # 全功能配置
│ └── java/com/demo/agent/
│ └── AgentPlatformApplication.java
├── 报告/
│ ├── ai-agent-platform-comparison.html # 平台调研报告
│ └── spring-ai-alibaba-deployment-guide.html # 部署指南
└── CONFIG.md # ← 本文件
```
### Docker 数据卷
| 卷名 | 宿主机路径(默认) | 内容 |
|------|-------------------|------|
| `sa_pg_data` | Docker volumes | PostgreSQL 数据文件 |
| `sa_nacos_data` | Docker volumes | Nacos 数据 |
| `sa_minio_data` | Docker volumes | MinIO 对象数据 |
---
## 四、Docker 容器
| 容器名 | 镜像 | 自启动 |
|--------|------|--------|
| `sa-pg` | `pgvector/pgvector:pg16` | `restart: unless-stopped` |
| `sa-nacos` | `nacos/nacos-server:v2.5.1` | `restart: unless-stopped` |
| `sa-minio` | `minio/minio:latest` | `restart: unless-stopped` |
| `sa-minio-init` | `minio/mc:latest` | 一次性(初始化 Bucket 后退出) |
---
## 五、快速操作命令
### 启动
```bash
# 1. 启动中间件(Docker Compose
cd /mnt/d/wiki/智能体平台调研/代码
docker compose up -d
# 2. 加载环境变量
source agent-platform/.env # 记得先填写 DASHSCOPE_API_KEY
# 3. 构建并启动应用
cd agent-platform
mvn spring-boot:run
# 或构建 jar 后运行
mvn clean package -DskipTests
java -jar target/agent-platform-1.0.0.jar
```
### 停止
```bash
# 停止应用:Ctrl+C 或
sudo systemctl stop agent-platform
# 停止中间件
cd /mnt/d/wiki/智能体平台调研/代码
docker compose down
```
### 常用运维
```bash
# 查看中间件日志
docker compose -f /mnt/d/wiki/智能体平台调研/代码/docker-compose.yml logs -f nacos
# 查看应用日志
tail -f /mnt/d/wiki/智能体平台调研/代码/agent-platform/logs/agent-platform.log
# 健康检查
bash /mnt/d/wiki/智能体平台调研/代码/health-check.sh
# 数据备份
pg_dump -h localhost -U sa_agent spring_ai_agent > backup_$(date +%Y%m%d).sql
```
---
## 六、安全提醒
1. **所有密码为开发环境默认值**,生产内网部署后应立即修改
2. **Nacos 不要暴露到公网**(默认鉴权较简单),当前纯内网使用可接受
3. **DashScope API Key** 不要提交到 git,已通过 `.gitignore` 排除 `.env`
4. **Nacos Auth Token**`SecretKey0123...`)是 Nacos 鉴权密钥,生产环境必须更换为 32 位以上随机字符串
5. PostgreSQL 远程访问(`pg_hba.conf`)已配置 `0.0.0.0/0 md5`,仅限内网使用
@@ -0,0 +1,14 @@
# Spring AI Alibaba 环境变量
# 放置在 agent-platform/ 目录下,或 source 到 shell
# ===== 必选 =====
# 阿里云百炼 API Key — 获取: https://dashscope.console.aliyun.com/
export DASHSCOPE_API_KEY=sk-your-dashscope-api-key-here
# ===== Nacos 命名空间(与 docker-compose 中初始化的一致)=====
export NACOS_CONFIG_NAMESPACE=sa-agent-config
export NACOS_MCP_NAMESPACE=sa-agent-mcp
# ===== 可选 =====
# Jina AI Key(深度搜索功能)
# export JINA_API_KEY=jina-your-key-here
@@ -0,0 +1,31 @@
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<!-- Maven 配置 — 放在 ~/.m2/settings.xml 或项目根目录 -->
<profiles>
<profile>
<id>spring-milestones</id>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots><enabled>false</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>spring-milestones</activeProfile>
</activeProfiles>
</settings>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,148 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.8</version>
<relativePath/>
</parent>
<groupId>com.demo</groupId>
<artifactId>agent-platform</artifactId>
<version>1.0.0</version>
<name>AgentPlatform</name>
<description>Spring AI Alibaba 全功能智能体平台 v1.1.2.2</description>
<properties>
<java.version>21</java.version>
<spring-ai.version>1.1.2</spring-ai.version>
<spring-ai-alibaba.version>1.1.2.2</spring-ai-alibaba.version>
<spring-cloud-aws.version>3.3.0</spring-cloud-aws.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-bom</artifactId>
<version>${spring-ai-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.awspring.cloud</groupId>
<artifactId>spring-cloud-aws-dependencies</artifactId>
<version>${spring-cloud-aws.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- ===== 核心 AIDashScope 百炼)===== -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
<version>${spring-ai-alibaba.version}</version>
</dependency>
<!-- ===== 多 Agent 框架 + Graph 引擎 ===== -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-agent-framework</artifactId>
<version>${spring-ai-alibaba.version}</version>
</dependency>
<!-- ===== Admin Studio(可视化编排 + 评测界面)===== -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-studio</artifactId>
<version>${spring-ai-alibaba.version}</version>
</dependency>
<!-- ===== Nacos 动态配置(Prompt 热更新)===== -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-config-nacos</artifactId>
<version>${spring-ai-alibaba.version}</version>
</dependency>
<!-- ===== Graph 可观测性 ===== -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-graph-observation</artifactId>
<version>${spring-ai-alibaba.version}</version>
</dependency>
<!-- ===== 数据库 ===== -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<!-- ===== 对象存储(MinIO / S3===== -->
<dependency>
<groupId>io.awspring.cloud</groupId>
<artifactId>spring-cloud-aws-starter-s3</artifactId>
</dependency>
<!-- ===== Web + Actuator ===== -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- ===== MCP JSON SchemaStudio 所需)===== -->
<dependency>
<groupId>com.networknt</groupId>
<artifactId>json-schema-validator</artifactId>
<version>1.5.6</version>
</dependency>
<!-- ===== 开发便利 ===== -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
</project>
@@ -0,0 +1,23 @@
package com.demo.agent;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Spring AI Alibaba 全功能智能体平台
* <p>
* 启动后访问:
* <ul>
* <li>Admin Studio: http://localhost:8080/chatui</li>
* <li>健康检查: http://localhost:8080/actuator/health</li>
* </ul>
*/
@SpringBootApplication(exclude = {
org.springframework.ai.mcp.server.common.autoconfigure.McpServerAutoConfiguration.class
})
public class AgentPlatformApplication {
public static void main(String[] args) {
SpringApplication.run(AgentPlatformApplication.class, args);
}
}
@@ -0,0 +1,20 @@
package com.demo.agent;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ChatController {
@Autowired
private ChatModel chatModel;
@GetMapping("/chat")
public String chat(@RequestParam(defaultValue = "你好,请用一句话介绍你自己") String q) {
return chatModel.call(q);
}
}
@@ -0,0 +1,100 @@
package com.demo.agent;
import com.alibaba.cloud.ai.graph.CompiledGraph;
import com.alibaba.cloud.ai.graph.KeyStrategy;
import com.alibaba.cloud.ai.graph.KeyStrategyFactory;
import com.alibaba.cloud.ai.graph.StateGraph;
import com.alibaba.cloud.ai.graph.agent.ReactAgent;
import com.alibaba.cloud.ai.graph.state.strategy.AppendStrategy;
import com.alibaba.cloud.ai.graph.state.strategy.ReplaceStrategy;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
import static com.alibaba.cloud.ai.graph.StateGraph.END;
import static com.alibaba.cloud.ai.graph.StateGraph.START;
import static com.alibaba.cloud.ai.graph.action.AsyncNodeAction.node_async;
@Configuration
public class StudioDemoConfig {
/**
* 演示 Graph 简单对话工作流接收消息 AI 处理 返回结果
*/
@Bean
public CompiledGraph demoChatGraph(ChatModel chatModel) throws Exception {
KeyStrategyFactory keyFactory = () -> Map.of(
"messages", new AppendStrategy(false),
"result", new ReplaceStrategy()
);
StateGraph graph = new StateGraph("demo_chat_workflow", keyFactory)
.addNode("chat_node", node_async(state -> {
Object messages = state.value("messages").orElse("你好");
String aiResponse = chatModel.call(messages.toString());
return Map.of("result", aiResponse, "messages", aiResponse);
}))
.addEdge(START, "chat_node")
.addEdge("chat_node", END);
return graph.compile();
}
/**
* 演示 Graph 多步骤处理分析 总结
*/
@Bean
public CompiledGraph demoMultiStepGraph(ChatModel chatModel) throws Exception {
KeyStrategyFactory keyFactory = () -> Map.of(
"input", new ReplaceStrategy(),
"analysis", new ReplaceStrategy(),
"summary", new ReplaceStrategy()
);
StateGraph graph = new StateGraph("demo_multi_step", keyFactory)
.addNode("analyze", node_async(state -> {
String input = state.value("input").orElse("").toString();
String analysis = chatModel.call("请分析以下内容的关键点:" + input);
return Map.of("analysis", analysis);
}))
.addNode("summarize", node_async(state -> {
String analysis = state.value("analysis").orElse("").toString();
String summary = chatModel.call("请用一句话总结:" + analysis);
return Map.of("summary", summary);
}))
.addEdge(START, "analyze")
.addEdge("analyze", "summarize")
.addEdge("summarize", END);
return graph.compile();
}
/**
* 演示 Agent 基础对话助手
*/
@Bean
public ReactAgent demoAssistant(ChatModel chatModel) {
return ReactAgent.builder()
.name("assistant")
.model(chatModel)
.systemPrompt("你是一个有用的AI助手,请用中文回答所有问题。")
.enableLogging(true)
.build();
}
/**
* 演示 Agent 代码助手
*/
@Bean
public ReactAgent demoCoder(ChatModel chatModel) {
return ReactAgent.builder()
.name("coder")
.model(chatModel)
.systemPrompt("你是一个编程助手,擅长Java、Python、Spring Boot。请提供可运行的代码示例。")
.enableLogging(true)
.build();
}
}
@@ -0,0 +1,123 @@
# ============================================================
# Spring AI Alibaba 全功能平台 — 应用配置
# 环境:本地内网 WSL2
# 放置:src/main/resources/application.yml
# ============================================================
# --- 服务器 ---
server:
port: 8081
address: 0.0.0.0 # 绑定所有网卡,允许内网访问
# --- 应用名 ---
spring:
application:
name: agent-platform
# ==========================================
# 数据源 — PostgreSQL 16 + pgvector
# ==========================================
datasource:
url: jdbc:postgresql://localhost:5432/spring_ai_agent
username: sa_agent
password: agent_2026
driver-class-name: org.postgresql.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 2
# ==========================================
# AI 模型 — 阿里云百炼 DashScope(外网)
# ==========================================
ai:
dashscope:
api-key: ${DASHSCOPE_API_KEY}
chat:
options:
model: qwen-plus
temperature: 0.7
# max-tokens not supported in 1.0.0.2 DashScopeChatOptions, removed
# ==========================================
# Nacos — 服务注册发现 + 动态配置中心
# ==========================================
alibaba:
# Agent Nacos 代理(1.1.2.2 新配置,注意用 camelCase
agent:
proxy:
nacos:
enabled: true
serverAddr: localhost:8848
namespace: sa-agent-config
nacos:
# 动态配置
config:
server-addr: localhost:8848
namespace: sa-agent-config
username: nacos
password: nacos
group: DEFAULT_GROUP
refresh-enabled: true # 配置热更新
# MCP 分布式 — 服务注册发现(暂无 nacos-mcp starter,关闭)
mcp:
nacos:
enabled: false
username: nacos
password: nacos
registry:
enabled: true
service-namespace: sa-agent-mcp
# ==========================================
# 对象存储 — MinIO(S3 兼容)
# ==========================================
cloud:
aws:
s3:
endpoint: http://localhost:9000
region: us-east-1
path-style-access-enabled: true
credentials:
access-key: minioadmin
secret-key: minioadmin
# ==========================================
# Admin Studio — 可视化编排 + 评测平台
# ==========================================
spring.ai.alibaba:
studio:
enabled: true
path: /chatui
# Graph 工作流可观测
graph:
observation:
enabled: true
# ==========================================
# Actuator — 健康检查 + 指标
# ==========================================
management:
endpoints:
web:
exposure:
include: health,info,metrics,env,prometheus
endpoint:
health:
show-details: when-authorized
metrics:
export:
prometheus:
enabled: true
# ==========================================
# 日志
# ==========================================
logging:
level:
com.alibaba.cloud.ai: DEBUG
com.demo.agent: DEBUG
org.springframework.ai: INFO
file:
name: logs/agent-platform.log
@@ -0,0 +1,123 @@
# ============================================================
# Spring AI Alibaba 全功能平台 — 应用配置
# 环境:本地内网 WSL2
# 放置:src/main/resources/application.yml
# ============================================================
# --- 服务器 ---
server:
port: 8081
address: 0.0.0.0 # 绑定所有网卡,允许内网访问
# --- 应用名 ---
spring:
application:
name: agent-platform
# ==========================================
# 数据源 — PostgreSQL 16 + pgvector
# ==========================================
datasource:
url: jdbc:postgresql://localhost:5432/spring_ai_agent
username: sa_agent
password: agent_2026
driver-class-name: org.postgresql.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 2
# ==========================================
# AI 模型 — 阿里云百炼 DashScope(外网)
# ==========================================
ai:
dashscope:
api-key: ${DASHSCOPE_API_KEY}
chat:
options:
model: qwen-plus
temperature: 0.7
# max-tokens not supported in 1.0.0.2 DashScopeChatOptions, removed
# ==========================================
# Nacos — 服务注册发现 + 动态配置中心
# ==========================================
alibaba:
# Agent Nacos 代理(1.1.2.2 新配置,注意用 camelCase
agent:
proxy:
nacos:
enabled: true
serverAddr: localhost:8848
namespace: sa-agent-config
nacos:
# 动态配置
config:
server-addr: localhost:8848
namespace: sa-agent-config
username: nacos
password: nacos
group: DEFAULT_GROUP
refresh-enabled: true # 配置热更新
# MCP 分布式 — 服务注册发现(暂无 nacos-mcp starter,关闭)
mcp:
nacos:
enabled: false
username: nacos
password: nacos
registry:
enabled: true
service-namespace: sa-agent-mcp
# ==========================================
# 对象存储 — MinIO(S3 兼容)
# ==========================================
cloud:
aws:
s3:
endpoint: http://localhost:9000
region: us-east-1
path-style-access-enabled: true
credentials:
access-key: minioadmin
secret-key: minioadmin
# ==========================================
# Admin Studio — 可视化编排 + 评测平台
# ==========================================
spring.ai.alibaba:
studio:
enabled: true
path: /chatui
# Graph 工作流可观测
graph:
observation:
enabled: true
# ==========================================
# Actuator — 健康检查 + 指标
# ==========================================
management:
endpoints:
web:
exposure:
include: health,info,metrics,env,prometheus
endpoint:
health:
show-details: when-authorized
metrics:
export:
prometheus:
enabled: true
# ==========================================
# 日志
# ==========================================
logging:
level:
com.alibaba.cloud.ai: DEBUG
com.demo.agent: DEBUG
org.springframework.ai: INFO
file:
name: logs/agent-platform.log
@@ -0,0 +1,3 @@
artifactId=agent-platform
groupId=com.demo
version=1.0.0
@@ -0,0 +1,3 @@
com/demo/agent/ChatController.class
com/demo/agent/StudioDemoConfig.class
com/demo/agent/AgentPlatformApplication.class
@@ -0,0 +1,3 @@
/mnt/d/wiki/智能体平台调研/代码/agent-platform/src/main/java/com/demo/agent/AgentPlatformApplication.java
/mnt/d/wiki/智能体平台调研/代码/agent-platform/src/main/java/com/demo/agent/ChatController.java
/mnt/d/wiki/智能体平台调研/代码/agent-platform/src/main/java/com/demo/agent/StudioDemoConfig.java
+260
View File
@@ -0,0 +1,260 @@
# ------------------------------------------------------------------
# Essential defaults for Docker Compose deployments.
# Only include variables required for services to start.
#
# For a default deployment, copy this file to .env and run:
# docker compose up -d
#
# Optional and provider-specific variables live under docker/envs/.
# Copy an optional *.env.example file beside itself without the
# .example suffix when you need those advanced settings.
# Values in docker/.env take precedence over docker/envs/*.env files.
# ------------------------------------------------------------------
# Core service URLs
CONSOLE_API_URL=
SERVER_CONSOLE_API_URL=http://api:5001
CONSOLE_WEB_URL=
SERVICE_API_URL=
TRIGGER_URL=http://localhost
APP_API_URL=
APP_WEB_URL=
FILES_URL=
INTERNAL_FILES_URL=
ENDPOINT_URL_TEMPLATE=http://localhost/e/{hook_id}
NEXT_PUBLIC_SOCKET_URL=ws://localhost
# Runtime and security
LANG=C.UTF-8
LC_ALL=C.UTF-8
PYTHONIOENCODING=utf-8
UV_CACHE_DIR=/tmp/.uv-cache
# Leave empty to auto-generate a persistent key in the storage directory.
SECRET_KEY=dify-secret-key-2026-local-intranet-deploy
INIT_PASSWORD=
DEPLOY_ENV=PRODUCTION
CHECK_UPDATE_URL=https://updates.dify.ai
OPENAI_API_BASE=https://api.openai.com/v1
MIGRATION_ENABLED=true
FILES_ACCESS_TIMEOUT=300
# Remove `collaboration` from COMPOSE_PROFILES to stop the dedicated websocket service.
ENABLE_COLLABORATION_MODE=true
# Logging and server workers
LOG_LEVEL=INFO
LOG_OUTPUT_FORMAT=text
LOG_FILE=/app/logs/server.log
LOG_FILE_MAX_SIZE=20
LOG_FILE_BACKUP_COUNT=5
LOG_DATEFORMAT=%Y-%m-%d %H:%M:%S
LOG_TZ=UTC
DEBUG=false
FLASK_DEBUG=false
ENABLE_REQUEST_LOGGING=False
DIFY_BIND_ADDRESS=0.0.0.0
DIFY_PORT=5001
SERVER_WORKER_AMOUNT=1
SERVER_WORKER_CLASS=gevent
SERVER_WORKER_CONNECTIONS=10
API_WEBSOCKET_WORKER_CLASS=geventwebsocket.gunicorn.workers.GeventWebSocketWorker
API_WEBSOCKET_WORKER_CONNECTIONS=1000
API_WEBSOCKET_GUNICORN_TIMEOUT=360
GUNICORN_TIMEOUT=360
CELERY_WORKER_CLASS=
CELERY_WORKER_AMOUNT=4
CELERY_AUTO_SCALE=false
CELERY_MAX_WORKERS=
CELERY_MIN_WORKERS=
COMPOSE_WORKER_HEALTHCHECK_DISABLED=true
COMPOSE_WORKER_HEALTHCHECK_INTERVAL=30s
COMPOSE_WORKER_HEALTHCHECK_TIMEOUT=30s
# Database
DB_TYPE=postgresql
DB_USERNAME=sa_agent
DB_PASSWORD=agent_2026
DB_HOST=172.18.79.129
DB_PORT=5432
DB_DATABASE=dify
SQLALCHEMY_POOL_SIZE=30
SQLALCHEMY_MAX_OVERFLOW=10
SQLALCHEMY_POOL_RECYCLE=3600
SQLALCHEMY_ECHO=false
SQLALCHEMY_POOL_PRE_PING=false
SQLALCHEMY_POOL_USE_LIFO=false
SQLALCHEMY_POOL_TIMEOUT=30
SQLALCHEMY_POOL_RESET_ON_RETURN=rollback
PGDATA=/var/lib/postgresql/data/pgdata
POSTGRES_MAX_CONNECTIONS=200
POSTGRES_SHARED_BUFFERS=128MB
POSTGRES_WORK_MEM=4MB
POSTGRES_MAINTENANCE_WORK_MEM=64MB
POSTGRES_EFFECTIVE_CACHE_SIZE=4096MB
POSTGRES_STATEMENT_TIMEOUT=0
POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT=0
# Redis and Celery
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_USERNAME=
REDIS_PASSWORD=difyai123456
REDIS_USE_SSL=false
REDIS_SSL_CERT_REQS=CERT_NONE
REDIS_SSL_CA_CERTS=
REDIS_SSL_CERTFILE=
REDIS_SSL_KEYFILE=
REDIS_DB=0
REDIS_KEY_PREFIX=
REDIS_MAX_CONNECTIONS=
REDIS_RETRY_RETRIES=3
REDIS_RETRY_BACKOFF_BASE=1.0
REDIS_RETRY_BACKOFF_CAP=10.0
REDIS_SOCKET_TIMEOUT=5.0
REDIS_SOCKET_CONNECT_TIMEOUT=5.0
REDIS_HEALTH_CHECK_INTERVAL=30
CELERY_BROKER_URL=redis://:difyai123456@redis:6379/1
CELERY_BACKEND=redis
BROKER_USE_SSL=false
CELERY_TASK_ANNOTATIONS=null
EVENT_BUS_REDIS_URL=
EVENT_BUS_REDIS_CHANNEL_TYPE=pubsub
EVENT_BUS_REDIS_USE_CLUSTERS=false
EVENT_BUS_LISTENER_JOIN_TIMEOUT_MS=2000
# Web and app limits
WEB_API_CORS_ALLOW_ORIGINS=*
CONSOLE_CORS_ALLOW_ORIGINS=*
COOKIE_DOMAIN=
NEXT_PUBLIC_COOKIE_DOMAIN=
NEXT_PUBLIC_BATCH_CONCURRENCY=5
API_SENTRY_DSN=
API_SENTRY_TRACES_SAMPLE_RATE=1.0
API_SENTRY_PROFILES_SAMPLE_RATE=1.0
WEB_SENTRY_DSN=
AMPLITUDE_API_KEY=
TEXT_GENERATION_TIMEOUT_MS=60000
CSP_WHITELIST=
ALLOW_EMBED=false
ALLOW_INLINE_STYLES=false
ALLOW_UNSAFE_DATA_SCHEME=false
TOP_K_MAX_VALUE=10
INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000
LOOP_NODE_MAX_COUNT=100
MAX_TOOLS_NUM=10
MAX_PARALLEL_LIMIT=10
MAX_ITERATIONS_NUM=99
MAX_TREE_DEPTH=50
ENABLE_WEBSITE_JINAREADER=true
ENABLE_WEBSITE_FIRECRAWL=true
ENABLE_WEBSITE_WATERCRAWL=true
NEXT_PUBLIC_ENABLE_SINGLE_DOLLAR_LATEX=false
EXPERIMENTAL_ENABLE_VINEXT=false
# Storage and default vector store
STORAGE_TYPE=opendal
OPENDAL_SCHEME=fs
OPENDAL_FS_ROOT=storage
VECTOR_STORE=weaviate
VECTOR_INDEX_NAME_PREFIX=Vector_index
WEAVIATE_ENDPOINT=http://weaviate:8080
WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih
WEAVIATE_GRPC_ENDPOINT=grpc://weaviate:50051
WEAVIATE_TOKENIZATION=word
WEAVIATE_PERSISTENCE_DATA_PATH=/var/lib/weaviate
WEAVIATE_QUERY_DEFAULTS_LIMIT=25
WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true
WEAVIATE_DEFAULT_VECTORIZER_MODULE=none
WEAVIATE_CLUSTER_HOSTNAME=node1
WEAVIATE_AUTHENTICATION_APIKEY_ENABLED=true
WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih
WEAVIATE_AUTHENTICATION_APIKEY_USERS=hello@dify.ai
WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED=true
WEAVIATE_AUTHORIZATION_ADMINLIST_USERS=hello@dify.ai
WEAVIATE_DISABLE_TELEMETRY=false
WEAVIATE_ENABLE_TOKENIZER_GSE=false
WEAVIATE_ENABLE_TOKENIZER_KAGOME_JA=false
WEAVIATE_ENABLE_TOKENIZER_KAGOME_KR=false
# Sandbox and SSRF proxy
CODE_EXECUTION_ENDPOINT=http://sandbox:8194
CODE_EXECUTION_API_KEY=dify-sandbox
CODE_EXECUTION_SSL_VERIFY=True
CODE_EXECUTION_POOL_MAX_CONNECTIONS=100
CODE_EXECUTION_POOL_MAX_KEEPALIVE_CONNECTIONS=20
CODE_EXECUTION_POOL_KEEPALIVE_EXPIRY=5.0
CODE_EXECUTION_CONNECT_TIMEOUT=10
CODE_EXECUTION_READ_TIMEOUT=60
CODE_EXECUTION_WRITE_TIMEOUT=10
SANDBOX_API_KEY=dify-sandbox
SANDBOX_GIN_MODE=release
SANDBOX_WORKER_TIMEOUT=15
SANDBOX_ENABLE_NETWORK=true
SANDBOX_HTTP_PROXY=http://ssrf_proxy:3128
SANDBOX_HTTPS_PROXY=http://ssrf_proxy:3128
SANDBOX_PORT=8194
PIP_MIRROR_URL=
SSRF_PROXY_HTTP_URL=http://ssrf_proxy:3128
SSRF_PROXY_HTTPS_URL=http://ssrf_proxy:3128
SSRF_HTTP_PORT=3128
SSRF_COREDUMP_DIR=/var/spool/squid
SSRF_REVERSE_PROXY_PORT=8194
SSRF_SANDBOX_HOST=sandbox
SSRF_DEFAULT_TIME_OUT=5
SSRF_DEFAULT_CONNECT_TIME_OUT=5
SSRF_DEFAULT_READ_TIME_OUT=5
SSRF_DEFAULT_WRITE_TIME_OUT=5
SSRF_POOL_MAX_CONNECTIONS=100
SSRF_POOL_MAX_KEEPALIVE_CONNECTIONS=20
SSRF_POOL_KEEPALIVE_EXPIRY=5.0
# Plugin daemon
DB_PLUGIN_DATABASE=dify_plugin
EXPOSE_PLUGIN_DAEMON_PORT=5002
PLUGIN_DAEMON_PORT=5002
PLUGIN_DAEMON_KEY=lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi
PLUGIN_DAEMON_URL=http://plugin_daemon:5002
PLUGIN_MAX_PACKAGE_SIZE=52428800
PLUGIN_MODEL_SCHEMA_CACHE_TTL=3600
PLUGIN_PPROF_ENABLED=false
PLUGIN_DEBUGGING_HOST=0.0.0.0
PLUGIN_DEBUGGING_PORT=5003
EXPOSE_PLUGIN_DEBUGGING_HOST=localhost
EXPOSE_PLUGIN_DEBUGGING_PORT=5003
PLUGIN_DIFY_INNER_API_KEY=QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1
PLUGIN_DIFY_INNER_API_URL=http://api:5001
FORCE_VERIFYING_SIGNATURE=true
PLUGIN_STDIO_BUFFER_SIZE=1024
PLUGIN_STDIO_MAX_BUFFER_SIZE=5242880
PLUGIN_PYTHON_ENV_INIT_TIMEOUT=120
PLUGIN_MAX_EXECUTION_TIMEOUT=600
PLUGIN_STORAGE_TYPE=local
PLUGIN_STORAGE_LOCAL_ROOT=/app/storage
PLUGIN_WORKING_PATH=/app/storage/cwd
PLUGIN_INSTALLED_PATH=plugin
PLUGIN_PACKAGE_CACHE_PATH=plugin_packages
PLUGIN_MEDIA_CACHE_PATH=assets
PLUGIN_STORAGE_OSS_BUCKET=
PLUGIN_SENTRY_ENABLED=false
PLUGIN_SENTRY_DSN=
MARKETPLACE_ENABLED=true
MARKETPLACE_API_URL=https://marketplace.dify.ai
MARKETPLACE_URL=
# Nginx and Docker Compose
NGINX_SERVER_NAME=_
NGINX_HTTPS_ENABLED=false
NGINX_PORT=80
NGINX_SSL_PORT=443
NGINX_SSL_CERT_FILENAME=dify.crt
NGINX_SSL_CERT_KEY_FILENAME=dify.key
NGINX_SSL_PROTOCOLS=TLSv1.2 TLSv1.3
NGINX_WORKER_PROCESSES=auto
NGINX_CLIENT_MAX_BODY_SIZE=100M
NGINX_KEEPALIVE_TIMEOUT=65
NGINX_PROXY_READ_TIMEOUT=3600s
NGINX_PROXY_SEND_TIMEOUT=3600s
NGINX_ENABLE_CERTBOT_CHALLENGE=false
NGINX_SOCKET_IO_UPSTREAM=api_websocket:5001
EXPOSE_NGINX_PORT=8082
EXPOSE_NGINX_SSL_PORT=8443
COMPOSE_PROFILES=${VECTOR_STORE:-weaviate},${DB_TYPE:-postgresql},collaboration
@@ -0,0 +1,260 @@
# ------------------------------------------------------------------
# Essential defaults for Docker Compose deployments.
# Only include variables required for services to start.
#
# For a default deployment, copy this file to .env and run:
# docker compose up -d
#
# Optional and provider-specific variables live under docker/envs/.
# Copy an optional *.env.example file beside itself without the
# .example suffix when you need those advanced settings.
# Values in docker/.env take precedence over docker/envs/*.env files.
# ------------------------------------------------------------------
# Core service URLs
CONSOLE_API_URL=
SERVER_CONSOLE_API_URL=http://api:5001
CONSOLE_WEB_URL=
SERVICE_API_URL=
TRIGGER_URL=http://localhost
APP_API_URL=
APP_WEB_URL=
FILES_URL=
INTERNAL_FILES_URL=
ENDPOINT_URL_TEMPLATE=http://localhost/e/{hook_id}
NEXT_PUBLIC_SOCKET_URL=ws://localhost
# Runtime and security
LANG=C.UTF-8
LC_ALL=C.UTF-8
PYTHONIOENCODING=utf-8
UV_CACHE_DIR=/tmp/.uv-cache
# Leave empty to auto-generate a persistent key in the storage directory.
SECRET_KEY=
INIT_PASSWORD=
DEPLOY_ENV=PRODUCTION
CHECK_UPDATE_URL=https://updates.dify.ai
OPENAI_API_BASE=https://api.openai.com/v1
MIGRATION_ENABLED=true
FILES_ACCESS_TIMEOUT=300
# Remove `collaboration` from COMPOSE_PROFILES to stop the dedicated websocket service.
ENABLE_COLLABORATION_MODE=true
# Logging and server workers
LOG_LEVEL=INFO
LOG_OUTPUT_FORMAT=text
LOG_FILE=/app/logs/server.log
LOG_FILE_MAX_SIZE=20
LOG_FILE_BACKUP_COUNT=5
LOG_DATEFORMAT=%Y-%m-%d %H:%M:%S
LOG_TZ=UTC
DEBUG=false
FLASK_DEBUG=false
ENABLE_REQUEST_LOGGING=False
DIFY_BIND_ADDRESS=0.0.0.0
DIFY_PORT=5001
SERVER_WORKER_AMOUNT=1
SERVER_WORKER_CLASS=gevent
SERVER_WORKER_CONNECTIONS=10
API_WEBSOCKET_WORKER_CLASS=geventwebsocket.gunicorn.workers.GeventWebSocketWorker
API_WEBSOCKET_WORKER_CONNECTIONS=1000
API_WEBSOCKET_GUNICORN_TIMEOUT=360
GUNICORN_TIMEOUT=360
CELERY_WORKER_CLASS=
CELERY_WORKER_AMOUNT=4
CELERY_AUTO_SCALE=false
CELERY_MAX_WORKERS=
CELERY_MIN_WORKERS=
COMPOSE_WORKER_HEALTHCHECK_DISABLED=true
COMPOSE_WORKER_HEALTHCHECK_INTERVAL=30s
COMPOSE_WORKER_HEALTHCHECK_TIMEOUT=30s
# Database
DB_TYPE=postgresql
DB_USERNAME=postgres
DB_PASSWORD=difyai123456
DB_HOST=db_postgres
DB_PORT=5432
DB_DATABASE=dify
SQLALCHEMY_POOL_SIZE=30
SQLALCHEMY_MAX_OVERFLOW=10
SQLALCHEMY_POOL_RECYCLE=3600
SQLALCHEMY_ECHO=false
SQLALCHEMY_POOL_PRE_PING=false
SQLALCHEMY_POOL_USE_LIFO=false
SQLALCHEMY_POOL_TIMEOUT=30
SQLALCHEMY_POOL_RESET_ON_RETURN=rollback
PGDATA=/var/lib/postgresql/data/pgdata
POSTGRES_MAX_CONNECTIONS=200
POSTGRES_SHARED_BUFFERS=128MB
POSTGRES_WORK_MEM=4MB
POSTGRES_MAINTENANCE_WORK_MEM=64MB
POSTGRES_EFFECTIVE_CACHE_SIZE=4096MB
POSTGRES_STATEMENT_TIMEOUT=0
POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT=0
# Redis and Celery
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_USERNAME=
REDIS_PASSWORD=difyai123456
REDIS_USE_SSL=false
REDIS_SSL_CERT_REQS=CERT_NONE
REDIS_SSL_CA_CERTS=
REDIS_SSL_CERTFILE=
REDIS_SSL_KEYFILE=
REDIS_DB=0
REDIS_KEY_PREFIX=
REDIS_MAX_CONNECTIONS=
REDIS_RETRY_RETRIES=3
REDIS_RETRY_BACKOFF_BASE=1.0
REDIS_RETRY_BACKOFF_CAP=10.0
REDIS_SOCKET_TIMEOUT=5.0
REDIS_SOCKET_CONNECT_TIMEOUT=5.0
REDIS_HEALTH_CHECK_INTERVAL=30
CELERY_BROKER_URL=redis://:difyai123456@redis:6379/1
CELERY_BACKEND=redis
BROKER_USE_SSL=false
CELERY_TASK_ANNOTATIONS=null
EVENT_BUS_REDIS_URL=
EVENT_BUS_REDIS_CHANNEL_TYPE=pubsub
EVENT_BUS_REDIS_USE_CLUSTERS=false
EVENT_BUS_LISTENER_JOIN_TIMEOUT_MS=2000
# Web and app limits
WEB_API_CORS_ALLOW_ORIGINS=*
CONSOLE_CORS_ALLOW_ORIGINS=*
COOKIE_DOMAIN=
NEXT_PUBLIC_COOKIE_DOMAIN=
NEXT_PUBLIC_BATCH_CONCURRENCY=5
API_SENTRY_DSN=
API_SENTRY_TRACES_SAMPLE_RATE=1.0
API_SENTRY_PROFILES_SAMPLE_RATE=1.0
WEB_SENTRY_DSN=
AMPLITUDE_API_KEY=
TEXT_GENERATION_TIMEOUT_MS=60000
CSP_WHITELIST=
ALLOW_EMBED=false
ALLOW_INLINE_STYLES=false
ALLOW_UNSAFE_DATA_SCHEME=false
TOP_K_MAX_VALUE=10
INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000
LOOP_NODE_MAX_COUNT=100
MAX_TOOLS_NUM=10
MAX_PARALLEL_LIMIT=10
MAX_ITERATIONS_NUM=99
MAX_TREE_DEPTH=50
ENABLE_WEBSITE_JINAREADER=true
ENABLE_WEBSITE_FIRECRAWL=true
ENABLE_WEBSITE_WATERCRAWL=true
NEXT_PUBLIC_ENABLE_SINGLE_DOLLAR_LATEX=false
EXPERIMENTAL_ENABLE_VINEXT=false
# Storage and default vector store
STORAGE_TYPE=opendal
OPENDAL_SCHEME=fs
OPENDAL_FS_ROOT=storage
VECTOR_STORE=weaviate
VECTOR_INDEX_NAME_PREFIX=Vector_index
WEAVIATE_ENDPOINT=http://weaviate:8080
WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih
WEAVIATE_GRPC_ENDPOINT=grpc://weaviate:50051
WEAVIATE_TOKENIZATION=word
WEAVIATE_PERSISTENCE_DATA_PATH=/var/lib/weaviate
WEAVIATE_QUERY_DEFAULTS_LIMIT=25
WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true
WEAVIATE_DEFAULT_VECTORIZER_MODULE=none
WEAVIATE_CLUSTER_HOSTNAME=node1
WEAVIATE_AUTHENTICATION_APIKEY_ENABLED=true
WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih
WEAVIATE_AUTHENTICATION_APIKEY_USERS=hello@dify.ai
WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED=true
WEAVIATE_AUTHORIZATION_ADMINLIST_USERS=hello@dify.ai
WEAVIATE_DISABLE_TELEMETRY=false
WEAVIATE_ENABLE_TOKENIZER_GSE=false
WEAVIATE_ENABLE_TOKENIZER_KAGOME_JA=false
WEAVIATE_ENABLE_TOKENIZER_KAGOME_KR=false
# Sandbox and SSRF proxy
CODE_EXECUTION_ENDPOINT=http://sandbox:8194
CODE_EXECUTION_API_KEY=dify-sandbox
CODE_EXECUTION_SSL_VERIFY=True
CODE_EXECUTION_POOL_MAX_CONNECTIONS=100
CODE_EXECUTION_POOL_MAX_KEEPALIVE_CONNECTIONS=20
CODE_EXECUTION_POOL_KEEPALIVE_EXPIRY=5.0
CODE_EXECUTION_CONNECT_TIMEOUT=10
CODE_EXECUTION_READ_TIMEOUT=60
CODE_EXECUTION_WRITE_TIMEOUT=10
SANDBOX_API_KEY=dify-sandbox
SANDBOX_GIN_MODE=release
SANDBOX_WORKER_TIMEOUT=15
SANDBOX_ENABLE_NETWORK=true
SANDBOX_HTTP_PROXY=http://ssrf_proxy:3128
SANDBOX_HTTPS_PROXY=http://ssrf_proxy:3128
SANDBOX_PORT=8194
PIP_MIRROR_URL=
SSRF_PROXY_HTTP_URL=http://ssrf_proxy:3128
SSRF_PROXY_HTTPS_URL=http://ssrf_proxy:3128
SSRF_HTTP_PORT=3128
SSRF_COREDUMP_DIR=/var/spool/squid
SSRF_REVERSE_PROXY_PORT=8194
SSRF_SANDBOX_HOST=sandbox
SSRF_DEFAULT_TIME_OUT=5
SSRF_DEFAULT_CONNECT_TIME_OUT=5
SSRF_DEFAULT_READ_TIME_OUT=5
SSRF_DEFAULT_WRITE_TIME_OUT=5
SSRF_POOL_MAX_CONNECTIONS=100
SSRF_POOL_MAX_KEEPALIVE_CONNECTIONS=20
SSRF_POOL_KEEPALIVE_EXPIRY=5.0
# Plugin daemon
DB_PLUGIN_DATABASE=dify_plugin
EXPOSE_PLUGIN_DAEMON_PORT=5002
PLUGIN_DAEMON_PORT=5002
PLUGIN_DAEMON_KEY=lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi
PLUGIN_DAEMON_URL=http://plugin_daemon:5002
PLUGIN_MAX_PACKAGE_SIZE=52428800
PLUGIN_MODEL_SCHEMA_CACHE_TTL=3600
PLUGIN_PPROF_ENABLED=false
PLUGIN_DEBUGGING_HOST=0.0.0.0
PLUGIN_DEBUGGING_PORT=5003
EXPOSE_PLUGIN_DEBUGGING_HOST=localhost
EXPOSE_PLUGIN_DEBUGGING_PORT=5003
PLUGIN_DIFY_INNER_API_KEY=QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1
PLUGIN_DIFY_INNER_API_URL=http://api:5001
FORCE_VERIFYING_SIGNATURE=true
PLUGIN_STDIO_BUFFER_SIZE=1024
PLUGIN_STDIO_MAX_BUFFER_SIZE=5242880
PLUGIN_PYTHON_ENV_INIT_TIMEOUT=120
PLUGIN_MAX_EXECUTION_TIMEOUT=600
PLUGIN_STORAGE_TYPE=local
PLUGIN_STORAGE_LOCAL_ROOT=/app/storage
PLUGIN_WORKING_PATH=/app/storage/cwd
PLUGIN_INSTALLED_PATH=plugin
PLUGIN_PACKAGE_CACHE_PATH=plugin_packages
PLUGIN_MEDIA_CACHE_PATH=assets
PLUGIN_STORAGE_OSS_BUCKET=
PLUGIN_SENTRY_ENABLED=false
PLUGIN_SENTRY_DSN=
MARKETPLACE_ENABLED=true
MARKETPLACE_API_URL=https://marketplace.dify.ai
MARKETPLACE_URL=
# Nginx and Docker Compose
NGINX_SERVER_NAME=_
NGINX_HTTPS_ENABLED=false
NGINX_PORT=80
NGINX_SSL_PORT=443
NGINX_SSL_CERT_FILENAME=dify.crt
NGINX_SSL_CERT_KEY_FILENAME=dify.key
NGINX_SSL_PROTOCOLS=TLSv1.2 TLSv1.3
NGINX_WORKER_PROCESSES=auto
NGINX_CLIENT_MAX_BODY_SIZE=100M
NGINX_KEEPALIVE_TIMEOUT=65
NGINX_PROXY_READ_TIMEOUT=3600s
NGINX_PROXY_SEND_TIMEOUT=3600s
NGINX_ENABLE_CERTBOT_CHALLENGE=false
NGINX_SOCKET_IO_UPSTREAM=api_websocket:5001
EXPOSE_NGINX_PORT=80
EXPOSE_NGINX_SSL_PORT=443
COMPOSE_PROFILES=${VECTOR_STORE:-weaviate},${DB_TYPE:-postgresql},collaboration
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,485 @@
# ------------------------------
# Shared API/Worker Configuration
# ------------------------------
CONSOLE_WEB_URL=
SERVICE_API_URL=
TRIGGER_URL=http://localhost
APP_WEB_URL=
FILES_URL=
INTERNAL_FILES_URL=
LANG=C.UTF-8
LC_ALL=C.UTF-8
PYTHONIOENCODING=utf-8
UV_CACHE_DIR=/tmp/.uv-cache
CHECK_UPDATE_URL=https://updates.dify.ai
OPENAI_API_BASE=https://api.openai.com/v1
MIGRATION_ENABLED=true
FILES_ACCESS_TIMEOUT=300
# Remove `collaboration` from COMPOSE_PROFILES to stop the dedicated websocket service.
ENABLE_COLLABORATION_MODE=true
CELERY_BROKER_URL=redis://:difyai123456@redis:6379/1
CELERY_TASK_ANNOTATIONS=null
AZURE_BLOB_ACCOUNT_URL=https://<your_account_name>.blob.core.windows.net
SUPABASE_URL=your-server-url
TIDB_ON_QDRANT_URL=http://127.0.0.1
TIDB_ON_QDRANT_API_KEY=dify
TIDB_API_URL=http://127.0.0.1
TIDB_IAM_API_URL=http://127.0.0.1
TIDB_REGION=regions/aws-us-east-1
TIDB_PROJECT_ID=dify
TIDB_SPEND_LIMIT=100
TENCENT_VECTOR_DB_URL=http://127.0.0.1
TENCENT_VECTOR_DB_API_KEY=dify
LINDORM_URL=http://localhost:30070
LINDORM_USERNAME=admin
UPSTASH_VECTOR_URL=https://xxx-vector.upstash.io
UPLOAD_FILE_SIZE_LIMIT=15
UPLOAD_FILE_BATCH_LIMIT=5
UPLOAD_FILE_EXTENSION_BLACKLIST=
SINGLE_CHUNK_ATTACHMENT_LIMIT=10
IMAGE_FILE_BATCH_LIMIT=10
ATTACHMENT_IMAGE_FILE_SIZE_LIMIT=2
ATTACHMENT_IMAGE_DOWNLOAD_TIMEOUT=60
ETL_TYPE=dify
UNSTRUCTURED_API_URL=
MULTIMODAL_SEND_FORMAT=base64
UPLOAD_IMAGE_FILE_SIZE_LIMIT=10
UPLOAD_VIDEO_FILE_SIZE_LIMIT=100
UPLOAD_AUDIO_FILE_SIZE_LIMIT=50
API_SENTRY_DSN=
API_SENTRY_TRACES_SAMPLE_RATE=1.0
API_SENTRY_PROFILES_SAMPLE_RATE=1.0
WEB_SENTRY_DSN=
PLUGIN_SENTRY_ENABLED=false
PLUGIN_SENTRY_DSN=
NOTION_INTEGRATION_TYPE=public
RESEND_API_URL=https://api.resend.com
SSRF_PROXY_HTTP_URL=http://ssrf_proxy:3128
SSRF_PROXY_HTTPS_URL=http://ssrf_proxy:3128
PGDATA=/var/lib/postgresql/data/pgdata
PLUGIN_MAX_PACKAGE_SIZE=52428800
PLUGIN_MODEL_SCHEMA_CACHE_TTL=3600
PLUGIN_MODEL_PROVIDERS_CACHE_TTL=86400
ENDPOINT_URL_TEMPLATE=http://localhost/e/{hook_id}
LOG_LEVEL=INFO
LOG_OUTPUT_FORMAT=text
LOG_FILE=/app/logs/server.log
LOG_FILE_MAX_SIZE=20
LOG_FILE_BACKUP_COUNT=5
LOG_DATEFORMAT=%Y-%m-%d %H:%M:%S
LOG_TZ=UTC
DEBUG=false
FLASK_DEBUG=false
ENABLE_REQUEST_LOGGING=False
OPS_TRACE_RETRYABLE_DISPATCH_MAX_RETRIES=60
OPS_TRACE_RETRYABLE_DISPATCH_DELAY_SECONDS=5
WORKFLOW_LOG_CLEANUP_ENABLED=false
WORKFLOW_LOG_RETENTION_DAYS=30
WORKFLOW_LOG_CLEANUP_BATCH_SIZE=100
WORKFLOW_LOG_CLEANUP_SPECIFIC_WORKFLOW_IDS=
EXPOSE_PLUGIN_DEBUGGING_HOST=localhost
EXPOSE_PLUGIN_DEBUGGING_PORT=5003
DEPLOY_ENV=PRODUCTION
ACCESS_TOKEN_EXPIRE_MINUTES=60
REFRESH_TOKEN_EXPIRE_DAYS=30
APP_DEFAULT_ACTIVE_REQUESTS=0
APP_MAX_ACTIVE_REQUESTS=0
APP_MAX_EXECUTION_TIME=1200
DIFY_BIND_ADDRESS=0.0.0.0
DIFY_PORT=5001
SERVER_WORKER_AMOUNT=1
SERVER_WORKER_CLASS=gevent
SERVER_WORKER_CONNECTIONS=10
API_WEBSOCKET_WORKER_CLASS=geventwebsocket.gunicorn.workers.GeventWebSocketWorker
API_WEBSOCKET_WORKER_CONNECTIONS=1000
API_WEBSOCKET_GUNICORN_TIMEOUT=360
CELERY_SENTINEL_PASSWORD=
S3_ACCESS_KEY=
S3_SECRET_KEY=
ARCHIVE_STORAGE_ACCESS_KEY=
ARCHIVE_STORAGE_SECRET_KEY=
AZURE_BLOB_ACCOUNT_KEY=difyai
ALIYUN_OSS_ACCESS_KEY=your-access-key
ALIYUN_OSS_SECRET_KEY=your-secret-key
TENCENT_COS_SECRET_KEY=your-secret-key
TENCENT_COS_SECRET_ID=your-secret-id
OCI_ACCESS_KEY=your-access-key
OCI_SECRET_KEY=your-secret-key
HUAWEI_OBS_SECRET_KEY=your-secret-key
HUAWEI_OBS_ACCESS_KEY=your-access-key
VOLCENGINE_TOS_SECRET_KEY=your-secret-key
VOLCENGINE_TOS_ACCESS_KEY=your-access-key
BAIDU_OBS_SECRET_KEY=your-secret-key
BAIDU_OBS_ACCESS_KEY=your-access-key
SUPABASE_API_KEY=your-access-key
ALIBABACLOUD_MYSQL_PASSWORD=difyai123456
RELYT_PASSWORD=difyai123456
LINDORM_PASSWORD=admin
LINDORM_USING_UGC=True
LINDORM_QUERY_TIMEOUT=1
HUAWEI_CLOUD_PASSWORD=admin
UPSTASH_VECTOR_TOKEN=dify
TABLESTORE_ACCESS_KEY_ID=xxx
TABLESTORE_ACCESS_KEY_SECRET=xxx
TABLESTORE_NORMALIZE_FULLTEXT_BM25_SCORE=false
CLICKZETTA_PASSWORD=
CLICKZETTA_INSTANCE=
CLICKZETTA_SERVICE=api.clickzetta.com
CLICKZETTA_WORKSPACE=quick_start
CLICKZETTA_VCLUSTER=default_ap
CLICKZETTA_SCHEMA=dify
CLICKZETTA_BATCH_SIZE=100
CLICKZETTA_ENABLE_INVERTED_INDEX=true
CLICKZETTA_ANALYZER_TYPE=chinese
CLICKZETTA_ANALYZER_MODE=smart
UNSTRUCTURED_API_KEY=
SCARF_NO_ANALYTICS=true
PLUGIN_BASED_TOKEN_COUNTING_ENABLED=false
NOTION_CLIENT_SECRET=
NOTION_CLIENT_ID=
NOTION_INTERNAL_SECRET=
MAIL_TYPE=resend
MAIL_DEFAULT_SEND_FROM=
RESEND_API_KEY=your-resend-api-key
SMTP_SERVER=
SMTP_PORT=465
SMTP_USERNAME=
SMTP_PASSWORD=
SMTP_USE_TLS=true
SMTP_OPPORTUNISTIC_TLS=false
SMTP_LOCAL_HOSTNAME=
SENDGRID_API_KEY=
INVITE_EXPIRY_HOURS=72
RESET_PASSWORD_TOKEN_EXPIRY_MINUTES=5
EMAIL_REGISTER_TOKEN_EXPIRY_MINUTES=5
CHANGE_EMAIL_TOKEN_EXPIRY_MINUTES=5
OWNER_TRANSFER_TOKEN_EXPIRY_MINUTES=5
CODE_EXECUTION_ENDPOINT=http://sandbox:8194
CODE_EXECUTION_API_KEY=dify-sandbox
CODE_EXECUTION_SSL_VERIFY=True
CODE_EXECUTION_POOL_MAX_CONNECTIONS=100
CODE_EXECUTION_POOL_MAX_KEEPALIVE_CONNECTIONS=20
CODE_EXECUTION_POOL_KEEPALIVE_EXPIRY=5.0
CODE_MAX_NUMBER=9223372036854775807
CODE_MIN_NUMBER=-9223372036854775808
CODE_MAX_DEPTH=5
CODE_MAX_PRECISION=20
CODE_MAX_STRING_LENGTH=400000
CODE_MAX_STRING_ARRAY_LENGTH=30
CODE_MAX_OBJECT_ARRAY_LENGTH=30
CODE_MAX_NUMBER_ARRAY_LENGTH=1000
CODE_EXECUTION_CONNECT_TIMEOUT=10
CODE_EXECUTION_READ_TIMEOUT=60
CODE_EXECUTION_WRITE_TIMEOUT=10
TEMPLATE_TRANSFORM_MAX_LENGTH=400000
WORKFLOW_MAX_EXECUTION_STEPS=500
WORKFLOW_MAX_EXECUTION_TIME=1200
WORKFLOW_CALL_MAX_DEPTH=5
MAX_VARIABLE_SIZE=204800
WORKFLOW_FILE_UPLOAD_LIMIT=10
GRAPH_ENGINE_MIN_WORKERS=3
GRAPH_ENGINE_MAX_WORKERS=10
GRAPH_ENGINE_SCALE_UP_THRESHOLD=3
GRAPH_ENGINE_SCALE_DOWN_IDLE_TIME=5.0
ALIYUN_SLS_ACCESS_KEY_ID=
ALIYUN_SLS_ACCESS_KEY_SECRET=
WEBHOOK_REQUEST_BODY_MAX_SIZE=10485760
RESPECT_XFORWARD_HEADERS_ENABLED=false
SSRF_HTTP_PORT=3128
SSRF_COREDUMP_DIR=/var/spool/squid
SSRF_REVERSE_PROXY_PORT=8194
SSRF_SANDBOX_HOST=sandbox
SSRF_DEFAULT_TIME_OUT=5
SSRF_DEFAULT_CONNECT_TIME_OUT=5
SSRF_DEFAULT_READ_TIME_OUT=5
SSRF_DEFAULT_WRITE_TIME_OUT=5
SSRF_POOL_MAX_CONNECTIONS=100
SSRF_POOL_MAX_KEEPALIVE_CONNECTIONS=20
SSRF_POOL_KEEPALIVE_EXPIRY=5.0
PLUGIN_AWS_ACCESS_KEY=
PLUGIN_AWS_SECRET_KEY=
PLUGIN_AWS_REGION=
PLUGIN_TENCENT_COS_SECRET_KEY=
PLUGIN_TENCENT_COS_SECRET_ID=
PLUGIN_ALIYUN_OSS_ACCESS_KEY_ID=
PLUGIN_ALIYUN_OSS_ACCESS_KEY_SECRET=
PLUGIN_VOLCENGINE_TOS_ACCESS_KEY=
PLUGIN_VOLCENGINE_TOS_SECRET_KEY=
OTLP_API_KEY=
OTEL_EXPORTER_OTLP_PROTOCOL=
OTEL_EXPORTER_TYPE=otlp
OTEL_SAMPLING_RATE=0.1
OTEL_BATCH_EXPORT_SCHEDULE_DELAY=5000
OTEL_MAX_QUEUE_SIZE=2048
OTEL_MAX_EXPORT_BATCH_SIZE=512
OTEL_METRIC_EXPORT_INTERVAL=60000
OTEL_BATCH_EXPORT_TIMEOUT=10000
OTEL_METRIC_EXPORT_TIMEOUT=30000
QUEUE_MONITOR_THRESHOLD=200
QUEUE_MONITOR_ALERT_EMAILS=
QUEUE_MONITOR_INTERVAL=30
SWAGGER_UI_ENABLED=false
SWAGGER_UI_PATH=/swagger-ui.html
OPENAPI_ENABLED=false
OPENAPI_CORS_ALLOW_ORIGINS=
OPENAPI_KNOWN_CLIENT_IDS=difyctl
OPENAPI_RATE_LIMIT_PER_TOKEN=60
DEVICE_FLOW_APPROVE_RATE_LIMIT_PER_HOUR=10
ENABLE_OAUTH_BEARER=false
DSL_EXPORT_ENCRYPT_DATASET_ID=true
DATASET_MAX_SEGMENTS_PER_REQUEST=0
ENABLE_CLEAN_EMBEDDING_CACHE_TASK=false
ENABLE_CLEAN_UNUSED_DATASETS_TASK=false
ENABLE_CREATE_TIDB_SERVERLESS_TASK=false
ENABLE_UPDATE_TIDB_SERVERLESS_STATUS_TASK=false
ENABLE_CLEAN_MESSAGES=false
ENABLE_WORKFLOW_RUN_CLEANUP_TASK=false
ENABLE_MAIL_CLEAN_DOCUMENT_NOTIFY_TASK=false
ENABLE_DATASETS_QUEUE_MONITOR=false
ENABLE_CHECK_UPGRADABLE_PLUGIN_TASK=true
ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK=true
WORKFLOW_SCHEDULE_POLLER_INTERVAL=1
WORKFLOW_SCHEDULE_POLLER_BATCH_SIZE=100
WORKFLOW_SCHEDULE_MAX_DISPATCH_PER_TICK=0
TENANT_ISOLATED_TASK_CONCURRENCY=1
ANNOTATION_IMPORT_FILE_SIZE_LIMIT=2
ANNOTATION_IMPORT_MAX_RECORDS=10000
ANNOTATION_IMPORT_MIN_RECORDS=1
ANNOTATION_IMPORT_RATE_LIMIT_PER_MINUTE=5
ANNOTATION_IMPORT_RATE_LIMIT_PER_HOUR=20
ANNOTATION_IMPORT_MAX_CONCURRENT=5
CREATORS_PLATFORM_FEATURES_ENABLED=true
CREATORS_PLATFORM_API_URL=https://creators.dify.ai
CREATORS_PLATFORM_OAUTH_CLIENT_ID=
TIDB_VECTOR_DATABASE=dify
ALIBABACLOUD_MYSQL_HOST=127.0.0.1
ALIBABACLOUD_MYSQL_PORT=3306
ALIBABACLOUD_MYSQL_USER=root
ALIBABACLOUD_MYSQL_DATABASE=dify
ALIBABACLOUD_MYSQL_MAX_CONNECTION=5
ALIBABACLOUD_MYSQL_HNSW_M=6
RELYT_DATABASE=postgres
TENCENT_VECTOR_DB_DATABASE=dify
BAIDU_VECTOR_DB_DATABASE=dify
EXPOSE_PLUGIN_DAEMON_PORT=5002
GUNICORN_TIMEOUT=360
CELERY_WORKER_AMOUNT=
CELERY_AUTO_SCALE=false
CELERY_MAX_WORKERS=
CELERY_MIN_WORKERS=
API_TOOL_DEFAULT_CONNECT_TIMEOUT=10
API_TOOL_DEFAULT_READ_TIMEOUT=60
CELERY_BACKEND=redis
CELERY_USE_SENTINEL=false
CELERY_SENTINEL_MASTER_NAME=
CELERY_SENTINEL_SOCKET_TIMEOUT=0.1
WEB_API_CORS_ALLOW_ORIGINS=*
CONSOLE_CORS_ALLOW_ORIGINS=*
COOKIE_DOMAIN=
OPENDAL_SCHEME=fs
OPENDAL_FS_ROOT=storage
CLICKZETTA_VOLUME_TYPE=user
CLICKZETTA_VOLUME_NAME=
CLICKZETTA_VOLUME_TABLE_PREFIX=dataset_
CLICKZETTA_VOLUME_DIFY_PREFIX=dify_km
S3_ENDPOINT=
S3_REGION=us-east-1
S3_BUCKET_NAME=difyai
S3_ADDRESS_STYLE=auto
S3_USE_AWS_MANAGED_IAM=false
ARCHIVE_STORAGE_ENABLED=false
ARCHIVE_STORAGE_ENDPOINT=
ARCHIVE_STORAGE_ARCHIVE_BUCKET=
ARCHIVE_STORAGE_EXPORT_BUCKET=
ARCHIVE_STORAGE_REGION=auto
AZURE_BLOB_ACCOUNT_NAME=difyai
AZURE_BLOB_CONTAINER_NAME=difyai-container
GOOGLE_STORAGE_BUCKET_NAME=your-bucket-name
GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64=
ALIYUN_OSS_BUCKET_NAME=your-bucket-name
ALIYUN_OSS_ENDPOINT=https://oss-ap-southeast-1-internal.aliyuncs.com
ALIYUN_OSS_REGION=ap-southeast-1
ALIYUN_OSS_AUTH_VERSION=v4
ALIYUN_OSS_PATH=your-path
ALIYUN_CLOUDBOX_ID=your-cloudbox-id
TENCENT_COS_BUCKET_NAME=your-bucket-name
TENCENT_COS_REGION=your-region
TENCENT_COS_SCHEME=your-scheme
TENCENT_COS_CUSTOM_DOMAIN=your-custom-domain
OCI_ENDPOINT=https://your-object-storage-namespace.compat.objectstorage.us-ashburn-1.oraclecloud.com
OCI_BUCKET_NAME=your-bucket-name
OCI_REGION=us-ashburn-1
HUAWEI_OBS_BUCKET_NAME=your-bucket-name
HUAWEI_OBS_SERVER=your-server-url
HUAWEI_OBS_PATH_STYLE=false
VOLCENGINE_TOS_BUCKET_NAME=your-bucket-name
VOLCENGINE_TOS_ENDPOINT=your-server-url
VOLCENGINE_TOS_REGION=your-region
BAIDU_OBS_BUCKET_NAME=your-bucket-name
BAIDU_OBS_ENDPOINT=your-server-url
SUPABASE_BUCKET_NAME=your-bucket-name
TENCENT_VECTOR_DB_TIMEOUT=30
TENCENT_VECTOR_DB_USERNAME=dify
TENCENT_VECTOR_DB_SHARD=1
TENCENT_VECTOR_DB_REPLICAS=2
TENCENT_VECTOR_DB_ENABLE_HYBRID_SEARCH=false
BAIDU_VECTOR_DB_ENDPOINT=http://127.0.0.1:5287
BAIDU_VECTOR_DB_CONNECTION_TIMEOUT_MS=30000
BAIDU_VECTOR_DB_ACCOUNT=root
BAIDU_VECTOR_DB_API_KEY=dify
BAIDU_VECTOR_DB_SHARD=1
BAIDU_VECTOR_DB_REPLICAS=3
BAIDU_VECTOR_DB_INVERTED_INDEX_ANALYZER=DEFAULT_ANALYZER
BAIDU_VECTOR_DB_INVERTED_INDEX_PARSER_MODE=COARSE_MODE
BAIDU_VECTOR_DB_AUTO_BUILD_ROW_COUNT_INCREMENT=500
BAIDU_VECTOR_DB_AUTO_BUILD_ROW_COUNT_INCREMENT_RATIO=0.05
BAIDU_VECTOR_DB_REBUILD_INDEX_TIMEOUT_IN_SECONDS=300
HUAWEI_CLOUD_HOSTS=https://127.0.0.1:9200
HUAWEI_CLOUD_USER=admin
WORKFLOW_NODE_EXECUTION_STORAGE=rdbms
CORE_WORKFLOW_EXECUTION_REPOSITORY=core.repositories.sqlalchemy_workflow_execution_repository.SQLAlchemyWorkflowExecutionRepository
CORE_WORKFLOW_NODE_EXECUTION_REPOSITORY=core.repositories.sqlalchemy_workflow_node_execution_repository.SQLAlchemyWorkflowNodeExecutionRepository
API_WORKFLOW_RUN_REPOSITORY=repositories.sqlalchemy_api_workflow_run_repository.DifyAPISQLAlchemyWorkflowRunRepository
API_WORKFLOW_NODE_EXECUTION_REPOSITORY=repositories.sqlalchemy_api_workflow_node_execution_repository.DifyAPISQLAlchemyWorkflowNodeExecutionRepository
ALIYUN_SLS_ENDPOINT=
ALIYUN_SLS_REGION=
ALIYUN_SLS_PROJECT_NAME=
ALIYUN_SLS_LOGSTORE_TTL=365
LOGSTORE_DUAL_WRITE_ENABLED=false
LOGSTORE_DUAL_READ_ENABLED=true
LOGSTORE_ENABLE_PUT_GRAPH_FIELD=true
HTTP_REQUEST_NODE_MAX_BINARY_SIZE=10485760
HTTP_REQUEST_NODE_MAX_TEXT_SIZE=1048576
HTTP_REQUEST_NODE_SSL_VERIFY=True
HTTP_REQUEST_MAX_CONNECT_TIMEOUT=10
HTTP_REQUEST_MAX_READ_TIMEOUT=600
HTTP_REQUEST_MAX_WRITE_TIMEOUT=600
PLUGIN_INSTALLED_PATH=plugin
PLUGIN_PACKAGE_CACHE_PATH=plugin_packages
PLUGIN_MEDIA_CACHE_PATH=assets
PLUGIN_S3_USE_AWS=false
PLUGIN_S3_USE_AWS_MANAGED_IAM=false
PLUGIN_S3_ENDPOINT=
PLUGIN_S3_USE_PATH_STYLE=false
PLUGIN_AZURE_BLOB_STORAGE_CONTAINER_NAME=
PLUGIN_AZURE_BLOB_STORAGE_CONNECTION_STRING=
PLUGIN_TENCENT_COS_REGION=
PLUGIN_ALIYUN_OSS_REGION=
PLUGIN_ALIYUN_OSS_ENDPOINT=
PLUGIN_ALIYUN_OSS_AUTH_VERSION=v4
PLUGIN_ALIYUN_OSS_PATH=
PLUGIN_VOLCENGINE_TOS_ENDPOINT=
PLUGIN_VOLCENGINE_TOS_REGION=
ENABLE_OTEL=false
OTLP_TRACE_ENDPOINT=
OTLP_METRIC_ENDPOINT=
# Prefix used to create collection name in vector database
OTLP_BASE_ENDPOINT=http://localhost:4318
WEAVIATE_GRPC_ENDPOINT=grpc://weaviate:50051
ANALYTICDB_KEY_ID=your-ak
ANALYTICDB_KEY_SECRET=your-sk
ANALYTICDB_REGION_ID=cn-hangzhou
ANALYTICDB_INSTANCE_ID=gp-ab123456
ANALYTICDB_ACCOUNT=testaccount
ANALYTICDB_PASSWORD=testpassword
ANALYTICDB_NAMESPACE=dify
ANALYTICDB_NAMESPACE_PASSWORD=difypassword
ANALYTICDB_HOST=gp-test.aliyuncs.com
ANALYTICDB_PORT=5432
ANALYTICDB_MIN_CONNECTION=1
ANALYTICDB_MAX_CONNECTION=5
TIDB_VECTOR_HOST=tidb
TIDB_VECTOR_PORT=4000
TIDB_VECTOR_USER=
TIDB_VECTOR_PASSWORD=
TIDB_ON_QDRANT_CLIENT_TIMEOUT=20
TIDB_ON_QDRANT_GRPC_ENABLED=false
TIDB_ON_QDRANT_GRPC_PORT=6334
TIDB_PUBLIC_KEY=dify
TIDB_PRIVATE_KEY=dify
RELYT_HOST=db
RELYT_PORT=5432
RELYT_USER=postgres
VIKINGDB_ACCESS_KEY=your-ak
VIKINGDB_SECRET_KEY=your-sk
VIKINGDB_REGION=cn-shanghai
VIKINGDB_HOST=api-vikingdb.xxx.volces.com
VIKINGDB_SCHEME=http
VIKINGDB_CONNECTION_TIMEOUT=30
VIKINGDB_SOCKET_TIMEOUT=30
TABLESTORE_ENDPOINT=https://instance-name.cn-hangzhou.ots.aliyuncs.com
TABLESTORE_INSTANCE_NAME=instance-name
CLICKZETTA_USERNAME=
CLICKZETTA_VECTOR_DISTANCE_FUNCTION=cosine_distance
COMPOSE_PROFILES=${VECTOR_STORE:-weaviate},${DB_TYPE:-postgresql},collaboration
EXPOSE_NGINX_PORT=80
EXPOSE_NGINX_SSL_PORT=443
POSITION_TOOL_PINS=
POSITION_TOOL_INCLUDES=
POSITION_TOOL_EXCLUDES=
POSITION_PROVIDER_PINS=
POSITION_PROVIDER_INCLUDES=
POSITION_PROVIDER_EXCLUDES=
CREATE_TIDB_SERVICE_JOB_ENABLED=false
MAX_SUBMIT_COUNT=100
# Vector Store Configuration
STORAGE_TYPE=opendal
VECTOR_STORE=weaviate
VECTOR_INDEX_NAME_PREFIX=Vector_index
WEAVIATE_ENDPOINT=http://weaviate:8080
WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih
WEAVIATE_TOKENIZATION=word
OCEANBASE_VECTOR_HOST=oceanbase
OCEANBASE_VECTOR_PORT=2881
OCEANBASE_VECTOR_USER=root@test
OCEANBASE_VECTOR_PASSWORD=difyai123456
OCEANBASE_VECTOR_DATABASE=test
OCEANBASE_ENABLE_HYBRID_SEARCH=false
OCEANBASE_FULLTEXT_PARSER=ik
SEEKDB_MEMORY_LIMIT=2G
QDRANT_URL=http://qdrant:6333
QDRANT_API_KEY=difyai123456
QDRANT_CLIENT_TIMEOUT=20
QDRANT_GRPC_ENABLED=false
QDRANT_GRPC_PORT=6334
QDRANT_REPLICATION_FACTOR=1
MILVUS_URI=http://host.docker.internal:19530
MILVUS_TOKEN=
MILVUS_USER=
MILVUS_PASSWORD=
MILVUS_ANALYZER_PARAMS=
PGVECTOR_HOST=pgvector
PGVECTOR_PORT=5432
PGVECTOR_USER=postgres
PGVECTOR_PASSWORD=difyai123456
PGVECTOR_DATABASE=dify
PGVECTOR_MIN_CONNECTION=1
PGVECTOR_MAX_CONNECTION=5
PGVECTOR_PG_BIGM=false
PGVECTOR_PG_BIGM_VERSION=1.2-20240606
# Hologres Configuration
HOLOGRES_HOST=
HOLOGRES_PORT=80
HOLOGRES_DATABASE=
HOLOGRES_ACCESS_KEY_ID=
HOLOGRES_ACCESS_KEY_SECRET=
HOLOGRES_SCHEMA=public
HOLOGRES_TOKENIZER=jieba
HOLOGRES_DISTANCE_METHOD=Cosine
HOLOGRES_BASE_QUANTIZATION_TYPE=rabitq
HOLOGRES_MAX_DEGREE=64
HOLOGRES_EF_CONSTRUCTION=400
# Milvus API Configuration
MILVUS_DATABASE=
MILVUS_ENABLE_HYBRID_SEARCH=False
# Human Input Task Configuration
ENABLE_HUMAN_INPUT_TIMEOUT_TASK=true
HUMAN_INPUT_TIMEOUT_TASK_INTERVAL=1
# uv cache dir
UV_CACHE_DIR=/tmp/uv_cache
@@ -0,0 +1,42 @@
#!/bin/bash
HTTPS_CONFIG=''
if [ "${NGINX_HTTPS_ENABLED}" = "true" ]; then
# Check if the certificate and key files for the specified domain exist
if [ -n "${CERTBOT_DOMAIN}" ] && \
[ -f "/etc/letsencrypt/live/${CERTBOT_DOMAIN}/${NGINX_SSL_CERT_FILENAME}" ] && \
[ -f "/etc/letsencrypt/live/${CERTBOT_DOMAIN}/${NGINX_SSL_CERT_KEY_FILENAME}" ]; then
SSL_CERTIFICATE_PATH="/etc/letsencrypt/live/${CERTBOT_DOMAIN}/${NGINX_SSL_CERT_FILENAME}"
SSL_CERTIFICATE_KEY_PATH="/etc/letsencrypt/live/${CERTBOT_DOMAIN}/${NGINX_SSL_CERT_KEY_FILENAME}"
else
SSL_CERTIFICATE_PATH="/etc/ssl/${NGINX_SSL_CERT_FILENAME}"
SSL_CERTIFICATE_KEY_PATH="/etc/ssl/${NGINX_SSL_CERT_KEY_FILENAME}"
fi
export SSL_CERTIFICATE_PATH
export SSL_CERTIFICATE_KEY_PATH
# set the HTTPS_CONFIG environment variable to the content of the https.conf.template
HTTPS_CONFIG=$(envsubst < /etc/nginx/https.conf.template)
export HTTPS_CONFIG
# Substitute the HTTPS_CONFIG in the default.conf.template with content from https.conf.template
envsubst '${HTTPS_CONFIG}' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf
fi
export HTTPS_CONFIG
if [ "${NGINX_ENABLE_CERTBOT_CHALLENGE}" = "true" ]; then
ACME_CHALLENGE_LOCATION='location /.well-known/acme-challenge/ { root /var/www/html; }'
else
ACME_CHALLENGE_LOCATION=''
fi
export ACME_CHALLENGE_LOCATION
env_vars=$(printenv | cut -d= -f1 | sed 's/^/$/g' | paste -sd, -)
envsubst "$env_vars" < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
envsubst "$env_vars" < /etc/nginx/proxy.conf.template > /etc/nginx/proxy.conf
envsubst "$env_vars" < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf
# Start Nginx using the default entrypoint
exec nginx -g 'daemon off;'
@@ -0,0 +1,42 @@
#!/bin/bash
# Modified based on Squid OCI image entrypoint
# This entrypoint aims to forward the squid logs to stdout to assist users of
# common container related tooling (e.g., kubernetes, docker-compose, etc) to
# access the service logs.
# Moreover, it invokes the squid binary, leaving all the desired parameters to
# be provided by the "command" passed to the spawned container. If no command
# is provided by the user, the default behavior (as per the CMD statement in
# the Dockerfile) will be to use Ubuntu's default configuration [1] and run
# squid with the "-NYC" options to mimic the behavior of the Ubuntu provided
# systemd unit.
# [1] The default configuration is changed in the Dockerfile to allow local
# network connections. See the Dockerfile for further information.
echo "[ENTRYPOINT] re-create snakeoil self-signed certificate removed in the build process"
if [ ! -f /etc/ssl/private/ssl-cert-snakeoil.key ]; then
/usr/sbin/make-ssl-cert generate-default-snakeoil --force-overwrite > /dev/null 2>&1
fi
tail -F /var/log/squid/access.log 2>/dev/null &
tail -F /var/log/squid/error.log 2>/dev/null &
tail -F /var/log/squid/store.log 2>/dev/null &
tail -F /var/log/squid/cache.log 2>/dev/null &
# Replace environment variables in the template and output to the squid.conf
echo "[ENTRYPOINT] replacing environment variables in the template"
awk '{
while(match($0, /\${[A-Za-z_][A-Za-z_0-9]*}/)) {
var = substr($0, RSTART+2, RLENGTH-3)
val = ENVIRON[var]
$0 = substr($0, 1, RSTART-1) val substr($0, RSTART+RLENGTH)
}
print
}' /etc/squid/squid.conf.template > /etc/squid/squid.conf
/usr/sbin/squid -Nz
echo "[ENTRYPOINT] starting squid"
/usr/sbin/squid -f /etc/squid/squid.conf -NYC 1
@@ -0,0 +1,114 @@
# ============================================================
# Spring AI Alibaba 全功能平台 — 中间件 Docker Compose
# 用途:本地内网一键部署 Nacos + PostgreSQL + MinIO
# 使用:docker compose up -d
# ============================================================
name: agent-platform
services:
# ==========================================
# 1. PostgreSQL 16 + pgvector
# ==========================================
postgres:
image: pgvector/pgvector:pg16
container_name: sa-pg
restart: unless-stopped
environment:
POSTGRES_DB: spring_ai_agent
POSTGRES_USER: sa_agent
POSTGRES_PASSWORD: agent_2026
PGDATA: /var/lib/postgresql/data/pgdata
ports:
- "5432:5432"
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U sa_agent -d spring_ai_agent"]
interval: 10s
timeout: 5s
retries: 5
networks:
- sa-network
# ==========================================
# 2. Nacos 3.x — 服务注册 + 配置中心
# ==========================================
nacos:
image: nacos/nacos-server:v2.5.1
container_name: sa-nacos
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
# Standalone 模式(内网小团队无需集群)
MODE: standalone
# JVM 内存限制(WSL2 15GB 环境)
JVM_XMS: 256m
JVM_XMX: 512m
JVM_XMN: 128m
ports:
- "8848:8848" # HTTP 控制台 + API
- "9848:9848" # gRPCMCP 注册发现)
volumes:
- nacos_data:/home/nacos/data
networks:
- sa-network
# ==========================================
# 3. MinIO — S3 兼容对象存储
# ==========================================
minio:
image: minio/minio:latest
container_name: sa-minio
restart: unless-stopped
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
ports:
- "9000:9000" # S3 API
- "9001:9001" # Web 控制台
volumes:
- minio_data:/data
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 10s
timeout: 5s
retries: 5
networks:
- sa-network
# ==========================================
# 4. MinIO 初始化 — 自动创建 Bucket
# ==========================================
minio-init:
image: minio/mc:latest
container_name: sa-minio-init
depends_on:
minio:
condition: service_healthy
entrypoint: >
/bin/sh -c "
mc alias set local http://minio:9000 minioadmin minioadmin;
mc mb --ignore-existing local/sa-agent-memory;
mc mb --ignore-existing local/sa-agent-datasets;
mc mb --ignore-existing local/sa-agent-skills;
echo 'MinIO buckets created successfully';
"
networks:
- sa-network
volumes:
pg_data:
name: sa_pg_data
nacos_data:
name: sa_nacos_data
minio_data:
name: sa_minio_data
networks:
sa-network:
name: sa-network
driver: bridge
@@ -0,0 +1,63 @@
#!/bin/bash
# ============================================================
# Spring AI Alibaba 全功能平台 — 健康检查脚本
# 用法:bash health-check.sh
# ============================================================
set -e
GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; NC='\033[0m'
pass() { echo -e " ${GREEN}✅ OK${NC} $1"; }
fail() { echo -e " ${RED}❌ FAIL${NC} $1"; }
echo "=============================================="
echo " Spring AI Alibaba 全平台健康检查"
echo " $(date '+%Y-%m-%d %H:%M:%S')"
echo "=============================================="
echo ""
# ---- 中间件 ----
echo "[中间件层]"
psql -h localhost -U sa_agent -d spring_ai_agent -c "SELECT 1" >/dev/null 2>&1 \
&& pass "PostgreSQL (5432)" || fail "PostgreSQL (5432)"
curl -s http://localhost:8848/nacos/v1/console/health/readiness >/dev/null 2>&1 \
&& pass "Nacos (8848)" || fail "Nacos (8848)"
curl -s http://localhost:9000/minio/health/live >/dev/null 2>&1 \
&& pass "MinIO (9000)" || fail "MinIO (9000)"
echo ""
# ---- 应用 ----
echo "[应用层]"
curl -s http://localhost:8080/actuator/health >/dev/null 2>&1 \
&& pass "Agent Platform (8080)" || fail "Agent Platform (8080)"
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/chatui/index.html 2>/dev/null || echo "000")
if [ "$HTTP_CODE" = "200" ]; then
pass "Admin Studio (/chatui)"
else
fail "Admin Studio (/chatui) — HTTP $HTTP_CODE"
fi
echo ""
# ---- 外网模型 ----
echo "[模型层]"
if [ -z "$DASHSCOPE_API_KEY" ]; then
fail "DashScope API Key 未设置"
else
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
"https://dashscope.aliyuncs.com/api/v1/models" 2>/dev/null || echo "000")
if [ "$HTTP_CODE" = "200" ]; then
pass "DashScope API (阿里云百炼)"
else
fail "DashScope API — HTTP $HTTP_CODE"
fi
fi
echo ""
echo "=============================================="
echo " 健康检查完成。"
echo "=============================================="
+111
View File
@@ -0,0 +1,111 @@
#!/bin/bash
# ============================================================
# Spring AI Alibaba 全功能平台 — 一键启动脚本
# 环境:WSL2 Debian · 本地内网
# 用法:bash start.sh
# ============================================================
set -e
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m'
log() { echo -e "${BLUE}[INFO]${NC} $1"; }
ok() { echo -e "${GREEN}[OK]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
err() { echo -e "${RED}[ERR]${NC} $1"; }
echo "=============================================="
echo " Spring AI Alibaba 全功能平台 — 启动脚本"
echo "=============================================="
echo ""
# ---- 1. 环境检查 ----
log "Step 1/5: 检查运行环境..."
if ! command -v docker &>/dev/null; then
err "Docker 未安装。请先执行 Docker 安装步骤。"
echo " 参考: https://docs.docker.com/engine/install/debian/"
exit 1
fi
ok "Docker $(docker --version | awk '{print $3}' | tr -d ',')"
if ! docker compose version &>/dev/null; then
err "Docker Compose 未安装。"
exit 1
fi
ok "Docker Compose 已就绪"
if ! command -v java &>/dev/null; then
err "Java 未安装。需要 JDK 17+。"
exit 1
fi
ok "Java $(java -version 2>&1 | head -1 | awk -F'"' '{print $2}')"
# ---- 2. 检查端口占用 ----
log "Step 2/5: 检查端口占用..."
PORTS=(5432 8848 9848 9000 9001 8080)
OCCUPIED=""
for p in "${PORTS[@]}"; do
if ss -tlnp | grep -q ":$p "; then
OCCUPIED="$OCCUPIED $p"
fi
done
if [ -n "$OCCUPIED" ]; then
warn "以下端口已被占用:$OCCUPIED"
echo " 请先释放这些端口,或修改 docker-compose.yml 中的端口映射。"
echo " 查看占用进程: ss -tlnp | grep -E ':(5432|8848|9000|9001|8080) '"
read -p "是否继续? [y/N] " -n 1 -r; echo
[[ ! $REPLY =~ ^[Yy]$ ]] && exit 1
else
ok "所有端口空闲"
fi
# ---- 3. 启动中间件 ----
log "Step 3/5: 启动中间件 (PostgreSQL + Nacos + MinIO)..."
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$SCRIPT_DIR"
docker compose up -d
echo " 等待 PostgreSQL 就绪..."
until docker compose exec -T postgres pg_isready -U sa_agent &>/dev/null; do sleep 1; done
ok "PostgreSQL 就绪 (5432)"
echo " 等待 Nacos 就绪..."
until curl -s http://localhost:8848/nacos/v1/console/health/readiness &>/dev/null; do sleep 1; done
ok "Nacos 就绪 (8848)"
ok " Nacos 控制台: http://localhost:8848/nacos (nacos/nacos)"
echo " 等待 MinIO 就绪..."
until curl -s http://localhost:9000/minio/health/live &>/dev/null; do sleep 1; done
ok "MinIO 就绪 (9000)"
ok " MinIO 控制台: http://localhost:9001 (minioadmin/minioadmin)"
# ---- 4. Nacos 命名空间初始化 ----
log "Step 4/5: 初始化 Nacos 命名空间..."
NACOS_AUTH="nacos:nacos"
for ns in sa-agent-mcp sa-agent-config sa-agent-a2a; do
curl -s -X POST \
"http://localhost:8848/nacos/v1/console/namespaces" \
-u "$NACOS_AUTH" \
-d "customNamespaceId=$ns&namespaceName=$ns&namespaceDesc=$ns" \
&>/dev/null && ok " 命名空间 $ns 已创建" || warn " 命名空间 $ns 可能已存在"
done
# ---- 5. 应用构建提示 ----
log "Step 5/5: 应用构建..."
echo ""
echo " 中间件已全部就绪!接下来需要构建 Spring AI Alibaba 应用:"
echo ""
echo " cd spring-ai-alibaba-platform"
echo " export DASHSCOPE_API_KEY=sk-your-key-here"
echo " mvn spring-boot:run"
echo ""
echo " 启动后访问: http://localhost:8080/chatui"
echo ""
echo "=============================================="
echo " 服务状态一览"
echo "=============================================="
echo " PostgreSQL : localhost:5432 (sa_agent / agent_2026)"
echo " Nacos : localhost:8848 (nacos / nacos)"
echo " MinIO : localhost:9001 (minioadmin / minioadmin)"
echo " Agent平台 : localhost:8080 启动后可用"
echo "=============================================="
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -71,6 +71,7 @@
<div class="container">
<div class="header">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>需求文档 vs 系统实际功能 对比分析报告</h1>
<p>建设方案 V1(2026年4月) + 新增需求 vs qData 系统实际功能 | 分析日期:2026-05-12</p>
</div>
+2
View File
@@ -70,6 +70,8 @@
</head>
<body>
<a href="../index.html" style="display:block;padding:8px 24px;color:var(--accent);text-decoration:none;font-size:13px;background:var(--card);border-bottom:1px solid var(--border);">← 返回知识库</a>
<div class="hero">
<div class="tag">深 圳 国 际 · 战 略 研 究</div>
<h1>深国际向物流综合服务商转型<br>综合改革方案系列报告</h1>
@@ -120,6 +120,8 @@
</head>
<body>
<a href="../../index.html" style="display:block;padding:8px 24px;color:var(--accent);text-decoration:none;font-size:13px;background:var(--card);border-bottom:1px solid var(--border);">← 返回知识库</a>
<button class="menu-toggle" onclick="document.getElementById('sidebar').classList.toggle('open')"></button>
<div class="page-wrapper">
@@ -73,6 +73,8 @@ tr:nth-child(even) td{background:#f5f7fa}
</head>
<body>
<a href="../../index.html" style="display:block;padding:8px 24px;color:var(--accent);text-decoration:none;font-size:13px;background:var(--card);border-bottom:1px solid var(--border);">← 返回知识库</a>
<button class="menu-toggle" onclick="document.getElementById('sidebar').classList.toggle('open')"></button>
<div class="page-wrapper">
@@ -214,6 +214,8 @@
</head>
<body>
<a href="../../index.html" style="display:block;padding:8px 24px;color:var(--accent);text-decoration:none;font-size:13px;background:var(--card);border-bottom:1px solid var(--border);">← 返回知识库</a>
<button class="menu-toggle" id="menuToggle" onclick="document.getElementById('sidebar').classList.toggle('open')"></button>
<div class="page-wrapper">
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -178,6 +178,7 @@ code {
<header class="header-bar">
<div class="brand">
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>金鹿商城电商小程序 — 需求分析与差异对比报告</h1>
<span class="tagline">基于 CRMEB 现有功能的增量开发评估</span>
</div>