· 阅读 —
2025年终总结_mermaid
Summary_2025
Review_Work
- Notion_planning
回看今年年初在 Notion 中制定的「日 / 月 / 年度计划」,其实只坚持了不到两个月便逐渐搁置。以至于到了年末,只能依靠零散的记忆与项目痕迹,去尽力拼凑这一年的工作轨迹。这本身也算是一种提醒——计划的意义,终究还是要靠持续执行来支撑。
- 卷
“卷”,已经成了打工人的一种通用标签。无论是内卷还是自卷,是真卷还是调侃式的自嘲,慢慢也都看淡了。这一年卷来卷去,更像是一种对工作的态度:并非执着于结果本身,而是害怕那股对事情认真投入的劲头被磨掉。好在九月的最后一天,收到了一条迟到却重要的好消息,也算是虽迟但到。那一刻,下半年的那把火,似乎又重新点燃了些许——提醒自己,踏踏实实,把每一件事情尽量做好的同时笑看云卷云舒,静观花开花落。

- 感想
从具体工作内容来看,今年并未负责太多体量巨大的项目,更多是一些零散的需求迭代与 AI 相关项目,且偏自动化方向居多。几乎每一个 AI 项目,都绕不开自动化执行与评测结果的输出,这也意味着代码需要不断被重构、优化和演进,以适配不同业务形态下的 AI 应用场景。
其中,最让人感到反复消耗精力的,并不是代码实现本身,而是 评测数据集(Dataset)的构建与维护。在模型评测过程中,需要反复执行评测流程,并为每一条数据标注明确的预期结果。只有在“标准答案”足够可靠的前提下,实际结果的对比与验证才有意义。这一过程往往伴随着反复校验、修正与人工确认,耗时却难以规避。
一些阶段性的感想是:在大模型盛行之前,自动化测试抛开技术实现,本质始终围绕着 数据集 + 标准答案。无论是功能测试还是自动化测试,核心思想始终是通过对比「预期结果」与「实际结果」来完成 diff 与 assert。到了 AI 测试时代,这一底层逻辑并未改变,只是数据集的构建成本与复杂度被显著放大了——数据,依然是核心。
%%{init: {'themeVariables': {'edgeLabelBackground':'#fff'}}}%%
flowchart TD
%% 全局样式设置
classDef default stroke:#666,stroke-width:1.5px,font-size:14px
linkStyle default stroke:#999,stroke-width:1.5px,stroke-dasharray:0
%% 核心流程分区
subgraph 传统测试流程
style 传统测试流程 fill:#FDEBD0,stroke:#E67E22
A1[需求文档] --> A2[测试用例设计]
A2 --> A3[手工测试执行]
A3 --> A4[缺陷报告]
A4 --> A5[回归验证]
end
subgraph AI测试演进
style AI测试演进 fill:#D5DBDB,stroke:#7F8C8D
B1[AI需求分析] --> B2[评测数据集构建]
B2 --> B3[自动化测试框架]
B3 --> B4[模型版本比对]
B4 --> B5[指标可视化]
end
%% 核心痛点突出
subgraph 关键痛点
style 关键痛点 fill:#FADBD8,stroke:#E74C3C
C1["数据集构建(占时60%)"]
C2["标注一致性维护"]
C3["版本迭代适配"]
end
%% 数据流关联
A2 -.->|测试用例转化| B2
B2 -->|数据依赖| C1
C1 -->|版本更新| C3
B4 -->|结果反馈| C2
%% 注解节点
D1["AI测试核心:\n数据质量决定\n评测有效性"]:::annotation
classDef annotation fill:#F9E79F,stroke:#F1C40F,font-size:13px
C1 -.- D1
B2 -.- D1
今年有幸参加了 AIDD · AI + 研发数字峰会,在两天多场关于「拥抱 AI、重塑研发」的分享中,一个感受尤为清晰:AI 技术在研发与测试中的真正落地,核心仍然是私域数据的积累与维护。无论是数据清洗、标注,还是面向特定业务场景的专向数据构建,都是模型定制化应用的根基,而非单纯依赖模型能力本身。

在模型评测框架的设计与落地过程中,这一点体会得尤为深刻。最繁琐的部分,并非代码逻辑的复杂度,而是不同项目评测数据的构建与统一。即便借助大模型与 Prompt 生成初始数据,并将生产数据归一化为结构化 JSON 格式,后续仍不可避免地需要进行大量的数据清洗、整理与标注工作。这一过程高度依赖人工走查,枯燥且重复,但又无法跳过。

回头看这一年,做了不少尝试,也踩了不少“看不见的坑”。相比追逐新的技术名词或框架,更重要的收获是逐渐意识到:真正决定 AI 测试与工程质量的,从来不是模型本身,而是数据、流程以及持续投入的耐心。这或许也是这一年留给自己的,最现实也最有价值的一点认知。
Review_Doc
==回顾整体工作情况,相关技术文档的输出主要围绕大模型实践项目的阶段性与最终产出进行同步整理。在整理过程中,不仅对项目实现内容进行了系统归纳与沉淀,也作为一次对自身项目实践的总结与复盘。基于复盘结果,对文档与实现内容进行了持续优化,例如在代码逻辑的严谨性、规范性以及可维护性方面进行改进,同时对关键实现思路与技术路径进行了回顾与梳理,以提升技术沉淀的质量与可复用性。==
- 模型测试实践总结PART_1-20250228.pptx
- 模型评测方案_2025年04月13日.pptx
- 车辆AI搜索_模型评测方案.md
- 蜂王AI评估框架 (Bee King_eval).md
- 模型评测-意图识别-关键指标详解.md
- AI项目生产巡检/回归设计方案_2025年09月03日.md
- ChatBI 评测方案设计.md
- auto_api_tc - API自动化测试框架_技术文档.md
- SmartMind Case - 需求质量分析与测试用例生成智能体平台_技术文档.md
- SmartMind KB - 智能知识库检索系统_技术文档.md
- SmartMind Bot - 基于大语言模型的智能客服自动化测试系统_技术文档.md

Review_Tech
==大模型的折腾之路==
模型评测框架
在参与多个新媒体智能化相关项目(如语音质检、IM 智能客服等)的过程中,传统基于确定性输入–输出比对的测试方法,已难以适配 AI 模型在真实业务场景中表现出的概率性、不确定性与结果波动性。这类问题需要一套更加自动化、指标化、可复用的模型评测体系来支撑。
-
对模型输出质量进行多维度、可量化评估
-
降低人工评测成本,提高测试效率与一致性
-
支撑模型迭代过程中的效果回归与对比分析
-
形成可沉淀、可复用的测试技术方案
-
核心流程
sequenceDiagram
participant TestOrchestrator as datasets
participant ModelService as 业务API
participant JudgeModel as 裁判模型
participant MetricsEngine as 指标分析
participant ReportGen as 报告生成
TestOrchestrator->>ModelService: 提交测试用例
ModelService-->>TestOrchestrator: 返回预测结果
TestOrchestrator->>JudgeModel: 提交评估请求(用例 + 预测结果)
JudgeModel-->>TestOrchestrator: 返回质量评分
TestOrchestrator->>MetricsEngine: 提交完整评测数据
MetricsEngine-->>TestOrchestrator: 返回评估指标(准确率、召回率等)
TestOrchestrator->>ReportGen: 生成评测报告
- 核心算法逻辑
%% Mermaid flowchart with hierarchical structure and visual styling
flowchart TD
%% ========== Color Theme ==========
classDef dataLayer fill:#d4e6ff,stroke:#99c2ff,stroke-width:2px
classDef logicLayer fill:#d4f7e8,stroke:#66d9a3,stroke-width:2px
classDef appLayer fill:#ffe8d4,stroke:#ffb366,stroke-width:2px
classDef outputLayer fill:#f0e6ff,stroke:#c299ff,stroke-width:2px
classDef arrowStyle fill:none,stroke:#999,stroke-width:2px
%% ========== Data Layer ==========
subgraph dataLayer["数据层"]
A["DeepDiff模块\n原始文本差异检测"]:::dataLayer
end
%% ========== Logic Layer ==========
subgraph logicLayer["逻辑处理层"]
B["SentenceTransformer\n向量化语义编码"]:::logicLayer
C["LLM语义比对\n(余弦相似度计算)"]:::logicLayer
D["差异聚合分析\n(权重计算+置信度评估)"]:::logicLayer
end
%% ========== Output Layer ==========
subgraph outputLayer["输出层"]
E["评测结果输出\n(结构化差异报告)"]:::outputLayer
end
%% ========== Data Flow ==========
A --"原始文本差异"--> B
B --"语义向量"--> C
C --"相似度矩阵"--> D
D --"聚合评分"--> E
%% ========== Styling Adjustments ==========
style dataLayer fill:#f5f9ff,stroke-dasharray: 5 5
style logicLayer fill:#f5fcf9,stroke-dasharray: 5 5
style outputLayer fill:#faf5ff,stroke-dasharray: 5 5
%% Node spacing configuration
linkStyle 0,1,2,3 stroke:#999,stroke-width:2px

