news 2026/9/7 6:11:38

Understand-Anything YAML 语言上下文片段解析:yaml.md 如何引导 LLM 把 YAML 文件映射进知识图谱

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Understand-Anything YAML 语言上下文片段解析:yaml.md 如何引导 LLM 把 YAML 文件映射进知识图谱

Understand-Anything YAML 语言上下文片段解析:yaml.md 如何引导 LLM 把 YAML 文件映射进知识图谱

【免费下载链接】Understand-AnythingGraphs that teach > graphs that impress. Turn any code into an interactive knowledge graph you can explore, search, and ask questions about. Works with Claude Code, Codex, Cursor, Copilot, Gemini CLI, and more.项目地址: https://gitcode.com/GitHub_Trending/un/Understand-Anything

/understand技能在 Phase 4(架构识别)阶段会把languages/<language-id>.md提示片段注入 architecture-analyzer 子代理的 prompt。本文以 yaml.md 为主体,完整拆解这份 YAML 语言上下文片段定义的八项关键概念、七类文件模式、四条边模式与三种摘要风格,并结合仓库中的语言配置(yaml.ts)、YAML 解析器(yaml-parser.ts)与 agent 定义(architecture-analyzer.md、file-analyzer.md),说明这些提示文本最终如何落到knowledge-graph.json中的config/service/pipeline/resource节点与configures/triggers/deploys/provisions边上。

注入机制:yaml.md 在 /understand 流水线中的位置

SKILL.md 定义了七阶段流水线。Phase 1 SCAN 阶段由 project-scanner 子代理检测项目语言与框架;进入 Phase 4 ARCHITECTURE 后,主会话按规则拼装 architecture-analyzer 的 prompt,其中"Language context injection"一节的原文是:

For each language detected in Phase 1 (e.g.,python,markdown,dockerfile,yaml,sql,terraform,graphql,protobuf,shell,html,css), read the file at./languages/<language-id>.mdand append its content after the base template under a## Language Contextheader. …Include non-code language snippets— they provide edge patterns and summary styles for non-code files.

也就是说:只要项目里检测到yaml,yaml.md 的全文就会被原样追加到 architecture-analyzer.md 基础模板之后,成为 LLM 划分架构层时的领域知识。它不是可执行代码,而是一份"语言知识卡",教 LLM 三件事:

  1. 读什么——YAML 文件的哪些语法结构值得关注(Key Concepts);
  2. 找什么文件——哪些命名模式的 YAML 文件对应容器、CI/CD、K8s 等基础设施语义(Notable File Patterns);
  3. 连什么边——YAML 文件与被它控制的代码之间应建立什么类型的关系边(Edge Patterns),以及产出的 summary 应长什么样(Summary Style)。

Key Concepts:八项关键概念及其对图谱构建的意义

原文档的 Key Concepts 一节列出了八个概念,这里逐项展开,并对照源码说明它们为什么重要。

概念说明对图谱构建的意义
缩进嵌套基于空白的层级结构,只用空格、禁止 TabYAML 的"结构"就是缩进。YAMLConfigParser 只提取顶层 key 作为 section,正是利用了顶层 key 零缩进这一特征
锚点与别名&anchor定义可复用块,*anchor引用它K8s / CI 配置常用锚点去重,识别别名有助于把展开后的内容归因到原始定义处
合并键<<: *anchor把锚点内容合并进当前 mappingGitHub Actions 的defaults、K8s 的公共 spec 常依赖它,理解合并语义才能准确总结文件
多行字符串字面块\|保留换行,折叠块>合并行脚本内联(CI 的run:字段、Terraform 注解)多为多行字符串,是 pipeline 语义的主要载体
文档分隔符---开始新文档、...结束一个(多文档流)K8s 清单与 CloudFormation 常用---拼接多个资源为单文件,解析器必须按文档流理解
标签与类型!!str!!int!!bool显式类型;自定义标签用于应用内建类型显式类型声明影响值的语义解释(如把"true"当字符串还是布尔)
流式风格类 JSON 的行内语法{key: value}[item1, item2]紧凑写法出现在 compose/K8s 的 ports、env 等字段中,影响顶层 key 定位的正则匹配
环境变量替换${VAR}模式,常见于 docker-compose 与 CI 配置说明值在分析时可能是"未定"的,总结时应描述"引用了环境变量"而非断言具体值

这八项概念在运行时并非装饰:yaml-parser.ts 的注释明确提到 GitHub Actions 中on是 YAML 1.1 保留字,常写作带引号的"on": push,因此解析器在定位顶层 key 时同时匹配普通与加引号的写法(见下文)。可以说 Key Concepts 一节与解析器的边界处理相互印证。

Notable File Patterns:七类标志性 YAML 文件及其识别依据

原文档列出的七类文件模式,恰好覆盖了一个典型全栈项目的全部基础设施面:

