1. 引言:为什么需要知识库与 Skills 链协同
在大型语言模型(LLM)应用开发中,我们经常面临两个核心痛点:
- 上下文不稳定——每次对话都要重新组织背景信息,效率低且容易遗漏
- 任务执行不可控——LLM 的自由发挥无法保证步骤的完整性与结果的确定性
解决方案是分层解耦:用知识库提供稳定的、结构化的上下文,用 Skills 链将复杂任务拆解为可复用、可约束、可检查的执行单元,再通过流程编排引擎把它们串联起来。
本文将深入探讨这套架构的设计思路与实现要点。
2. 知识库设计:不只是向量检索
2.1 知识库的语义分层
传统知识库往往被简化为“文档切片 + 向量检索”,但作为 LLM 的上下文提供者,知识库需要更丰富的语义类型:
| 存储层 | 内容类型 | 典型用途 | 检索方式 |
|---|---|---|---|
| 长期记忆 | 用户偏好、历史决策、领域术语 | 个性化上下文 | 键值匹配 + 向量检索 |
| 领域知识 | 业务规则、技术文档、FAQ | 问题解答、约束校验 | 向量检索 + 关键词图谱 |
| 运行时状态 | 当前会话的中间变量、技能输出缓存 | 链式传递上下文 | Session Store 直接读取 |
2.2 上下文注入策略
[用户输入]
│
├── 长期记忆匹配 → [用户偏好片段]
├── 领域知识检索 → [Top-K 相关文档]
└── 运行时状态读取 → [上一步技能输出]
│
▼
[拼接为系统提示词注入 LLM]
关键在于 注入优先级:运行时状态 > 长期记忆 > 领域知识。因为越靠近当前任务的上下文,对决策的影响越直接。
3. Skills 链:原子化任务单元
3.1 Skill 的定义模型
每个 Skill 是一个自包含的执行单元,包含三个核心要素:
class SkillDefinition:
name: str # 技能名称,如 "extract_entities"
description: str # 功能描述,用于 LLM 路由选择
input_schema: dict # 输入参数的 JSON Schema
output_schema: dict # 输出格式的 JSON Schema
preconditions: list # 前置条件:需要的上下文或状态
execution: callable # 具体执行逻辑(LLM 调用 / API / 脚本)
post_checks: list # 后置校验:对输出进行格式与内容检查
3.2 可约束与可检查的设计
可约束通过 input_schema 与 preconditions 实现:
- 每个 Skill 声明自己的输入类型与前置依赖,流程编排引擎在调用前自动校验
- 不满足约束的调用会被提前拦截,而非让 LLM 自由发挥后才发现问题
可检查通过 post_checks 实现:
post_checks = [
lambda output: 10 <= len(output.get("keywords", [])) <= 20,
lambda output: all(isinstance(k, str) for k in output["keywords"]),
lambda output: output.get("confidence", 0) >= 0.7
]
任何检查不通过,Skill 返回结构化错误而非吞掉异常,让下游 Skill 可以做出降级处理。
4. 流程编排:DSL 定义与执行引擎
4.1 编排 DSL 设计
为了让业务流程可读、可维护、可版本控制,我们定义一套声明式的编排语言:
pipeline: content_generation_pipeline
version: "1.0"
context:
- long_term_memory: [user_preferences]
- domain_knowledge: [style_guide, compliance_rules]
steps:
- id: topic_research
skill: search_relevant_docs
input:
query: "{{user_request}}"
top_k: 5
output_as: research_material
- id: outline_generation
skill: generate_outline
input:
topic: "{{user_request}}"
references: "{{research_material.summaries}}"
style_constraints: "{{domain_knowledge.style_guide}}"
output_as: outline
post_check:
- "len(outline.sections) >= 3"
- "outline.total_estimated_words >= 1000"
- id: draft_writing
skill: write_section
input:
section: "{{item}}"
context: "{{research_material.raw_docs}}"
loop: "{{outline.sections}}"
output_as: draft_sections
- id: review_and_polish
skill: review_content
input:
draft: "{{draft_sections}}"
rules: "{{domain_knowledge.compliance_rules}}"
output_as: final_output
4.2 执行引擎核心逻辑
class PipelineEngine:
def __init__(self, skill_registry, knowledge_base):
self.skill_registry = skill_registry
self.knowledge_base = knowledge_base
def execute(self, pipeline: Pipeline, context: dict):
state = context.copy()
for step in pipeline.steps:
# 1. 加载 Skill 定义
skill = self.skill_registry.get(step.skill)
# 2. 注入知识库上下文
enriched_state = self.knowledge_base.enrich(
state,
step.context_requirements
)
# 3. 校验前置条件
if not self.check_preconditions(skill, enriched_state):
raise PipelineError(f"前置条件不满足: {step.id}")
# 4. 解析输入(支持模板变量与循环)
resolved_input = self.resolve_input(step, enriched_state)
# 5. 执行 Skill
output = skill.execute(resolved_input)
# 6. 后置校验
if not self.check_post_conditions(skill, output):
self.handle_failure(step, output)
continue
# 7. 将输出写入状态
state[step.output_as] = output
return state["final_output"]
4.3 循环与条件分支
对于需要批量处理的场景,编排引擎支持循环绑定:
- id: batch_analyze
skill: analyze_feedback
input:
feedback: "{{item}}"
context: "{{knowledge_base.product_info}}"
loop: "{{raw_feedback_list}}"
output_as: analyzed_results
max_concurrency: 5
同时也支持条件分支,根据前置 Skill 的输出决定下一步路由:
- id: quality_gate
skill: evaluate_quality
input:
content: "{{draft_sections}}"
output_as: quality_report
- id: human_review
skill: request_human_review
condition: "quality_report.score < 0.8"
input:
content: "{{draft_sections}}"
reason: "{{quality_report.details}}"
- id: auto_publish
skill: publish_content
condition: "quality_report.score >= 0.8"
input:
content: "{{draft_sections}}"
5. 可开发性保障:从脚本到平台
5.1 Skills Registry —— 技能的“应用商店”
将 Skills 注册到统一管理中心:
# skills/extract_keywords.py
@register_skill(
name="extract_keywords",
category="text_analysis",
input_schema={
"type": "object",
"properties": {
"text": {"type": "string"},
"max_keywords": {"type": "integer", "default": 20}
},
"required": ["text"]
}
)
def extract_keywords(text: str, max_keywords: int = 20) -> dict:
# 具体实现:调用 LLM 或本地模型
...
所有注册的 Skill 可以通过管理面板查看、测试、版本管理,非技术人员也能通过合适的 UI 拖拽编排流程。
5.2 调试与可观测性
每个步骤的执行日志自动记录:
{
"pipeline_id": "content_gen_20260702_001",
"step_id": "outline_generation",
"started_at": "2026-07-02T15:07:23Z",
"completed_at": "2026-07-02T15:07:45Z",
"input_summary": "用户请求: 写一篇关于云原生的文章",
"output_summary": "大纲含5个章节",
"knowledge_sources": ["kb_doc_042", "user_pref_v2"],
"post_check_results": {
"sections_count": {"passed": true, "value": 5},
"word_count": {"passed": true, "value": 1200}
},
"status": "success"
}
所有日志可回溯,方便定位哪个步骤的哪个 Skill 输出不满足预期。
5.3 开发工具链
提供配套的 CLI 和 IDE 插件:
# 初始化技能项目
skills init my-content-pipeline
# 本地运行编排流程
skills run pipeline.yaml --watch
# 验证 Skill 定义是否符合规范
skills validate
# 导出流程为可视化图表
skills visualize pipeline.yaml --output flowchart.svg
在 VS Code 或 JetBrains IDE 中,安装插件后可获得 YAML 编排文件的自动补全、Skill input/output schema 的内联提示,以及一键本地调试的能力。
6. 实战案例:技术博客自动生成
把前面的设计串联起来,一个完整的技术博客生成流程如下:
flowchart TD
A["用户输入:写一篇关于 Docker 的部署教程"] --> B["知识库检索"]
B --> C["Skill: 提取关键词"]
C --> D["Skill: 搜索相关资料"]
D --> E["Skill: 生成大纲"]
E --> F{"大纲质量检查"}
F -->|分值 ≥ 0.8| G["Skill: 逐节撰写"]
F -->|分值 < 0.8| H["Skill: 大纲修正"]
H --> E
G --> I["Skill: 全文审校"]
I --> J{"合规检查"}
J -->|通过| K["输出 Markdown 正文"]
J -->|不通过| L["Skill: 违规段落修正"]
L --> I
- 知识库在这一流程中持续提供领域文档、风格指南与合规规则
- Skills 链把生成任务拆为提取关键词、搜索资料、生成大纲、逐节撰写、审校五个原子步骤
- 流程编排通过质量门与合规检查两个条件分支,确保最终输出达到质量标准
7. 结语:可组合的智能体架构
知识库 + Skills 链 + 流程编排引擎,三者共同构成了一个可开发、可演进、可复用的智能体架构基础。
- 知识库负责“知道什么”——提供稳定、可检索的背景知识
- Skills 链负责“会做什么”——把能力封装为输入输出可约束的原子单元
- 流程编排引擎负责“如何串联”——通过声明式 DSL 与控制流,让复杂任务变得透明可控
核心价值在于:让 AI 应用的开发从“提示词试错”走向“工程化落地”。