AI项目自动化回归方案
在基于大模型的产品项目中,系统行为往往受到 Prompt、模型版本、运行环境及数据分布变化 的共同影响,输出结果具有一定概率性与不确定性。相比传统系统,“是否稳定运行”已不再仅等价于“接口是否可用”,而是需要持续关注结果质量、行为一致性与性能波动。
- 回归与巡检触发场景
-
项目迭代有规则改动 : 必须全量回归:Prompt 改动往往会导致整体行为逻辑的变化,不能只测改动点。
-
模型版本升级 / 环境迁移: 必须巡检 + 对比测试:新模型或者新环境可能会影响结果稳定性和性能。
-
项目迭代无改动: 定期轻量(数据抽取)巡检
-
流程图
flowchart TD
A[AI 项目自动化巡检] --> B{巡检类型}
%% 1. 项目迭代 / Prompt规则变动
B -->|项目迭代 / Prompt规则变动| C[全量回归测试]
C --> C1[使用基准测试集Benchmark]
C --> C2[Bad case / 问题样例加入定期更新数据集]
C --> C3[生成回归对比报告并存档]
%% 2. 模型版本升级 / 环境迁移
B -->|模型版本升级 / 环境迁移| D[全量回归 + 对比测试]
D --> D1[功能测试:语义准确率/业务指标]
D --> D2[性能测试:QPS / 延迟 / 吞吐量 / 错误率]
D --> D3[生成回归报告 + 灰度发布策略]
%% 3. 日常巡检
B -->|日常巡检| E[周期性巡检方案]
%% 3a. 定时执行
E --> E1[定时任务 Cron / CI 执行巡检脚本]
E1 --> E2[数据来源抽取]
%% 3b. 数据来源
E2 --> E2a[线上数据抽样]
E2 --> E2b[固定测试数据集Benchmark]
%% 3c. 线上数据抽样处理
E2a --> F1[裁判模型 LLM-as-a-Judge
筛选高价值样本]
F1 --> F2[数据脱敏 / 匿名化处理]
F2 --> F3[形成巡检数据集]
%% 3d. 执行巡检
F3 --> G[回放测试 / 功能验证]
E2b --> G
G --> H[基准对比 / 差异分析]
%% 3e. 报告生成 & 告警
H --> I[生成巡检报告 HTML/Markdown]
I --> J{是否异常?}
J -->|否| K[存档报告,持续监控]
J -->|是| L[触发告警 → 企业微信]
%% 3f. 定期更新数据集
L --> M[将发现的 Bad Case 加入定期更新数据集]
%% 节点背景颜色设置
style C fill:#8ecae6,stroke:#000,stroke-width:1px
style C1 fill:#8ecae6,stroke:#000,stroke-width:1px
style C2 fill:#8ecae6,stroke:#000,stroke-width:1px
style C3 fill:#8ecae6,stroke:#000,stroke-width:1px
style D fill:#8ecae6,stroke:#000,stroke-width:1px
style D1 fill:#8ecae6,stroke:#000,stroke-width:1px
style D2 fill:#8ecae6,stroke:#000,stroke-width:1px
style D3 fill:#8ecae6,stroke:#000,stroke-width:1px
style E fill:#95d5b2,stroke:#000,stroke-width:1px
style E1 fill:#95d5b2,stroke:#000,stroke-width:1px
style E2 fill:#95d5b2,stroke:#000,stroke-width:1px
style E2b fill:#95d5b2,stroke:#000,stroke-width:1px
style F1 fill:#f94144,stroke:#000,stroke-width:1px
style F2 fill:#f94144,stroke:#000,stroke-width:1px
style F3 fill:#f94144,stroke:#000,stroke-width:1px
style G fill:#ffe066,stroke:#000,stroke-width:1px
style H fill:#ffe066,stroke:#000,stroke-width:1px
style I fill:#ffe066,stroke:#000,stroke-width:1px
style J fill:#f9c74f,stroke:#000,stroke-width:1px
style K fill:#f9c74f,stroke:#000,stroke-width:1px
style L fill:#f9c74f,stroke:#000,stroke-width:1px
style M fill:#f9c74f,stroke:#000,stroke-width:1px
- 被测数据抽取方案
该方案重点在于 真实分布覆盖 + 风险点持续施压,而非单纯追求数量。
数据集抽样比例_benchmark
核心点:
-
真实分布 + 高频主干:单条件查询、多条件组合 合计 36%,覆盖最常见路径,能稳定反映线上主流程健康度。
-
可用性与鲁棒性:口语化、错别字、数字格式、模糊表达、多值并列(合计 32%)是搜索/解析最常见噪声来源,容易引发召回或解析偏差,需持续巡检。
-
边界&冲突:边界值、条件冲突 合计 11%,专门挖风险点(规则边界、优先级冲突、解析歧义)。
-
长尾稳压:特殊格式字符、全部条件、异常情况、隐含否定条件 共 9%,保持低但固定占比,防止盲区;地域相关性 4% 兼顾地域词典/地名歧义。
-
理解保障:用户意图识别 8% 专注“未显式结构化”的理解正确率,防回退为“看似正常但理解错”。
-
流程图
%% AI搜车巡检线上设计方案流程图
%% 深色模式配色方案:节点使用亮色系
flowchart TD
%% ===== 数据输入层 =====
A(("数据源集合")) --> B[分层抽样引擎]
subgraph 数据源
A1[测试数据集]:::data
A2[生产数据集]:::data
A3[生产badcase]:::data
A4[人工抽查/新增]:::data
end
A --> A1 & A2 & A3 & A4
%% ===== 核心处理层 =====
B --> C{抽样策略控制}
C -->|基准比例| D[基准配额计算<br>LABEL_WEIGHTS]:::process
C -->|动态调整| E[风险自适应调权]:::process
D --> F[分层抽样执行]:::process
E --> F
%% ===== 抽样逻辑层 =====
F --> G[多标签样本处理]:::logic
G --> G1[分桶填充策略]:::logic
G --> G2[稀缺标签优先]:::logic
G --> G3[相近标签回填]:::logic
F --> H["最小覆盖保障<br>min(10, 2%N)"]:::logic
%% ===== 输出层 =====
H --> I(("质检数据集"))
subgraph 输出模式
J[周检模式<br>N=100]:::output
K[月检模式<br>N=300-500]:::output
L[版本前全检]:::output
end
I --> J & K & L
%% ===== 反馈环 =====
L --> M[缺陷分析看板]:::feedback
M -->|高缺陷标签| N[权重+2~5%]:::feedback
N -->|更新| D
M --> O[金标样本集<br>20-30%]:::feedback
O --> B
%% ===== 样式定义 =====
classDef data fill:#E6E6FA,stroke:#9370DB,stroke-width:2px
classDef process fill:#FFFACD,stroke:#FFD700,stroke-width:2px
classDef logic fill:#FFDAB9,stroke:#FF6347,stroke-width:2px
classDef decision fill:#FFA07A,stroke:#FF4500,stroke-width:2px,shape:hexagon
classDef output fill:#98FB98,stroke:#2E8B57,stroke-width:2px
classDef feedback fill:#D8BFD8,stroke:#9400D3,stroke-width:2px
RAG_知识库智能问答系统
在研究 RAG 相关技术的过程中,结合团队内部已有的测试资料,设计并实现了一套私有化部署的知识库智能问答系统,用于提升测试资料的检索效率与知识复用能力。
- 实现团队测试资料的语义级检索与跨文档查询
- 支持对历史文档内容的快速定位与智能摘要生成
核心技术架构:
- 基于 Embedding + LLM + FAISS 构建向量化知识检索能力
- 采用 Chunk 分块策略,提升长文档的检索精度与召回效果
- 支持多源文档接入(业务文档、测试用例、问题数据等)
- 基于向量相似度计算,实现高效语义召回与排序
- 结合大模型能力,对检索结果进行总结、归纳与回答生成
sequenceDiagram
%% 时序图标题
title ✅ smartmind_kb 知识库问答系统时序图(从文件上传到回答生成的全流程)
participant U as 🧑💻 用户
participant FM as 📁 FileManager<br>(文件管理模块)
participant KA as 🧠 KnowledgeAgent<br>(知识提取与入库)
participant VB as 🧬 VectorRetriever<br>(向量检索模块)
participant CM as 💬 ChatModel<br>(大语言模型接口)
participant DB as 🧩 向量数据库<br>(FAISS)
participant LLM as 🤖 大语言模型<br>(deepseek-v3)
%% 文件上传阶段
U->>FM: 上传知识文件 (MD / TXT )
FM->>KA: 调用知识提取任务<br>(读取 + 分块 + 清洗文本)
KA->>KA: 文本预处理(去噪、句子切分、分块)
KA->>VB: 调用嵌入模型生成向量 (qwen3-embedding-0.6b)
VB->>DB: 将向量与对应文本片段写入向量数据库
DB-->>VB: 返回存储确认
VB-->>KA: 返回索引状态
KA-->>FM: 返回“知识入库成功”
%% 用户问答阶段
U->>VB: 提交用户问题 Query
VB->>DB: 通过向量相似度检索最相关文本片段
DB-->>VB: 返回 Top-K 相似片段 (retrieved_docs)
VB-->>CM: 将检索结果传给 ChatModel
%% LLM 回答生成阶段
CM->>LLM: 构造 Prompt + 系统指令<br>并调用大语言模型生成回答
LLM-->>CM: 返回 AI 生成的回答
CM-->>U: 输出最终回答内容
%% 监控与日志
Note over FM,CM: 各模块会在控制台输出<br>📊处理日志和📈Token统计信息


