覆盖 27 个此前缺少返回链接的报告页和独立页面(共 50 个 HTML 页,index.html 首页除外) - 标准报告页:header/header-bar 内插入 back-link - 特殊页面:深国际、中医馆、YqBoot、交互式演示等单独适配 - 统一文案「← 返回知识库」,URL 按目录深度自动推算
This commit is contained in:
+512
@@ -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 Core(LLM)
|
||||
│
|
||||
├─ 规划(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-large(OpenAI)、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
@@ -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 Core(LLM)→ 规划(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-large(OpenAI)、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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">需求分析对比报告 · 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>
|
||||
|
||||
BIN
Binary file not shown.
+301
-588
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">⏱ 约 12–15 分钟</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:00–0: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:10–0: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:20–0: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:34–0: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:50–0: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:64–0: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 6–7</td>
|
||||
<td>客户预期一旦上去就回不来,下个采购季就是分水岭。</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>②</td>
|
||||
<td><strong>岗位边界消失</strong></td>
|
||||
<td>2 min</td>
|
||||
<td>Beat 1–2</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>
|
||||
|
||||
@@ -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 IP:172.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>
|
||||
<!-- ===== 核心 AI(DashScope 百炼)===== -->
|
||||
<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 Schema(Studio 所需)===== -->
|
||||
<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
|
||||
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
artifactId=agent-platform
|
||||
groupId=com.demo
|
||||
version=1.0.0
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
com/demo/agent/ChatController.class
|
||||
com/demo/agent/StudioDemoConfig.class
|
||||
com/demo/agent/AgentPlatformApplication.class
|
||||
+3
@@ -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
|
||||
@@ -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
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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" # gRPC(MCP 注册发现)
|
||||
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 "=============================================="
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user