文件模式语义仓库中的识别依据
docker-compose.yml/docker-compose.yaml多容器应用定义docker-compose.ts 以filenames精确匹配docker-compose.ymlcompose.yml等文件名(而非扩展名),概念表含servicesnetworksvolumesportsdepends_onhealthchecks
.github/workflows/*.ymlGitHub Actions CI/CD 工作流github-actions.ts 的filePatterns.config.github/workflows/*.yml,概念含workflowsjobsstepstriggersmatrix strategy
.gitlab-ci.ymlGitLab CI/CD 流水线architecture-analyzer.md 的目录模式表中.gitlab归为ci-cd,文件模式表中.gitlab-ci.ymlJenkinsfile归为ci-cd
kubernetes/*.yaml/k8s/*.yamlKubernetes 资源清单kubernetes.ts 的filePatterns.configk8s/*.yamlkubernetes/*.yaml,概念含deploymentsservicespodsingressnamespaces
*.config.yaml应用配置文件兜底模式,归为config节点
mkdocs.ymlMkDocs 文档站配置文档构建配置,通常落入文档/构建层
serverless.ymlServerless Framework 配置函数计算部署定义

这里有一个值得注意的实现细节:kubernetes.ts 中的 TODO 注释说明,Kubernetes 清单没有独特扩展名或文件名,"检测需要基于内容或路径模式的启发式(例如检查 YAML 中的apiVersion/kind字段,或匹配k8s/kubernetes/deploy/路径)。当前这些文件会按扩展名(.yaml/.yml)匹配到yamlConfig"。也就是说,从源码结构看,当前版本里一个deploy/xxx.yaml的 K8s 清单在语言识别阶段会被归为yaml;yaml.md 片段的作用正在于此——它告诉 LLM"即使语言是 yaml,看到kubernetes/路径或apiVersion/kind字段就应按 K8s 语义理解,并给出service/resource节点与deploys/provisions边",弥补了确定性检测的不足。

Edge Patterns:YAML 文件的四条边规则及其权重

原文档 Edge Patterns 一节的核心命题是:YAML 不是孤立文件,它"作用于"代码。四条边模式原文如下:

  • YAML 配置文件configures它所控制的代码模块(例如数据库配置影响数据层)
  • CI/CD YAML 文件triggers构建与部署流水线
  • docker-compose YAMLdeploys服务,并depends_onDockerfile
  • Kubernetes YAMLdeploysprovisions应用服务

这四条不是孤立的口号,它们在 file-analyzer.md 的"Edges for non-code files"边表中都有严格对应,每条边都有规定权重:

边类型触发条件(file-analyzer 原文摘要)权重
configures配置文件影响某个代码文件或模块(如tsconfig.json配置 TS 编译、.env配置运行时)0.6
triggersCI/CD 配置触发流水线或部署(如 GitHub Actions 在 push main 时部署)0.6
deploys基础设施文件构建/部署代码(如 Dockerfile 拷贝并运行应用代码、K8s 清单部署服务)0.7
depends_on非代码文件依赖另一个文件(如 docker-compose 依赖 Dockerfile、CI 工作流依赖 Makefile 目标)0.6
provisionsTerraform 资源/模块创建基础设施(如创建数据库、开通 VM)0.7
servesK8s Service/Deployment 暴露端点,或反向代理路由到服务0.7

SKILL.md 的"Edge Weight Conventions"参考表给出了同一套权重(deploys0.7、configures/triggers/depends_on0.6、provisions/serves0.5~0.7 档),保证 file-analyzer 产出的边与最终图谱的权重体系一致。file-analyzer 还配了专门的"Edge Signal Quick Reference"提示表,例如"Dockerfile COPY 自代码目录 →deploys边指向代码入口"、"docker-compose 引用 Dockerfile → compose 到 Dockerfile 的depends_on"、"CI 配置运行测试命令 → CI 配置到测试文件的triggers"——这些正是 yaml.md 四条边模式在逐文件分析阶段的落地规则。

节点侧的映射同样与 yaml.md 呼应。file-analyzer 的"Node type mapping by fileCategory"规定infra类文件按内容细分为三类:Dockerfile、docker-compose、K8s 清单 →service节点;.github/workflows/*.gitlab-ci.yml、Jenkinsfile →pipeline节点;Terraform、CloudFormation、Vagrant →resource节点;应用配置类 YAML →config节点。此外,结构提取脚本对非代码文件还会输出services(Dockerfile/compose 的每个 stage/service)、steps(CI 配置中的每个 job/step)、resources(Terraform/CloudFormation/K8s 资源)数组,file-analyzer 被要求为其中显著项生成service:<path>:<name>step:<path>:<name>resource:<path>:<name>子节点,而不是只产出一个父文件节点就打住。

Summary Style:三种摘要句式模板

原文档最后给出三句可复用的摘要范式:

  • "Docker Compose configuration defining N services with networking, volumes, and health checks."
  • "GitHub Actions workflow running tests on push and deploying to production on merge to main."
  • "Kubernetes deployment manifest with N replicas, resource limits, and liveness probes."

这三个模板的共性是:一句话 = 文件角色 + 可数事实(N 个服务/副本)+ 关键机制(网络、卷、健康检查、触发条件、探针)。file-analyzer 对 summary 的要求与之对齐:1~2 句、"描述配置所控制的东西"(Config files: describe what the config controls)、禁止空话("Bad: The utils file contains utility functions."),并要求标签使用documentationconfigurationinfrastructureci-cddeploymentcontainerizationorchestration等受控词表——例如 docker-compose.* 应打orchestrationinfrastructure标签,.github/workflows/*应打ci-cddeployment标签。这样写出的 summary 最终会进入knowledge-graph.json的节点,供 dashboard 展示与/understand-explain/understand-chat等技能消费。

源码纵深:从 yamlConfig 到 YAMLConfigParser 的确定性底座

提示片段负责"教 LLM 判断",而仓库中另有两层确定性代码负责"先把事实算出来",两者构成同一链路的上下游。

语言配置层:yamlConfig 与四个 YAML 变体

yaml.ts 定义了基础语言配置:

export const yamlConfig = { id: "yaml", displayName: "YAML", extensions: [".yaml", ".yml"], concepts: ["mappings", "sequences", "anchors", "aliases", "multi-document", "tags"], filePatterns: { entryPoints: [], barrels: [], tests: [], config: ["*.yaml", "*.yml"], }, } satisfies LanguageConfig;

注意concepts数组(mappings、sequences、anchors、aliases、multi-document、tags)与 yaml.md Key Concepts 中的"锚点与别名、文档分隔符"一一对应——语言配置给出机器可读的概念清单,md 片段给出人/LLM 可读的详细解释。同一 configs/index.ts 中还有四个 YAML 变体配置(dockerComposeConfigkubernetesConfiggithubActionsConfigopenapiConfig),其中 docker-compose 与 openapi 靠文件名匹配(如openapi.yamlswagger.yaml),github-actions 与 kubernetes 靠路径 glob匹配,这解释了为什么 yaml.md 的 Notable File Patterns 要按目录形态(.github/workflows/kubernetes/)描述:它对应的就是这些配置的匹配依据。

解析器层:顶层 key 提取的三种分支

YAMLConfigParser 实现AnalyzerPlugin,其languages数组声明为["yaml", "kubernetes", "docker-compose", "github-actions", "openapi"]——注释解释了原因:若不列出这些 YAML 风味格式,语言注册器打上这些 id 的文件会落入"没有匹配解析器"分支,丢失全部结构提取。解析逻辑有三个分支,恰好对应 yaml.md 提到的多文档流、流式风格与保留字引号:

  1. 普通 mapping 根:用yaml库解析后取顶层 key,再回原文用正则^["']?<key>["']?\s*:定位行号(兼容 GitHub Actions 的"on": push),最后按相邻 key 修正每个 section 的lineRange终点;
  2. 数组根(CloudFormation 片段、K8sList文档等):为每个数组项生成一个 section,命名优先取项的nameidkind字段,取不到才用[i]下标——这正是 K8s 清单以kind命名的由来;
  3. 解析失败回退:对形如^(\w[\w-]*)\s*:的行做正则提取,保证格式略乱的 YAML 也能拿到顶层 key。

解析器只提取顶层 key、不深入嵌套,这与 yaml.md 的分工一致:确定性层给出"这个文件有哪些顶层 section(services、networks、jobs…)"的骨架事实,语义层(LLM 按 yaml.md 的指引)负责判断"这些 section 意味着什么、连什么边"。

架构层:architecture-analyzer 如何消费这些信号

Phase 4 中,architecture-analyzer 先运行确定性脚本计算目录分组、跨类别边矩阵(如config -> file: 5 (configures)service -> file: 2 (deploys))、部署拓扑(hasDockerfile/hasCompose/hasK8s/hasCI)等,再做语义分层。其中 architecture-analyzer.md 内置的目录模式表与 yaml.md 的 Notable File Patterns 高度重合:.github/.gitlab/.circlecici-cdk8s/kubernetes/helm/charts/terraform/dockerinfrastructure;文件级模式docker-compose.*infrastructure.github/workflows/*.gitlab-ci.ymlci-cd。非代码层的分层提示也直接给出结论:Dockerfile/docker-compose/K8s 清单/Terraform →layer:infrastructure,工作流文件 →layer:ci-cd*.yaml应用配置 →layer:config(小项目可合并)。于是完整链条是:Phase 1 检测语言 → Phase 2 file-analyzer 按边表产出config:/service:/pipeline:/resource:节点与configures/triggers/deploys/provisions边 → Phase 4 architecture-analyzer 在 yaml.md 片段指引下把它们归入 Infrastructure/CI-CD/Config 层 → Phase 7 落盘knowledge-graph.json

实操验证:在自己的项目里观察这份片段的效果

在任意含 YAML 基础设施的项目根目录运行/understand(完整流程见 SKILL.md 的七阶段说明),产出位于项目数据目录$UA_DIR/knowledge-graph.json.ua/,或已存在时沿用旧目录.understand-anything/)。可以按下面三步验证 yaml.md 片段的作用:

  1. 看节点类型分布:统计节点中typeconfigservicepipelineresource的条目,应能看到config:docker-compose.ymlpipeline:.github/workflows/ci.yml这类 ID(前缀规则见 file-analyzer 的"Node Types and ID Conventions"表);
  2. 看边类型:过滤typeconfigures/triggers/deploys/provisions的边,确认源节点全部是 YAML 文件节点,目标指向代码文件或 Dockerfile,且weight符合 0.6/0.7 约定;
  3. 看摘要风格:检查这些 YAML 节点的summary是否遵循"角色 + N 个可数事实 + 关键机制"句式,tags是否命中ci-cdorchestrationinfrastructure等受控词表。

如果项目里 K8s 清单位于deploy/等非kubernetes/路径下,从源码结构看它们大概率以yaml语言身份进入分析(kubernetes.ts 的 TODO 已注明内容级检测尚待实现),此时 yaml.md 注入的上下文就是 LLM 把它们识别为service/resource节点的主要依据。

小结

yaml.md 篇幅不长,但它是 Understand-Anything 把"非代码文件纳入知识图谱"这一设计在 YAML 维度的完整知识契约:Key Concepts 教 LLM 读懂语法,Notable File Patterns 教它认出基础设施文件,Edge Patterns 加 Summary Style 教它产出符合 schema 的节点与边。与 yamlConfig、YAMLConfigParser 的确定性提取、file-analyzer 的边表权重、architecture-analyzer 的目录模式表配合后,YAML 配置文件不再是一堆游离的config节点,而是带上configures/triggers/deploys/provisions语义关系、归属 Infrastructure/CI-CD 层的图谱公民——这正是项目"graphs that teach"口号在基础设施面落地的方式。

【免费下载链接】Understand-AnythingGraphs that teach > graphs that impress. Turn any code into an interactive knowledge graph you can explore, search, and ask questions about. Works with Claude Code, Codex, Cursor, Copilot, Gemini CLI, and more.项目地址: https://gitcode.com/GitHub_Trending/un/Understand-Anything

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 6:10:08

AI Agent长期记忆系统设计:解决智能体跨会话失忆的工程实践

AI Agent 长期记忆系统&#xff0c;解决的核心问题不是“让对话窗口变大”&#xff0c;而是让同一个智能体在跨会话、跨任务、跨用户时还能记住关键信息。如果只靠大模型的上下文窗口&#xff0c;用户上次提的需求、管理员配置的业务约束、任务执行到一半的状态&#xff0c;一旦…

作者头像 李华
网站建设 2026/9/7 6:10:04

基于RK3588的C++视频监控系统:从V4L2采集到RTSP推流全解析

简介&#xff1a;C视频监控系统开发源码是一套基于MFC框架与C语言实现的多路视频监控工程&#xff0c;适合Windows桌面应用开发者、计算机视觉初学者以及需要快速搭建监控原型的项目人员。工程在VC6.0环境下编写&#xff0c;涵盖摄像头采集、视频显示、录像保存、多路并发预览等…

作者头像 李华
网站建设 2026/9/7 6:09:46

展讯平台刷机工具全解析:从驱动到救砖的实操指南

简介&#xff1a;这是一套面向展讯平台功能机与智能机用户的升级刷机工具集合&#xff0c;适合需要优化系统、修复故障或刷入定制ROM的普通用户和维修从业者。资源共36个文件&#xff0c;压缩包约1.21MB&#xff0c;包含DLoaderR.exe主程序、BMPlatform.dll等动态库、多种ini配…

作者头像 李华
网站建设 2026/9/7 6:09:14

AI自养活实验:用150英镑和三个月验证AI服务的真实价值

如果有人给 AI 150 英镑和三个月时间&#xff0c;让它自己赚回每月的订阅费用&#xff0c;你会怎么设计这个实验&#xff1f;我见过不少类似的项目&#xff0c;真正跑下来之后&#xff0c;结论往往不是“AI能不能赚钱”&#xff0c;而是“人类能不能把任务边界、成本预算和验收…

作者头像 李华
网站建设 2026/9/7 6:09:04

交换机品牌盘点与实战配置:从核心原理到常见坑全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华