智能测试对话机器人
在 IM 与智能客服类业务场景中,系统逻辑往往依赖多轮对话状态、上下文理解及复杂业务规则。传统基于脚本或单轮请求的测试方式,难以真实覆盖用户在实际使用过程中的交互路径,自动化测试在多轮对话与场景组合上的覆盖能力存在明显不足。
- 实现对 IM / 智能客服系统的多轮对话自动化测试
- 模拟真实用户行为,覆盖复杂业务场景与规则路径
- 降低人工参与对话验证的成本
- 提升测试覆盖率与一致性验证能力
技术实现要点:
- 基于大模型进行对话驱动与上下文理解
- 支持自动发起 IM 会话并进行连续多轮交互
- 可根据预设测试场景与业务规则,动态生成对话内容
- 对系统回复结果进行规则校验与质量评估
sequenceDiagram
participant User as 👤 用户
participant Main as 🚪 主入口
participant EB as 🤖 测试工程师机器人
participant LLM as 🧠 大语言模型
participant API as 🔌 客服 API
participant CS as 💬 客服智能体
participant RG as 📄 报告生成器
Note over User,Main: 🚀 测试启动阶段
User->>Main: ▶️ 启动测试
Main->>EB: ⚙️ 初始化测试机器人
EB->>EB: 📂 加载测试用例
Note over EB,LLM: 🧪 智能测试执行阶段
loop 🔁 每个测试用例
loop 💬 多轮对话
EB->>LLM: ✍️ 生成测试问题
LLM-->>EB: 📤 返回测试问题
EB->>API: 📡 发送问题给客服
API->>CS: 🤝 调用客服智能体
CS-->>API: 💬 客服回复
API-->>EB: ⏱️ 回复内容 + 耗时
EB->>LLM: 🧐 评估回复质量
LLM-->>EB: 📊 评估结果
EB->>EB: 📝 记录测试结果
end
end
Note over EB,RG: 📊 结果汇总与报告生成
EB->>EB: 📌 生成测试摘要
EB->>RG: 🧾 生成详细测试报告
RG-->>EB: 📁 报告文件路径
EB-->>User: ✅ 展示测试结果
基于大模型的测试用例生成与需求质量评估实践
在智能化测试技术的探索过程中,利用大模型生成测试用例是最直观、也是最容易落地的应用方向之一。然而,在实际实践中也逐渐发现,该能力在强业务约束场景下存在天然局限:
- 大模型在缺乏充分业务上下文的情况下,难以保障测试用例在业务逻辑层面的完整性与准确性
- 若要生成贴近特定业务规则的测试用例,往往需要引入大量业务数据作为上下文,或通过模型微调、构建专属知识库等方式进行增强,整体成本与复杂度较高
尽管如此,测试用例生成在提升测试前置化与效率方面仍具备较高探索价值。因此,选择从需求阶段切入,结合大模型与多智能体协作机制,对测试用例生成进行工程化实践。
- 基于多智能体协作模式,对需求文档进行结构化解析
- 自动评估需求的完整性、一致性与可测试性
- 对需求内容进行风险点分析与隐式规则挖掘
- 输出结构化的评审结论与改进建议
- 在评估结果基础上,生成覆盖关键业务路径与异常场景的测试用例,作为测试设计阶段的重要输入
flowchart TD
%% ================== 样式定义 ==================
classDef uiStyle fill:#E3F2FD,stroke:#1E88E5,stroke-width:2px
classDef coreStyle fill:#E8F5E9,stroke:#43A047,stroke-width:2px
classDef agentStyle fill:#FFF3E0,stroke:#FB8C00,stroke-width:2px
classDef toolStyle fill:#F3E5F5,stroke:#8E24AA,stroke-width:2px
classDef storeStyle fill:#FCE4EC,stroke:#D81B60,stroke-width:2px
%% ================== 用户交互层 ==================
subgraph U[👤 用户交互层]
A[🖥️ Gradio Web 界面]
B[📋 任务管理模块]
A --> |✍️ 输入需求| B
B --> |📊 显示进度与结果| A
end
%% ================== 核心处理层 ==================
subgraph C1[🧠 核心处理层]
C[🤖 智能体协调模块]
D[🕷️ crawl4ai 爬虫模块]
E1[📄 产品经理智能体]
E2[🔍 需求分析师智能体]
E3[🧪 测试用例专家智能体]
E4[✅ 测试评审专家智能体]
B --> |📨 分发任务| C
C --> |🌐 爬取需求| D
D --> |📥 返回需求内容| C
C --> |📐 分析需求| E1
C --> |📊 质量评估| E2
C --> |🧩 生成用例| E3
C --> |🔄 评审优化| E4
E1 --> |📝 PRD 文档| C
E2 --> |📑 质量报告| C
E3 --> |📋 初始用例| C
E4 --> |✨ 优化用例| C
end
%% ================== 工具支持层 ==================
subgraph T[🛠️ 工具支持层]
F[🗺️ md2xmind 转换模块]
G[📜 日志模块]
H[⚙️ 配置管理模块]
C --> |🔁 调用转换| F
F --> |📁 返回 XMind 文件| C
C --> |🧾 存储日志| G
C --> |🔧 读取配置| H
end
%% ================== 存储层 ==================
subgraph S[💾 存储层]
I[📦 输出文件存储]
C --> |💾 保存结果| I
end
%% ================== 样式应用 ==================
class A,B uiStyle
class C,E1,E2,E3,E4 coreStyle
class E1,E2,E3,E4 agentStyle
class D,F,G,H toolStyle
class I storeStyle

ocr 模型应用_图形验证码
在 UI 自动化测试及登录 Token 获取等相关测试场景中,登录页面的图形验证码一直没找到简单点的友好的解决方案
后来在GitHub 上发现了轻量级 OCR 模型库 ddddocr,并结合实际业务场景进行了二次封装与优化,形成了一套可落地的图形验证码自动识别方案。
- 技术方向:OCR 模型在测试自动化中的应用
- 核心技术:轻量级 OCR 模型(ddddocr)
实现要点:
- 利用 ddddocr 对登录页面图形验证码进行快速识别
- 结合验证码图片预处理与结果校验逻辑,提高识别成功率
- 对识别流程进行工程化封装,适配自动化测试场景
- 与登录流程集成,实现自动获取登录 Token
应用场景
- UI 自动化测试中的登录流程自动化
- 需要频繁获取登录 Token 的接口与联调测试场景
- 降低图形验证码对自动化测试流程的阻断影响
%%{init: {'theme': 'base', 'themeVariables': { 'background': '#f5f5f5'}}}%%
sequenceDiagram
%% Participants with emoji icons
participant User as 👤 User
participant Client as 💻 Client(HuobanPcToken)
participant OCR as 🔤 OCR Processor
participant API as 🌐 Backend API
participant FS as 💾 File System
%% Color styles
rect rgba(214, 234, 248, 0.2)
note right of Client: 初始化阶段
User ->> Client: 提供username/base_url
Client ->> Client: 生成UUID key
end
rect rgba(213, 245, 227, 0.2)
note right of Client: 验证码获取流程
Client ->> API: GET /getimagecode?key=[UUID]
API -->> Client: 返回base64验证码
Client ->> FS: 保存为output.png
FS -->> Client: 文件保存确认
end
rect rgba(250, 215, 160, 0.2)
note right of Client: OCR处理流程
Client ->> OCR: 识别output.png
OCR ->> OCR: normalize(text)
OCR ->> OCR: parse_addition(text)
OCR -->> Client: 返回计算表达式和结果
end
rect rgba(215, 189, 226, 0.2)
note right of Client: 登录流程
Client ->> API: POST /login<br>username+code+key
alt 成功
API -->> Client: 返回Token
Client -->> User: 登录成功
else 失败
API -->> Client: 错误信息
Client -->> User: 登录失败
end
end
%% Styling improvements
Note over User,FS: 颜色说明:<br>🔵 初始化 ▫️ 🟢 验证码 ▫️ 🟠 OCR ▫️ 🟣 登录
Note right of OCR: 识别过程:<br>1. 原始识别<br>2. 字符归一化<br>3. 表达式解析

VL多模态定制模型在 UI自动化中的实践
在 UI 自动化测试领域,如何结合大模型能力实现更高层次的自动化与智能化,一直是持续探索的方向。此前尝试过多种基于智能体的解决方案,包括 UI-Agent 模型及 MCP 接入方式,但在实际使用过程中,整体稳定性与可控性仍存在一定局限,难以满足复杂业务场景下的自动化需求。
技术探索与阶段性成果
在近期的技术调研中,发现并引入了 gelab-zero-4b-preview 多模态模型,并基于本地 LLM Studio 成功完成模型部署与运行。结合社区成熟的项目实现代码,对模型能力进行了快速验证,在 UI 识别与操作执行层面表现出较好的稳定性与流畅度,具备进一步工程化落地的可行性。
后续规划
在当前验证基础上,计划围绕团队实际业务场景开展二次开发,包括:
- 针对自有 App 的 UI 结构与交互特点进行定制化适配
- 提升复杂页面与多步骤流程下的稳定性与成功率
- 与现有 UI 自动化测试框架进行集成,形成可复用能力
智能体框架的探索与使用感受
这一年中,围绕智能体(Agent)方向,先后对 crewAI、LangGraph、Agno 以及 OpenAI Agents SDK 等框架进行了体验与对比。从整体来看,这几类框架在核心思想上大同小异,都是围绕 任务拆解、角色协作与流程编排 来构建智能体系统,但在设计理念与使用侧重点上,各有明显差异。
在实际使用过程中,一个比较直观的感受是:受限于缺乏足够贴近真实业务的落地项目,这些框架的探索更多停留在能力验证与 Demo 级实践阶段,对于复杂业务场景下的稳定性、可维护性与扩展性,仍缺少长期实践支撑。
-
crewAI
crewAI 在“角色驱动”的建模方式上体验较好,通过明确的角色定义与任务分工,能够较自然地映射到测试分析、需求拆解等业务场景,编排方式直观,适合用于流程相对清晰的多角色协作场景。
-
LangGraph
LangGraph 采用基于图(Graph)的编排思想,对 Agent 执行流程、状态流转的表达能力较强,设计理念新颖,理论上更适合复杂流程与分支控制。
-
Agno / OpenAI Agents SDK
Agno 与 OpenAI Agents SDK 在使用体验上更偏“轻量化”,整体设计简洁、概念清晰,上手成本低,更适合快速验证想法或构建简单 Agent 工具。
综合来看,多智能体框架本身并非核心瓶颈,真正决定价值的仍然是业务场景与工程化落地能力。在缺乏明确业务目标的情况下,框架之间的差异更多体现在“表达方式”而非“能力本质”上。相比单纯追逐框架特性,如何将 Agent 能力与实际业务流程、数据体系和质量评估机制深度结合,才是下一阶段更值得投入的方向。
- 后续思考
后续计划减少对“框架层面差异”的过度关注,更多从以下方向推进实践:
- 以真实业务问题为核心,反向选择合适的 Agent 框架
- 优先关注系统稳定性、可观测性与可维护性
- 将多智能体能力嵌入现有测试流程,而非独立构建复杂系统
mcp 开发与实践
- 基于现有业务接口,自主开发并实现了一个车辆搜索业务 MCP 工具
- 对工具能力进行协议封装,使其符合 MCP 调用规范
- 将 MCP 工具接入客户端,实现由模型触发工具调用
- 成功完成车辆信息查询等业务能力的联动验证
Review_Blog
之前基于 notionNext 框架搭建的博客,最终还是没能坚持下来。由于使用的是免费的 Vercel 托管资源,遭遇恶意刷流量后被直接封禁,邮件申诉也未能恢复。折腾了一阵之后,只能选择放弃。恰好域名也临近到期,这件事便顺势画上了一个句号。

于是重新开始折腾博客。这一次选择了更传统也更稳定的 Hexo 开源博客工具。整体搭建过程并不复杂,但在主题定制上花了不少时间。从样式到结构,几乎是亲自一点点手搓出来的。虽然过程琐碎,但那种“完全可控、完全理解”的快乐,只有自己才懂,也算是折腾的意义所在。顺带也重新审视了一下这些年用过的各种笔记工具。从 Notion、Obsidian,到一众基于 Markdown 的“套壳工具”,前前后后尝试了不少。到头来发现,最简洁、最顺手、也最少干扰思考的,反而还是 Typora。没有复杂的结构设计,没有过多的功能负担,专注于写本身,反而更容易长期坚持。

目前 Hexo 博客的文章编辑也统一基于 Typora,接下来也计划将 2026 年开始的个人笔记逐步迁移到 Typora,算是一种“反璞归真”,回到最初记录与思考的状态。而在计划、日程与项目管理层面,仍然保留 Notion,用它来承载结构化与流程化的内容。
工具终究只是工具,各有所长即可。经历了这一轮反复折腾之后,也更加确定了一点:不再为了工具而折腾工具。让记录回归记录,让思考回归思考,剩下的时间,留给真正值得投入的事情。

Review_Notion
目前,Notion 依然承载着我生活与工作中的多个重要模块:文章收藏与素材储备、日程计划与追踪清单、日常工作记录,以及旅行攻略与规划等内容。得益于 Notion 强大的模板体系、数据库能力和信息组织方式,其整体使用体验在视觉与结构上都非常出色。再加上此前 xmylog 博客 也曾基于 Notion 作为后台进行内容编写与同步,这一度让我对 Notion 的能力充满信心。

然而,随着使用时间拉长,其核心短板也逐渐变得无法忽视。Notion 本质上是一个在线 SaaS 工具,所有数据完全依赖云端存储,这带来了几个现实且“致命”的问题:图片加载不稳定、访问速度受网络影响明显、数据无法真正本地化。即便暂时不考虑数据安全层面的问题,仅从使用体验来看,频繁的加载延迟也大大削弱了 All-in-one 统一使用的可行性。
图片资源未同步:image-20251229174818234

回头看,之前对 Notion 的使用方式本身也存在问题。我几乎把它当作一个“万能容器”:既是文字编辑器,用来写稿;也是资料库,用来存储各种零散素材;同时还通过 API 接入了 Readwise、Flomo、微信读书 等外部工具,试图贯彻“Everything in Notion”的理念,把所有信息一股脑地塞进去。但现实是——我根本没有精力去系统整理这些内容。而一旦缺乏整理与维护,再强大的工具也难以发挥价值,更谈不上高效利用。信息越堆越多,反而成为负担。

后来在一篇文章的启发下,我重新思考并调整了对 Notion 的定位:
==Notion 不应该被当作笔记软件,而应该被视为一个“行动执行软件”。==
真正让 Notion 与众不同的,并不是它的编辑能力,而是它在 数据库管理、关系链接、画廊与信息流展示 方面的优势。它最擅长的,是连接前端输入的信息与后端沉淀的知识,并以此推动行动、督促行动。
当我明确 不再把 Notion 作为主要的写作工具和文档存储空间,而是将其定位为一个 超大号、沉浸式的待办与项目管理系统,只聚焦项目、任务与进度本身时,整个使用思路一下子清爽了许多。
现在,Notion 更像是一个 “点子 → 行动 → 项目 → 结果” 的集散地:
- 点子在这里被捕获
- 行动在这里被拆解
- 项目在这里被追踪
- 结果在这里被回顾
而文章写作与长期笔记,则逐步交还给更纯粹、更稳定的本地工具。工具各司其职,不再强行统一,反而让整个系统变得更加轻量、可控,也更容易长期坚持。

Review_Running
今年跑得并不算多,
断断续续,节奏也慢了下来。
上半年因为膝盖问题做了一次复查,
好在结果无大碍。
医生的建议很直接:
能休养就休养,但也不必彻底停掉运动,
一切适度。
跑步这件事,始终还是放不下。
相比其他运动,它最自由、最轻,
不需要场地、不需要搭档,
也几乎没有额外负担。
只要迈出去,就已经开始了。
自从膝盖出过状况之后,
跑步的心态明显变了。
不再执着于配速,也不再和过去的自己较劲,
改成了更“养生”的跑法——
一切从慢跑开始。
慢下来之后,反而发现了另一种可能。
在慢跑的过程中,可以完全放空,
也可以回顾正在学的内容、正在做的事情,
把注意力从步频和距离上移开。
不知不觉中,时间被拉长,
身体也更愿意继续往前。
或许跑步的意义,
早已不只是速度和成绩,
而是用一种不打扰生活的方式,
陪自己,走得久一点。
图片资源未同步:image-20251229180126414
图片资源未同步:image-20251229180216969
Review_Journey
旅行,往往避免不了自驾。
可自驾的意义,究竟在哪里?
从前几年以短途为主,到近几年不断拉长半径,
青银高速、京昆高速已经被完整地走过一遍。
一家三口出行,早已习惯大包小包,生活用品一应俱全,
走走停停,无拘无束,
计划可以临时更改,线路可以随时调整,
方向掌握在自己手里。
目的地固然是景点,
但自驾真正迷人的,是过程本身。
那些只在车里才会被大声播放的歌单,
只有在高速延伸、风景不断切换的途中,
才能被尽情享受、彻底释放。
最美的风景,始终在路上。
穿梭于平原、山间、峡谷与隧道,
每经过一座城市、一个县区、一处村落,
都能在不经意间,感受到不同的人文气息与生活节奏。
景区的浏览、打卡与游玩,
只是旅行的一个阶段性终点;
而真正留下痕迹的,
是路途中不断被打开的视野,
以及那些在行进中慢慢沉淀下来的内心感受。
或许,这正是这几年——
无论多远,依然首选自驾的原因。
图片资源未同步:image-20251229101223242
March | 保定·中国古动物博物馆
亚洲最大的自然博物馆,果然名不虚传。
一走进馆内就被震撼到——展陈设计非常用心,从“地球脉动”到“灭绝之殇”,五大常设展厅层层递进,循着时间轴缓缓展开,仿佛置身于亿万年的生命长河之中。灯光、影像与实物结合得恰到好处,沉浸感十足,大人看得入迷,孩子也能在互动中轻松理解科学知识,是非常适合亲子科教的一站。
逛完博物馆,顺便在保定市里慢慢走了一天。
离得这么近,却还是第一次认真逛保定市区,反倒有点惊喜。街巷里藏着不少别致的小咖啡馆,最有意思的是,竟然把保定特色的驴肉火烧和咖啡结合在一起——传统与新潮碰撞,意外地和谐。
图片资源未同步:image-20251220105039240
图片资源未同步:image-20251220105012409
April | 大同 · 云冈石窟
- 上一次来大同,还是疫情时期。
那时的目的地其实是乌兰察布,只在大同短暂停留了一天,没有真正走进古城,云冈石窟也因此错过,多少留下点遗憾。
所以这一次,行程很明确——直奔云冈石窟,把当年的空白补上。
景区比想象中要大得多,石窟沿着山体依次展开,佛像或雄浑、或细腻,在风沙与岁月中静默千年。一路几乎是走马观花地绕了一大圈,信息量巨大,体力消耗也不小,逛完只剩一个感受:真·累,但值。
- 晚上入住大同古城。
古城的夜景出乎意料地好看,城墙线条在灯光下显得厚重而安定,街巷铺陈得很开阔。面积之大,让人忍不住感叹——除了西安,或许就数大同了。
排队打卡了一家网红餐厅,味道在线;又在本地买了一瓶汾酒,小批量酿造的十万票,入口干净,回味绵长,很不错的汾酒系。
有些地方,真的不能只“路过”。
图片资源未同步:image-20251220104912892
图片资源未同步:image-20251220105107454
图片资源未同步:image-20251220105242169
April | 乌兰 · 哈达火山 :volcano:
- 大同的第二天,临时起意:再去一趟火山吧。
从大同一路向北,穿过乌兰察布,直入乌兰哈达火山群,沿途景色逐渐变得辽阔空旷,风吹草低,真有几分塞外的味道。
火山景区依旧是熟悉的配置——
人很多,风很大,体感温度直线下降,冷得人直缩脖子。现在景区已经有人统一管理,道路改成了单行线,只能一路往前开,不能折返。风实在太大,只在火山脚下短暂停留,拍了几张照,感受了一下荒原与火山交织的粗粝气息,便原路返回大同。
- 回到城里,继续吃吃喝喝、citywalk,节奏一下子又慢了下来。
返程途中顺路经过悬空寺和北岳恒山。悬空寺没有想象中那么惊艳,加上此前刚看过应县木塔,这次只在外面远远望了一眼,便匆匆离开,没有再进景区。
- 一路向南回庄,风景渐渐收敛,这趟行程也走到了尾声。
从石窟、古城,到火山与山岳,几天时间横跨了厚重的历史与荒凉的自然——
短暂,却很完整。> 图片资源未同步:image-20251220105338046
图片资源未同步:image-20251229102134704
图片资源未同步:image-20251229102328446
May | 青岛 & 烟台
- 上一次来青岛,已经是 N 年前的事了。
这些年几乎每年都会去一趟海边,离得近的选择来来去去,也就山东周边最方便。这次来青岛,本来计划自驾去崂山一带转转,看看山海相依的风景。
- 结果不出意外——
五一假期的威力,直接把人堵在了从市区去崂山的路上。看着一眼望不到头的车流,果断放弃,算了,不去了。回程索性沿着崂山沿海公路开回市里,反倒成了意外收获。
沿海公路没开多远就是一个公园或小景点,下车走走、散散步,节奏一下慢了下来。五月的海风还带着点凉意,下海确实有点冷,但在沙滩上随意坐下,吹风、看海、晒太阳,也足够惬意。
- 第二天临时改了行程,直奔烟台——养马岛。
只能说:惊喜万分,来对了。
果冻一样的海水、干净的沙滩、延伸进海里的栈桥、顺着海岸线铺开的公路,还有日出与日落,把关于“海”的所有美好一次性集齐。那一刻真心觉得,以后再想看海,直接来这里就够了。
在岛上租一辆小单车,慢慢环岛骑行,海风迎面而来,时间仿佛被拉长。
不赶行程,不设目标,只管往前骑——
这大概就是海边旅行最舒服的打开方式。
图片资源未同步:image-20251220105642256
图片资源未同步:image-20251220105819431
图片资源未同步:78644bb5f442e825d366f3696363d8dd
图片资源未同步:image-20251220105945246
June | 庄里 · 周边游
图片资源未同步:image-20251220150913621
July | 甘南 · 自驾
https://xsoul.life/articles/2025/43808/
🏔️ 三千海拔之上,绿浪托起红原,经幡卷走浮世尘埃,此程——见天地,见众生,终见本心
对甘南的向往,早在疫情前就已开始计划,便一再搁置。
七月,是甘南最美的时节。天空澄澈,草原一片青绿;而在六月份,那边还常常飘雪,虽寒,却能远眺皑皑雪山。等到七月中下旬,雨季便悄然而至,行程多了几分变数。
这次两周的假期,计划了三套方案:青甘大环线、北疆小环线、还有最早开始酝酿的甘南环线, 最终决定走甘南 —— 不仅因为筹划已久,更因为每个人心中,都藏着一个想去的地方。
我想去《魔兽世界》里的现实原型 —— ==莲宝叶则==,
莫菲一直惦记着==扎尕那==,
艾米则心心念念着==九寨沟==,
甘南环线恰好能一网打尽,三个人的愿望一个不落。
我们最终舍弃了最远端的色达:一方面是担心高海拔的反应,另一方面,如果要去九寨沟,就必须割舍掉色达。
权衡之下,行程套餐为:甘南环线附赠九寨沟
- 行程规划
一直notion 做旅行规划,很方便
图片资源未同步:image-20251220152611980
gantt
title 🚗 甘南+川北自驾环线行程 (11天) | 起终点:石家庄
dateFormat YYYY/MM/DD
axisFormat %m/%d
%% 假设出发日为 2025/09/20(您可按实际调整)
section 🛣️ 每日行车 & 住宿
Day1 石家庄 → 白银 (14h) :2025/09/20, 1d
Day2 白银 → 兰州 (1.5h) :2025/09/21, 1d
Day3 兰州 → 夏河 (3h) :2025/09/22, 1d
Day4 夏河 → 郎木寺 (3h) :2025/09/23, 1d
Day5 郎木寺 → 阿坝县 (3.5h) :2025/09/24, 1d
Day6 阿坝县 深度游 :2025/09/25, 1d
Day7 阿坝县 → 扎尕那 (5h) :2025/09/26, 1d
Day8 扎尕那 → 九寨沟 (5h) :2025/09/27, 1d
Day9 九寨沟 深度游 :2025/09/28, 1d
Day10 九寨沟 → 运城 (10h) :2025/09/29, 1d
Day11 运城 → 石家庄 (9h) :2025/09/30, 1d
section 🌄 景点 & 体验亮点
兰州:正宁路夜市 / 中山桥 :2025/09/21, 1d
夏河:拉卜楞寺 / 甘加秘境 :crit, 2025/09/22, 1d
郎木寺:纳摩大峡谷 :2025/09/23, 1d
阿坝县:各莫寺 / 莲宝叶则 :crit, 2025/09/24, 2d
扎尕那:若尔盖草原 / 九曲黄河 :crit, 2025/09/26, 1d
九寨沟:全天深度游览 :crit, 2025/09/28, 1d
section 🚩 关键节点
出发:石家庄 🏁 :milestone, m1, 2025/09/20, 0d
进入藏区:夏河 🏔️ :milestone, m2, 2025/09/22, 0d
川甘交界:郎木寺 🕌 :milestone, m3, 2025/09/23, 0d
高原核心:阿坝县 🏯 :milestone, m4, 2025/09/24, 0d
秘境扎尕那 🏞️ :milestone, m5, 2025/09/26, 0d
九寨沟景区 🌈 :milestone, m6, 2025/09/27, 0d
返程起点:运城 🚗 :milestone, m7, 2025/09/29, 0d
抵家:石家庄 🏠 :milestone, m8, 2025/09/30, 0d
兰州
- 第一天原本的计划,是一脚油门直接干到兰州
但考虑到全天都在开车,夜里再挤进兰州市区,正好撞上晚高峰,实在不太友好,索性在离兰州近一点的白银停了一晚,给行程留点余地。
- 白银这座城市,有点出乎意料
干净、安静,不张扬。住的全季酒店对面就是一大片公园和休闲广场,夜晚有人散步,有人闲坐,城市气息很松弛。第一印象就挺好,作为中转站,反而让人放松了下来。
- 第二天一早进兰州
节奏刚刚好,一整天都留给了这座城市。拉面自然是必须要吃上一碗的,热气腾腾,简单却满足。黄河从兰州市中心穿城而过,两岸都是宽阔的观光大道,城市的脉络被这条河自然地串联起来。
- 最有意思的是河岸边的生活方式->
很多商家直接摆出躺椅,面朝黄河而坐——有人打牌、有人聊天、有人拍照,也有人只是静静地发呆。泡一壶茶,看河水缓缓流过,真的可以从早坐到晚。这种不紧不慢的生活节奏,让人一下子就爱上了兰州。
- by the way,兰州是限号的。
第三天正式开启甘南之行,为了不受影响,一大早便顺利出城,继续向下一站出发。
黄河在身后渐渐远去,新的风景,也在前方等着展开。
图片资源未同步:image-20251220110344095
图片资源未同步:微信图片_2025-12-29_103227_483
夏河 | 拉卜楞寺
- 拉卜楞寺位于甘南藏族自治州夏河县,始建于清康熙四十八年,由第一世嘉木样大师创建,是藏传佛教格鲁派六大寺院之一,被誉为“世界藏学府”。
阳光下,红墙与金顶静静矗立,色彩明亮却不张扬。转经筒低沉而持续的嗡鸣声,与空气中淡淡的酥油茶香气交织在一起,仿佛一瞬间,与日常生活彻底隔开,进入了另一个世界。
- 真正被震撼的,是信仰本身。
每一尊佛像、每一幅壁画,都承载着跨越千年的故事;僧人们缓慢而规律的诵经声,像一股温柔却坚定的力量,让原本浮躁的心慢慢沉静下来。
远处是连绵起伏的群山,近处是缓缓转动的经筒,天地之间只剩下风声与偶尔掠过的鸟鸣。
那一刻,没有刻意的感动,却清晰地感受到——
什么叫作灵魂被洗涤。
图片资源未同步:image-20251220110931745
图片资源未同步:image-20251220111008552
图片资源未同步:image-20251229103521625
图片资源未同步:image-20250727141105132
郎木寺|纳摩大峡谷
- 郎木寺,一条河把甘肃与四川分开。
一边是人间烟火,一边是信仰净土,行走其间,总有种跨越边界的微妙感觉。
- 纳摩大峡谷,是郎木寺里一条低调却惊喜十足的徒步路线。
峡谷怪石嶙峋,地貌原始而野性,行走在其中,时不时能遇见探头探脑的土拨鼠,完全是意外加分的存在。因为路线大多在峡谷内部,几乎没有大风,体感非常友好,强度适中,但风景一点不打折。
徒步过程中,脚下是清晰的小径,身旁是高耸的岩壁与流动的光影,安静、专注,只有呼吸声和脚步声。相比草原的辽阔,这里更像是一段向内的行走。
📍 位置
郎木寺镇 · 四川格尔底寺内最深处 · 纳摩大峡谷
🍉 路线说明
从郎木寺镇进入四川格尔底寺,购票后可一路开车至寺庙最里面的停车场,继续步行约 50 米,即可看到纳摩大峡谷入口
🍉 徒步信息
- 全长:单程约 6 公里,往返 12 公里
- 路况:去程微上坡,返程为下坡
- 难度:强度适中,体验感强,适合轻徒步
如果说拉卜楞寺让人安静下来,
那纳摩大峡谷,则是在行走中,把自然与信仰一并收进心里。
图片资源未同步:image-20251220111558113
图片资源未同步:63251753193597_.pic
图片资源未同步:image-20251220111707889
图片资源未同步:62171752675734_.pic
图片资源未同步:image-20251220111816361
图片资源未同步:62131752675374_.pic
莲宝叶则⛰️—扎尕尔措湖🌊
甘南最期待的莲宝叶则-终于来啦
这里就是一座巨大的 “石头城堡”,山势雄奇险峻,石峰形态各异,有的如利剑直刺苍穹,有的似巨人屹立不倒,仿佛来自魔幻世界,极具视觉冲击力。 这里是远古巨神的战场遗迹,也是人间最接近魔界的净土——冷峻石峰刺破苍穹,碧玉湖泊倒映洪荒,每一步都踏在史诗的韵脚上。 当你站在4520米的观景台,看流云掠过嶙峋山脊,那一刻,肯定是天地辽阔,众生渺小。 不愧为“东方的魔幻世界”,小妞说:不是风动,不是幡动,仁者心动。
图片资源未同步:微信图片_20251220132128_1612_34
图片资源未同步:微信图片_2025-12-29_104640_761
图片资源未同步:微信图片_2025-12-29_104742_763
图片资源未同步:image-20251220131750097
图片资源未同步:微信图片_2025-12-29_104753_176
图片资源未同步:微信图片_2025-12-29_104759_218
图片资源未同步:微信图片_2025-12-29_104803_617
图片资源未同步:微信图片_2025-12-29_104809_357
图片资源未同步:微信图片_20251220132157_1619_34
图片资源未同步:微信图片_20251221083955_1625_34
图片资源未同步:微信图片_20251221083952_1624_34
甘加秘境/桑科草原/若尔盖/观影台/各种草原
- 真正的风景,其实都在路上。
甘加秘境的辽阔、桑科草原的舒展、若尔盖的湿地与天空,还有那些没有名字、却一眼难忘的草原——它们并不急着被记住,只是安静地铺展在车窗之外。
- 自驾的第一视角,让一切变得真实。
云影在草地上缓慢游走,牛羊零散地点缀其间,公路笔直地延伸向远方。没有滤镜,没有修饰,只有不断向前的方向感。
在观影台停下车,看风掠过草原,看光线一寸寸变化。
那一刻突然明白,有些地方不需要被“打卡”,只需要经过;
有些风景,也不必被拍下,只要你亲眼看过,就已经足够。
- 最美的风景,果然还是在路上。
图片资源未同步:image-20251220133101737
扎尕那
- 扎尕那,藏语意为“石匣子”,位于甘肃省甘南藏族自治州迭部县,被《国家地理》评为“此生必去的地方”。
作为国内非常成熟的初级高原路线之一,扎尕那也是甘南徒步的代表区域。
其中最经典的线路,当属扎尕那穿越大峪沟:
- 全程约 52 公里
- 累计爬升约 3000 米
- 平均海拔 3600 米
- 需翻越 4 个海拔 4000 米左右的垭口
这条线路几乎囊括了甘南最完整的自然景观:峡谷、雪山、森林、牧场、河流依次展开,植物垂直分布清晰,地貌类型极其丰富。百里石峰以构造峰林、冰川地貌与岩溶地貌为主,古冰川遗迹保存完整,行走其间,像是在翻阅一部立体的地质史书。
- 这次从仙女滩出发,沿着一线天方向,顺时针开启环线徒步。
然而走到石林一带时,天气突然转雨,后半段又是连续下山路,担心湿滑带来风险,只能选择原路折返。等真正下到山脚,天空却已放晴,云散光出,多少有点遗憾,也多了几分“留白”。
但扎尕那的魅力,并不只在徒步是否走完。
这里像陶渊明笔下的“世外桃源”,又浸润着藏地特有的神秘与庄严。山脉如同天地刻下的经文,层层叠叠;村庄静静依偎在山脚,人与自然保持着恰到好处的距离与尊重。
- 站在那里,会不自觉地放慢脚步、收起声音。
不是刻意安静,而是你会突然明白——
有些地方,本就不适合匆忙经过。
图片资源未同步:微信图片_2025-12-29_105456_753
图片资源未同步:微信图片_2025-12-29_105503_089
图片资源未同步:微信图片_2025-12-29_105518_331
图片资源未同步:微信图片_2025-12-29_105522_117
图片资源未同步:63801753193860_.pic
九寨沟
无需多言,美得近乎不真实。
这一程遇见的是清澈与宁静,
下一次,想留给秋天——
等山林层层染色,湖水映着斑斓,那时的九寨沟,必定更加动人。
图片资源未同步:image-20251220133401375
October | 云南 · 自驾
https://xsoul.life/articles/2025/e12120e1/
- 今年最长的一次自驾,也是里程最远的一次——
将近 6000 公里。
路线很“直给”:
石家庄 → 西安 → 都江堰 → 香格里拉 → 丽江 → 大理 → 都江堰 → 西安 → 石家庄。
一路几乎都是古城、古镇,在历史与烟火之间不断切换。
- 真正让人放松下来的,是沙溪古镇。
有风、有光、有人,却不吵闹。走在石板路上,不需要目的地,只是随意晃着,就已经很惬意,是这趟行程里最舒服的停靠点。
- 如果一定要给古城排个序——
丽江古城 > 独克宗古城 > 大理古城。
大理的氛围依然好,只是商业化最重,反而少了点松弛感。
- 也留下了一些遗憾:
南极洛、雨崩、老药山,因为时间不允许,这次都没能去成,只能留给下次。
- 真正后劲最大的,是虎跳峡徒步。
那种在峡谷中行走、仰望雪山的震撼,很难用照片完整表达。
雪山的存在感,在丽江就已经拉满——
抬头就能看到,干净、直接,让人第一次真切意识到自然的尺度。
- 还有一个小心得:
洱海边的民宿,一定要住一晚。
清晨和傍晚出门都很方便,光线、风、湖面,一天中最美的两个时刻,都在眼前。
这一趟云南自驾,没有刻意追满清单,
却在路上,慢慢走出了属于自己的节奏。
图片资源未同步:image-20251221095437644
长安
图片资源未同步:image-20251220133640370
香格里拉
图片资源未同步:image-20251220133743532
图片资源未同步:image-20251220133914485
图片资源未同步:image-20251220134043144
图片资源未同步:img
图片资源未同步:微信图片_20251008124130_3451_104
丽江
图片资源未同步:image-20251220133839761
图片资源未同步:微信图片_20251008200902_3457_104
图片资源未同步:image-20251220134327849
图片资源未同步:image-20251220134552568
虎跳峡-徒步
图片资源未同步:微信图片_20251007225010_3380_104_compressed
图片资源未同步:image-20251220140057343
图片资源未同步:image-20251220140123875
图片资源未同步:image-20251220140210521
大理
图片资源未同步:image-20251220134522397
图片资源未同步:image-20251220134625993
图片资源未同步:image-20251220135203736
November | 庄里 · CityWalk
- 我们总是习惯远行万里,去别的城市打卡、游逛,
却常常忽略了,离自己最近的那座城市,也藏着最真实的生活气息。
- 原来,自己的城市也可以这么美好。
熟悉的街角、不经意的打卡点、风格各异的建筑、热闹的小吃街,还有带着独特气质的艺术街区——这些平日被匆匆略过的地方,在慢下来之后,忽然都有了新的表情。
- 不赶时间,不设路线,只是随意走走。
城市不再只是“生活的背景”,而是重新被看见的风景。
- 有时候,真的不必远行万里。
放慢脚步,在周边遛达一圈,就能发现——
原来美,一直都在身边。
悬崖书店
图片资源未同步:image-20251220140426697
中山里
图片资源未同步:image-20251220140516833
河北美院
图片资源未同步:image-20251220140544359
December | 济南 & 忻州
济南
第二次来到泉城。
天气正好,阳光落在城里,也落在泉水上。
不急着安排,只是走走看看,感受这座城市在冬日里,依旧缓慢而温润的节奏。
图片资源未同步:image-20251221105653394
图片资源未同步:image-20251220140644249
图片资源未同步:image-20251220140657740
忻州古城
离得不远,却一直说要去逛逛。
索性赶在元旦前一周出发,人少、节奏刚好,周六去,周日回。
住宿选了亚朵,
一句话评价:360° 无死角的好。
无论位置、舒适度还是细节,都很在线,值得推荐。
走过不少古城古镇之后,再看忻州古城,
最明显的感受是——
它没有那么“刻意商业化”。
小吃大多是当地民间口味,
真实、接地气,
不是那种在各地古镇反复出现的“通用款”。
味道在线,价格也友好,
随便走、随便吃,都不会有被套路的感觉。
不喧哗、不浮夸,
更像一座还在好好生活的老城。
也正因为这样,
反而让人愿意多走几条街,多停一会儿。
图片资源未同步:image-20251229154156516
图片资源未同步:0ae4ab98daf7380f9386b5e90b13aef4
图片资源未同步:757da32ea0a50fd95ec55455a20c6c82
图片资源未同步:72394db8ffbcf2d80025d0062d8d2c02
图片资源未同步:1cb92a14f23211dab523256478f0261f
Review_Life
独处最好的伴侣,
是咖啡、酒,和进山。
- 咖啡适合白天。
它不让人逃离现实,而是陪你正面迎上去。
一杯下肚,思路变得清晰,情绪被压低,世界被重新对焦。
你坐在窗边、桌前,或咖啡馆的一角,
不说话,也不需要被打扰,
只是让时间,慢慢从杯沿流走。
- 酒更适合夜晚。
它不追求答案,只负责松动。
松动白天的克制,松动没说出口的话。
微醺刚刚好,不必痛快,也不必逃避,
只是让情绪有一个出口,
让自己短暂地,放过自己。
- 而进山,发生在更深的时刻。
没有网络、没有标签、没有角色。
只有坡度、风向、呼吸和脚下的路。
身体在前,念头在后,
当你喘着气抬头看山,
那些原本放不下的东西,
忽然就没那么重要了。
咖啡,让人清醒地独处;
酒,让人诚实地独处;
进山,让人彻底地独处。
它们不喧哗、不陪聊,
却在你需要的时候,
刚好在场。
图片资源未同步:微信图片_20251220104212_1607_34
关于Coffee
生活有时候太寡淡了
前几天刷到了美团的年终报告,
才后知后觉地发现——
原来这一年,自己点了这么多杯咖啡。
如果再算上其他平台、还有在家自己折腾的那些……
嗯,还是不要细算了。
咖啡,不知不觉成了生活的必需品。
也问过自己:为什么要喝?
提神?习惯?还是某种仪式感?
喝到现在,反而说不清答案了。
就像大人喝茶一样,不需要理由,时间久了,自然就离不开。
生活有时候太寡淡了,
总得自己给自己加点料。
不管是什么味道——
微苦、回甘,还是五味杂陈。
图片资源未同步:微信图片_20251220103645_1595_34
有人说,
浓缩的不是咖啡,是我逝去的时光。
白昼里的咖啡馆,成了孤独者的天堂,
一杯热咖啡摆在桌上,世界就安静了一小会儿。
咖啡的苦涩,很像生活本身。
不讨好,却真实。
也难怪它总是和孤独并肩出现——
像一对天生的伴侣。
对我来说,
咖啡更像是一种提醒——
提醒自己停下来,坐一会儿,
让思绪重新变得鲜活。
或许,
我喝的从来不只是咖啡,
而是生活里,那一点点尚未被消磨掉的热度。
图片资源未同步:image-20251221111419870
美式,找回一点“纯粹”
今年,开始偏爱美式。
也许是这个世界越来越复杂,人也慢慢被消耗得有点累了,
就会不自觉地想,找回一点“纯粹”。
又或者理由没那么宏大——
只是单纯地,喜欢纯粹本身。
美式咖啡,其实是最接近咖啡本真的存在。
它的结构极其简单:
意式浓缩(Espresso)+ 水。
没有多余的修饰,只是一次克制的稀释。
这种简单,降低了浓缩的刺激感与苦度,却最大限度地保留了原始风味——
花果香、坚果味、明亮的果酸,都会在水的延展下,慢慢显现。
它不急着讨好,
不靠甜,不靠奶,只靠时间和温度,把风味铺展开来。
你喝得越慢,它越稳定。
在办公桌前,一杯美式可以陪伴很久,
风味不会骤变,也不会让味觉疲劳。
不像奶咖,放久了会分层、变凉、变腻;
美式始终清爽、克制、不打扰。
不甜、不腻、不抢戏,
却稳定地存在着。
喝到后来才发现,
偏爱的或许并不是美式本身,
而是它所代表的那种状态:
简单、清晰、不多解释,
在复杂的日常里,保留一小块纯净。
图片资源未同步:微信图片_20251221115200_1631_34
关于alcohol
白酒
人到中年,
总会开始接受“小酌”和“微醺”这件事。
是年纪大了么?
也许只是,终于学会与节奏相处了。
清香型里,汾酒依然是绕不开的存在。
在山西本地买过几次小批量酿造的五万票、十万票,整体干净、回甘明确,表现稳定,值得推荐。
市面常规款中,巴拿马系列依然在线,是清香型里很难出错的选择。
酱香方面,自从价格逐渐回归理性,
茅系酒反而越喝越有劲。
金王子几乎可以说是 200 以内性价比的封王之选,
结构清晰,层次到位,没太多花活,但胜在踏实。
清香的美,在回口甘甜;
酱香的魅力,只能用一个“酱”字来概括——
厚、深、慢慢展开。
个人更偏好贵酱的茅系,
相比川酱的郎酒,风味更耐品, 更饱满。
尤其喜欢倒酒的那一刻——
高山流水,细水长流,
漂亮的酒花泛起,情绪价值瞬间拉满。
旅途中也喝到过一些地方酒。
甘南的青稞酒,简单直白;
大理的 “地道云南”,出乎意料,值得一试。
图片资源未同步:微信图片_20251221190402_1632_34
威士忌
威士忌里,始终最爱单一麦芽。
生日时趁优惠入手了一瓶 格兰菲迪 15 年,
那种纯粹,很像美式咖啡——
适合纯饮,不必多言。
图片资源未同步:2025-05-24 142831
慢慢品,杂念自然就少了,
只剩下酒体本身。
图片资源未同步:微信图片_20251221192021_1639_34
红酒
红酒喝得最多的,还是 赤霞珠。
最近尝试了 黑皮诺,对我来说实属偏淡;
西拉和 梅洛的酸度与单宁相对中等,
酒体饱满,日常饮用友好。
图片资源未同步:微信图片_20251221192017_1638_34
如果需要入门或参考,
醉鹅娘的推荐,整体思路还是值得信赖的。
酒喝到后来,
早已不追求多与烈,
而是在某个合适的时刻,
让味道,刚好与心境对齐。
关于Movie
《轻于鸿毛》
《轻于鸿毛》里,真正被反复追问的,并不是“轻”,
而是——什么才算得上有重量。
轻如鸿毛的,或许从来不是生命本身,
而是那些被忽视的选择、被压抑的自我、
以及在他人期待中逐渐失去的方向。
影片所呈现的重量,
来自于直面真实的勇气,
来自人与人之间不被轻易放弃的理解,
也来自某一刻的清醒——
你终于看清,哪一片天空,值得自己全力飞翔。
相较于“轻”,
真正的“重”,从不取决于你拥有什么,
而在于你是否敢于成为自己。
当女性不再活成他人生命的注脚,
当一个人敢于直面破碎,并亲手重建,
一片羽毛,也能落地成磐。
影片并不高声宣告答案,
却在细节中,一点点积蓄力量。
==By the way:歌曲推荐==
插曲 《Got What It Takes》 – SATV Music,
情绪出现得恰到好处,值得单独收藏。
图片资源未同步:image-20251221140802183
关于Music
Rock ’n’ Roll
最近刷视频时,偶然刷到一个段子,
用一句话解释了摇滚和流行音乐的区别,
简单,却特别有灵魂:
摇滚,是对生活的不服。
流行音乐,就是服了。
当下就被击中了。
摇滚抒发的情绪,往往来得直接而真实。
它不负责安慰,也不刻意讨好,
却总能在某一个恰好的时刻,应景、映心。
翻了翻这一年的歌单,
依旧是那份百年不变的底子。
偶尔只是在某个乐队里,
多加了几首非热门、从前没认真听过的歌。
结果很诚实——
上头,有味。
摇滚对我来说,
从来不只是音乐风格,
而是一种态度:
在生活已经足够复杂的前提下,
至少在耳朵里,
还保留着一点不服输的声音。
图片资源未同步:image-20251229174603932
谢天笑-超级本能
最近在循环老谢的 《超级本能 Live》。
旧歌重新编曲,加入电子元素之后,
熟悉的旋律被重新点燃,
一下子就——太上头了。
那些原本就有力量的歌,
在电子音色的加持下,
节奏更锋利,情绪更直接,
忽然想到今年的“新能源电车”。
百花齐放、推陈出新,
这么一想,
老谢的这些热门歌,
也算是“新能源版本”嘛——
还是那个人、那些旋律,
但动力更猛,续航更长,
一脚下去,全是情绪输出。
老歌不老,
只是等一个合适的时代,
再被点燃一次。
图片资源未同步:image-20251221205046713
关于Hiking
以前总想不通,人为什么会喜欢户外,
喜欢往山里钻,把自己交给风、路和不确定性。
这一年,真正正儿八经的徒步,其实并不多。
计划列了不少地方,却没能一一兑现,很多行程,最后都停留在“想去”。
但回头再想,真正让人回味无穷的,也就这三次——
- 纳摩大峡谷徒步
- 扎尕那徒步
- 虎跳峡徒步
在峡谷里行走,在高原喘着气抬头看山,
身体很累,脑子却异常清醒。
没有多余的念头,只有脚下的路和眼前的风景。
大概就是在这些时刻,才慢慢明白——
人之所以喜欢户外,
不是为了抵达哪里,
而是为了,在山里,把自己找回来。
图片资源未同步:微信图片_2025-12-29_105421_904
图片资源未同步:微信图片_20251220111113_1609_34
图片资源未同步:微信图片_2025-12-29_110724_915
图片资源未同步:微信图片_2025-12-29_110923_598
图片资源未同步:微信图片_20251220132134_1613_34
图片资源未同步:微信图片_2025-12-29_111018_912
关于Family
家里的分工其实一直很清晰。
我负责外出工作,
莫菲负责家务与艾米的学习教育。
看似不同的角色,但同等重要。
最近几次休假,真正完整地在家接娃、送娃、做饭、打理一切家务,
只坚持了一天,就已经很清楚地感受到了其中的不易。
一天三次往返接送,
尤其是在冬天,是真的冷,也是真的累。
很多家庭选择报各种课外辅导班,
艾米却没有报任何一个。
在学校依然保持名列前茅,
这一切,离不开莫菲长期的陪伴与用心。
无形中,也为家庭省下了一笔不小的开销。
生活被打理得井井有条,
看似日常、却需要持续的付出与耐心。
即便是组队生活多年,
也依然需要记得感恩与尊重。
辛苦了,@莫菲。
图片资源未同步:微信图片_2025-12-29_110716_784
关于Harvest
大模型时代,确实给“牛马们”提供了前所未有的便利。
就我自己的使用体验而言,这种改变是实实在在的。
以前开发一个新项目,往往要在「可行」与「不可能」之间反复拉扯;
而现在,从零到一个可用的小项目、小工具,往往只需要几天。
无论是前后端,还是此前从未涉足的领域与技术,
很多曾经的门槛,都被直接拉平了。
不夸张地说,对大模型,已经形成了相当程度的依赖。
在日常工作中,也逐渐形成了一套更高效的工具习惯。
文档几乎全部基于 Markdown 编写,
结构清晰、可迁移性强;
报告和文档的传递与同步,则更多使用 HTML,
简单、友好、无需额外负担。
流程图和图表的习惯也发生了变化。
从最早的 draw.io、Excalidraw,
逐渐转向 Mermaid。
当大模型 + Mermaid 结合在一起,
出图这件事,几乎变成了“顺手而为”。
但在使用越深之后,也有一个越来越清晰的认知:
即便大模型再强,元数据、核心思想和方向,依然只能来自自己。
模型负责的是润色、扩展、优化和执行,
而“要做什么、为什么做、往哪走”,
最终的决定权,始终在我们手里。
说到改变,其实很多时候并不宏大。
人真正发生变化,往往只是迈出了第一步。
从小事、从细节开始。
有时候,所谓的“心灵鸡汤”,反而是有用的。
就像读一本书,读到热血沸腾——
别急着否定自己“可能坚持不了”。
先做第一步。
如果鸡汤只能管三天,那三天后,再给自己续一碗。
极简的改变,往往从最琐碎的日常开始。
比如前段时间,只是买了一块电脑桌垫,
顺手把工位和桌面重新整理了一遍。
从那之后,桌面不再杂乱,
视觉干净了,心里也跟着舒坦起来。
一个小小的桌垫,
反而成了我坚持桌面整洁的“外界刺激”。
它的价值,早已超过了物品本身。
很多看似不起眼的改变,
都会在不经意间,推动你持续前行。
无论是自律清单,还是计划表,
它们也许并不完美,
但至少——
你已经迈出了第一步。
图片资源未同步:image-20251229172221847
End >2026
2026 年,注定充满未知与希望。
我们无法掌控未来的变化,却始终可以掌控自己的生活状态。
规律,让人在变化中保持稳定;
节制,让人在欲望中保持清醒。
不必追求一蹴而就,
也不必苛责不完美的自己。
从当下的小事做起,
建立属于自己的节奏,
学会适度克制,持续前行。
当规律成为习惯,
当节制内化为态度,
生活不再混乱如麻,
而是逐渐清晰、有序。
那时,才会拥有足够的底气,
去迎接 2026 年的挑战,
去实现那些真正重要的目标——
也包括培养一种「遇事能扛」的硬核能力。
事过翻篇,
不恋过往,不困于心。
愿我们都能在规律与节制中,
活成自己喜欢的样子,
把 2026 年,
过得踏实、从容,且有力量。
