零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程 - TTGF - 博客园

mikel阅读(15)

来源: 零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程 – TTGF – 博客园

零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程 


在这里插入图片描述

前言:为什么选择 Clawdbot (Moltbot)?

Clawdbot 不仅仅是一个聊天框。它是一个 智能体(Agent),意味着它有“手”和“脚”:

  • :它可以读写你电脑上的文件、执行代码、操控命令行。
  • :它可以联网搜索、访问 Google、分析网页。
  • 大脑:你可以接入云端的 API,也可以利用自己的 GPU 运行本地模型。

第一阶段:基建工程(环境准备)

1.1 解决 Node.js 安装与版本问题

1.1.1全新安装Node.js(电脑未安装过Node.js时)

如果你的电脑上从来没装过Node.js,无需执行卸载、删残留的步骤,直接按以下流程全新安装即可,步骤适配Windows系统,新手友好、全程默认下一步即可。

1. 下载适配的Node.js安装包

  1. 打开Node.js 官方官网,官网页面会自动识别你的系统(Windows);
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 点击下载Windows Installer (64-bit) 格式的安装包(.msi后缀,64位是目前Windows电脑的主流,无需选32位);

    小贴士:下载时建议保存到桌面/下载文件夹,方便找到安装包。

2. 安装Node.js(全程新手友好,默认下一步即可)

  1. 双击刚下载的.msi安装包,弹出安装向导,点击Next
  2. 勾选同意协议(I accept the terms in the License Agreement),点击Next
  3. 关键点1:确认安装路径(默认是C:\Program Files\nodejs\,新手不要修改,避免后续环境变量出问题),直接Next
  4. 关键点2:进入「Custom Setup」自定义安装页,所有选项默认勾选即可(重点确认Add Node.js to PATH已勾选,这一步会自动把Node.js加入系统环境变量,不用手动配置,是最关键的一步),直接Next
  5. 后续页面无需修改任何高级选项,一直点击Next,最后点击Install开始安装,等待10-30秒(安装速度看电脑配置);
  6. 安装完成后,点击Finish关闭向导即可。

3. 版本验证
必须重启终端(关闭所有已打开的PowerShell/CMD,重新打开),否则系统识别不到新安装的Node.js!

  1. 按下Win+R,输入PowerShell,打开普通权限的PowerShell即可;
  2. 输入验证命令:
    node -v
    
  3. 回车后,若显示v22.x.xv24.x.x(比如v22.10.0、v24.4.0),说明安装成功且版本符合要求;

    可选验证:输入npm -v,会显示配套的npm版本(Node.js安装包会自动附带npm,无需单独安装),能正常输出版本即代表环境变量配置无误。
    在这里插入图片描述


1.1.2卸载旧版Node.js 安装新版(电脑安装过Node.js但是版本不够新时)

如果版本不够新,执行安装命令的时候程序会尝试安装新版的Node.js,但是大概率会失败,还是手动比较好,失败的话会显示以下界面:
在这里插入图片描述
操作:
1.可以直接通过新的安装包对上一个版本的Node.js进行remove
在这里插入图片描述

  1. 去“控制面板”卸载旧的 Node.js。
  2. 关键点: 手动进入 C:\Program Files\nodejs 文件夹,把残留的文件全部删干净!
  3. 前往 Node.js 官网 下载最新的 v22 或 v24 稳定版并安装。
  4. 清楚之前的旧的环境变量(这一步非常重要!)
  • 验证: 重新打开 PowerShell,输入 node -v。看到显示 v22.x 或 v24.x 才算过关。
  1. 版本验证(和卸载旧版后的验证步骤一致)
    必须重启终端(关闭所有已打开的PowerShell/CMD,重新打开),否则系统识别不到新安装的Node.js!
  2. 按下Win+R,输入PowerShell,打开普通权限的PowerShell即可;
  3. 输入验证命令:
    node -v
    
  4. 回车后,若显示v22.x.xv24.x.x(比如v22.10.0、v24.4.0),说明安装成功且版本符合要求;

    可选验证:输入npm -v,会显示配套的npm版本(Node.js安装包会自动附带npm,无需单独安装),能正常输出版本即代表环境变量配置无误。
    在这里插入图片描述

1.2 解锁脚本执行权限

  • 问题: Windows 默认禁止运行脚本,会导致安装指令失效。
  • 操作: 以管理员身份运行 PowerShell,执行:
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
    

在这里插入图片描述

完成以上步骤后,你的Node.js环境就完全满足Clawdbot的要求了,可以直接进入后续的项目安装环节。


第二阶段:正式安装与初始化

2.1 执行一键安装

  • 操作: 在 PowerShell 输入:
    iwr -useb https://clawd.bot/install.ps1 | iex
    
  • 作用: 这行代码会自动下载主程序并配置环境变量。
    在这里插入图片描述
    这个会持续一会才有进展,不要担心,如果太久可以按按回车看看是不是powershell刷新的问题
    在这里插入图片描述
    这个会持续一段时间才有进展,不要担心,

2.2 运行向导 (Onboarding)

  • 操作: 输入 moltbot onboard
  • 详细选项说明:
    1. Mode:选 QuickStart
    2. Provider (大脑):建议选 Qwen
      • 注意: 此时会跳出网页让你授权,登录或者注册Qwen的账号既可。这步是为了先让机器人有个“临时大脑”跑起来。
        在这里插入图片描述
        在这里插入图片描述
        选择OpenAI Chat,拿到Key之后输入到界面中给Clawdbot。
        在这里插入图片描述
        选择这个直接按回车即可。
    3. Channels (远程控制):选 Skip for now。我们先在本地跑通,以后再连 Telegram。
      在这里插入图片描述
    4. Skills (技能):选 Yes
      在这里插入图片描述这些是最基本的Skill选择,选择Yes就好
    5. Skill install:选 npm

在这里插入图片描述

  1. Skill Dependencies:选 Skip for now
    在这里插入图片描述
    这些是扩展的,目前配置比较麻烦,可以后续再配置
    6. 一些其他配置
    在这里插入图片描述
    选择No,尽量都留到后面再配置
    在这里插入图片描述

2.3 成功界面

在这里插入图片描述
在这里插入图片描述


第三阶段:破解“命令找不到”与“网关未授权”

3.1 解决 moltbot 命令失效

  • 现象: 安装完输入 moltbot open 提示“无法识别”。
    在这里插入图片描述
  • 原因: 环境变量未刷新。
  • 对策: 重启 PowerShell 窗口。如果还不行,执行npx moltbot open。

3.2 提取身份令牌 (Token) 登录网页

  • 现象: 访问 http://localhost:18789 显示“未授权:网关令牌缺失”。
    在这里插入图片描述
  • 操作:
    1. 打开文件夹 C:\Users\你的用户名\.clawdbot
    2. 右键点击 clawdbot.json,用记事本打开。
      在这里插入图片描述
    3. 找到 "token": "xxxxxxx" 这一行,复制那串长代码。
      在这里插入图片描述
    4. 回到浏览器,点击右上角红色状态,把 Token 贴进去。一旦变绿,恭喜你,你的助理正式上线了!
      在这里插入图片描述

第四阶段:配置各种API

  • 操作步骤:
    1. 在网页后台点击左侧 Skill(技能)
      在这里插入图片描述
      可以看到有非常多的API可以配置,过程相对来说还是比较繁琐的,有机会的话下次专门再出一期博客来讲,目前的话他可以实现通过对话来进行一些本地的文件操作,命令操作等等。整体来说还是不错的


总结:你的 AI 现在能干什么?

  1. 对话:你可以问它任何问题。
  2. 读文件:把代码发给它,或者让它读你 F 盘的文档。
  3. 本地代码执行:让它用 Python 画一个股价走势图。

部署贴士总结:

  • Node 版本必须 v22+
  • Token 在配置文件里找
  • 本地 GPU 模型用 Ollama 桥接
  • Google 搜索一定要开“搜索全网”开关

恭喜你完成了部署!现在,你的 Windows 已经不仅仅是一台电脑,而是一个拥有最强国产模型大脑和本地硬件加速的超级助手了。

基于NetCorePal Cloud Framework的DDD架构管理系统实践 - 红泥巴煮雪 - 博客园

mikel阅读(10)

来源: 基于NetCorePal Cloud Framework的DDD架构管理系统实践 – 红泥巴煮雪 – 博客园

前段时间在做一个管理系统的项目,想尝试一下DDD架构在实际项目中的应用。经过一番调研,最终选择了NetCorePal Cloud Framework作为基础框架,结合.NET 10和Vue 3搭建了一套完整的前后端分离架构。今天就想和大家分享一下这个项目的架构设计和技术选型,希望能给正在做类似项目的朋友一些参考。

项目源码地址:https://github.com/zhouda1fu/Ncp.Admin

项目概述

这个项目是一个典型的企业级管理系统,包含了用户、角色、部门等基础功能模块。在技术选型上,采用了目前比较主流的技术栈:

后端方面,使用.NET 10作为主要框架,配合EF Core做数据访问,FastEndpoints替代传统的Controller,MediatR实现CQRS模式。数据存储支持MySQL、PostgreSQL和SQL Server,消息队列选择了RabbitMQ(通过CAP框架集成),缓存用Redis,还集成了.NET Aspire来做云原生的基础设施管理。

前端部分基于Vben Admin,这是一个非常优秀的Vue 3 + TypeScript + Vite的管理后台模板,UI组件用的是Ant Design Vue,整体体验不错。

架构设计

分层架构

整个项目采用了经典的三层架构,这个结构应该很多做DDD的朋友都比较熟悉。三层之间的依赖关系是单向的:Web层依赖Infrastructure层,Infrastructure层依赖Domain层,Domain层作为核心,不依赖任何其他层。

Ncp.Admin
├── Domain(领域层)
│   ├── AggregatesModel(聚合模型)
│   └── DomainEvents(领域事件)
├── Infrastructure(基础设施层)
│   ├── EntityConfigurations(实体配置)
│   └── Repositories(仓储实现)
└── Web(表现层)
    ├── Application(应用服务层)
    │   ├── Commands(命令)
    │   ├── Queries(查询)
    │   └── DomainEventHandlers(领域事件处理器)
    └── Endpoints(API端点)

这种分层的好处是职责清晰,Domain层只关注业务逻辑,Infrastructure层负责技术实现,Web层处理HTTP请求和响应。

核心设计模式

1. 领域驱动设计(DDD)

在这个项目中,DDD主要体现在聚合根的设计上。每个聚合根都有自己的业务边界,状态只能通过业务方法来修改。就拿部门这个聚合根来说吧:

/// <summary>
/// 部门ID(强类型ID)
/// </summary>
public partial record DeptId : IInt64StronglyTypedId;

/// <summary>
/// 部门聚合根
/// </summary>
public class Dept : Entity<DeptId>, IAggregateRoot
{
    public string Name { get; private set; } = string.Empty;
    public string Remark { get; private set; } = string.Empty;
    public DeptId ParentId { get; private set; } = default!;
    public int Status { get; private set; } = 1;
    
   
    protected Dept() { }
    
    // 业务方法:更新部门信息
    public void UpdateInfo(string name, string remark, DeptId parentId, int status)
    {
        Name = name;
        Remark = remark;
        ParentId = parentId;
        Status = status;
        UpdateTime = new UpdateTime(DateTimeOffset.UtcNow);
        
        // 发布领域事件
        AddDomainEvent(new DeptInfoChangedDomainEvent(this));
    }
    
    // 软删除
    public void SoftDelete()
    {
        if (IsDeleted)
        {
            throw new KnownException("部门已经被删除");
        }
        IsDeleted = true;
        UpdateTime = new UpdateTime(DateTimeOffset.UtcNow);
    }
}

这里有几个设计点我觉得值得说一下。首先是强类型ID,比如DeptId,这样可以避免把部门ID和用户ID搞混,编译器就能帮你检查出来。其次是属性都用private set,外面不能直接修改,必须通过业务方法,这样就保证了业务规则的一致性。另外,当部门信息变更时会发布领域事件,这样可以通知其他需要同步更新的地方,比如用户表中的部门名称。

2. CQRS模式(命令查询职责分离)

CQRS在这个项目中主要体现在读写分离上。写操作通过命令(Command)来处理,读操作通过查询(Query)来处理。这样做的好处是职责清晰,而且可以针对不同的场景做优化。

写操作这边,命令的定义很简单,就是一个record。每个命令都有对应的验证器和处理器。看一个创建部门的例子:

/// <summary>
/// 创建部门命令
/// </summary>
public record CreateDeptCommand(string Name, string Remark, DeptId? ParentId, int Status) 
    : ICommand<DeptId>;

/// <summary>
/// 命令验证器
/// </summary>
public class CreateDeptCommandValidator : AbstractValidator<CreateDeptCommand>
{
    public CreateDeptCommandValidator(DeptQuery deptQuery)
    {
        RuleFor(d => d.Name).NotEmpty().WithMessage("部门名称不能为空");
        RuleFor(d => d.Name)
            .MustAsync(async (n, ct) => !await deptQuery.DoesDeptExist(n, ct))
            .WithMessage(d => $"该部门已存在,Name={d.Name}");
        RuleFor(d => d.Status).InclusiveBetween(0, 1).WithMessage("状态值必须为0或1");
    }
}

/// <summary>
/// 命令处理器
/// </summary>
public class CreateDeptCommandHandler(IDeptRepository deptRepository) 
    : ICommandHandler<CreateDeptCommand, DeptId>
{
    public async Task<DeptId> Handle(CreateDeptCommand request, CancellationToken cancellationToken)
    {
        var parentId = request.ParentId ?? new DeptId(0);
        var dept = new Dept(request.Name, request.Remark, parentId, request.Status);
        
        await deptRepository.AddAsync(dept, cancellationToken);
        
        // 注意:不需要手动调用SaveChanges,框架会自动处理
        return dept.Id;
    }
}

验证器这里用了FluentValidation,支持同步和异步验证。比如检查部门名称是否已存在这种需要查数据库的验证,就可以用异步的MustAsync

读操作这边,直接使用DbContext,而且可以用投影来优化性能。比如获取部门树的时候,只选择需要的字段:

/// <summary>
/// 部门查询服务
/// </summary>
public class DeptQuery(ApplicationDbContext applicationDbContext) : IQuery
{
    private DbSet<Dept> DeptSet { get; } = applicationDbContext.Depts;
    
    /// <summary>
    /// 获取部门树(使用投影优化性能)
    /// </summary>
    public async Task<IEnumerable<DeptTreeDto>> GetDeptTreeAsync(
        bool includeInactive = false, 
        CancellationToken cancellationToken = default)
    {
        // 使用投影只选择需要的字段,减少内存占用
        var allDepts = await DeptSet.AsNoTracking()
            .WhereIf(!includeInactive, d => d.Status != 0)
            .Select(d => new DeptTreeNode
            {
                Id = d.Id,
                Name = d.Name,
                Remark = d.Remark,
                ParentId = d.ParentId,
                Status = d.Status,
                CreatedAt = d.CreatedAt
            })
            .ToListAsync(cancellationToken);
        
        // 在内存中构建树形结构
        return BuildTreeStructure(allDepts);
    }
}

这样读写分离的好处是,查询这边可以针对不同的查询场景做优化,比如用投影减少内存占用,或者将来可以加缓存、用读库等,而不会影响写操作的逻辑。

3. 事件驱动架构

事件驱动这块,项目实现了领域事件和集成事件两种机制。领域事件主要用于聚合内部的同步操作,集成事件用于跨服务通信。

比如说,当部门信息变更的时候,需要同步更新用户表中的部门名称。这个过程就可以通过领域事件来实现:

/// <summary>
/// 部门信息变更领域事件
/// </summary>
public record DeptInfoChangedDomainEvent(Dept Dept) : IDomainEvent;

然后在事件处理器中处理这个逻辑:

/// <summary>
/// 部门信息变更领域事件处理器 - 用于更新用户部门名称
/// </summary>
public class DeptInfoChangedDomainEventHandlerForUpdateUserDeptName(
    IMediator mediator, 
    UserQuery userQuery) 
    : IDomainEventHandler<DeptInfoChangedDomainEvent>
{
    public async Task Handle(DeptInfoChangedDomainEvent domainEvent, CancellationToken cancellationToken)
    {
        var dept = domainEvent.Dept;
        var deptId = dept.Id;
        var newDeptName = dept.Name;
        
        // 查询所有属于该部门的用户ID
        var userIds = await userQuery.GetUserIdsByDeptIdAsync(deptId, cancellationToken);
        
        // 通过Command更新每个用户的部门名称(而不是直接操作数据库)
        foreach (var userId in userIds)
        {
            var command = new UpdateUserDeptNameCommand(userId, newDeptName);
            await mediator.Send(command, cancellationToken);
        }
    }
}

这样设计的好处是,部门聚合和用户聚合之间没有直接依赖,通过事件来通信。如果将来需要增加新的业务逻辑,比如部门变更时要发送通知,只需要再加一个事件处理器就行了,不需要改现有的代码。

4. FastEndpoints轻量级API框架

在API设计这块,项目选择了FastEndpoints而不是传统的Controller。主要是觉得FastEndpoints的代码更简洁,性能也更好。一个端点就是一个类,职责清晰。

看一个创建部门的例子:

/// <summary>
/// 创建部门的API端点
/// </summary>
[Tags("Depts")]
public class CreateDeptEndpoint(IMediator mediator) 
    : Endpoint<CreateDeptRequest, ResponseData<CreateDeptResponse>>
{
    public override void Configure()
    {
        Post("/api/admin/dept");
        AuthSchemes(JwtBearerDefaults.AuthenticationScheme);
        Permissions(PermissionCodes.AllApiAccess, PermissionCodes.DeptCreate);
    }
    
    public override async Task HandleAsync(CreateDeptRequest req, CancellationToken ct)
    {
        var cmd = new CreateDeptCommand(req.Name, req.Remark, req.ParentId, req.Status);
        var deptId = await mediator.Send(cmd, ct);
        var response = new CreateDeptResponse(deptId, req.Name, req.Remark);
        await Send.OkAsync(response.AsResponseData(), cancellation: ct);
    }
}

代码很简洁,一个类就把路由、认证、权限都配置好了。请求和响应都是强类型的,类型安全有保障。而且测试起来也很方便,不需要启动HTTP服务器,直接测端点就行了。

几个核心特性

1. 强类型ID

这个项目里所有聚合根都用强类型ID,而不是直接用longint。比如部门ID是DeptId,用户ID是UserId。这样做的好处是编译器能帮你检查类型错误,不会把部门ID和用户ID搞混。

使用起来也很简单:

// 定义强类型ID
public partial record DeptId : IInt64StronglyTypedId;

// 使用强类型ID
var deptId = new DeptId(123);
var parentId = request.ParentId ?? new DeptId(0);

框架会自动处理序列化和类型转换,用起来很顺手。

2. 仓储模式

仓储这块,写操作通过仓储来处理,查询操作直接使用DbContext。仓储的实现很简单:

/// <summary>
/// 部门仓储接口
/// </summary>
public interface IDeptRepository : IRepository<Dept, DeptId> { }

/// <summary>
/// 部门仓储实现
/// </summary>
public class DeptRepository(ApplicationDbContext context) 
    : RepositoryBase<Dept, DeptId, ApplicationDbContext>(context), 
      IDeptRepository { }

框架会自动管理事务和SaveChanges,命令处理器里不需要手动调用,这样代码更简洁,也不容易出错。

3. 验证机制

验证用的是FluentValidation,支持同步和异步验证。比如创建部门的时候,需要检查部门名称是否已存在,就可以用异步验证:

public class CreateDeptCommandValidator : AbstractValidator<CreateDeptCommand>
{
    public CreateDeptCommandValidator(DeptQuery deptQuery)
    {
        RuleFor(d => d.Name).NotEmpty().WithMessage("部门名称不能为空");
        // 异步验证:检查部门名称是否已存在
        RuleFor(d => d.Name)
            .MustAsync(async (n, ct) => !await deptQuery.DoesDeptExist(n, ct))
            .WithMessage(d => $"该部门已存在,Name={d.Name}");
    }
}

4. 异常处理

业务异常用KnownException来处理,框架会自动转换成合适的HTTP状态码。比如在聚合根里:

// 在聚合根中
public void SoftDelete()
{
    if (IsDeleted)
    {
        throw new KnownException("部门已经被删除");
    }
    // ...
}

// 在命令处理器中
var dept = await deptRepository.GetAsync(request.DeptId, cancellationToken) 
    ?? throw new KnownException($"未找到部门,DeptId = {request.DeptId}");

这样前端收到的错误信息就很清晰,不需要再做额外的转换。

测试策略

测试这块,项目用的是xUnit,集成测试用了Aspire来自动管理测试环境。这样做的好处是不用手动搭建测试数据库、Redis这些基础设施,Aspire会自动启动和管理。

看一个部门创建接口的测试例子:

[Collection(WebAppTestCollection.Name)]
public class DeptTests(WebAppFixture app) : AuthenticatedTestBase<WebAppFixture>(app)
{
    [Fact]
    public async Task CreateDept_WithValidData_ShouldSucceed()
    {
        // Arrange
        var client = await GetAuthenticatedClientAsync();
        var deptName = $"测试部门_{Guid.NewGuid():N}";
        
        try
        {
            // Act
            var request = new CreateDeptRequest(deptName, "测试备注", null, 1);
            var (response, result) = await client.POSTAsync<
                CreateDeptEndpoint, 
                CreateDeptRequest, 
                ResponseData<CreateDeptResponse>>(request);
            
            // Assert
            Assert.True(response.IsSuccessStatusCode);
            Assert.NotNull(result?.Data);
            Assert.Equal(deptName, result.Data.Name);
        }
        finally
        {
            await CleanupTestDataAsync();
        }
    }
}

这种测试方式很接近真实的场景,测试的是完整的HTTP请求流程,而且会自动清理测试数据,保证测试之间的独立性。另外还支持身份认证测试,可以模拟登录用户的各种操作。

前端架构

前端用的是Vben Admin这个模板,这是一个基于Vue 3的管理后台框架。技术栈也比较主流:Vue 3 Composition API、TypeScript、Vite、Ant Design Vue,状态管理用Pinia,路由用Vue Router。

Vben Admin这个框架做得很完善,开箱即用的功能很多。比如权限控制,支持路由权限和按钮权限,用起来很方便。还有国际化支持,可以多语言切换。主题和布局也可以定制,基本的管理后台需求都能满足。

最重要的是类型安全,前后端都用了TypeScript,接口定义好之后,类型检查能帮你发现很多问题。

开发规范

为了让代码质量更统一,项目里制定了一些开发规范。比如文件的组织方式:

  • 聚合根放在 Domain/AggregatesModel/{AggregateName}Aggregate/
  • 领域事件放在 Domain/DomainEvents/
  • 仓储放在 Infrastructure/Repositories/
  • 命令放在 Web/Application/Commands/{Module}Commands/
  • 查询放在 Web/Application/Queries/
  • 端点放在 Web/Endpoints/{Module}Endpoints/

还有一些强制性的要求,比如所有聚合根都用强类型ID,而且不手动赋值ID,依赖EF的值生成器。所有命令都要有对应的验证器。领域事件要在聚合发生改变时发布。命令处理器不能调用SaveChanges,框架会自动处理。仓储必须用异步方法。业务异常用KnownException处理。

另外,项目还提供了很多代码片段,可以快速生成常用代码。比如ncpcmd可以生成命令及其验证器和处理器,ncpar可以生成聚合根,ncprepo可以生成仓储接口和实现,epp可以生成FastEndpoint的完整实现。这样开发效率会高不少。

云原生支持

项目集成了.NET Aspire,这个功能真的很方便。启动开发环境只需要运行AppHost项目,Aspire会自动管理所有依赖服务,不需要手动启动数据库、Redis、RabbitMQ这些。

# 仅需确保Docker环境运行
docker version

# 直接运行AppHost项目,Aspire会自动管理所有依赖服务
cd src/Ncp.Admin.AppHost
dotnet run

Aspire会自动启动和管理数据库容器(MySQL、PostgreSQL等)、消息队列容器(RabbitMQ等)、Redis容器,还会提供统一的Aspire Dashboard界面,可以查看所有服务的状态。服务之间的连接字符串也会自动配置,省了很多麻烦。

代码分析可视化

框架还提供了代码流分析和可视化功能,这个对理解架构很有帮助。可以通过命令行工具生成HTML文件:

# 安装全局工具
dotnet tool install -g NetCorePal.Extensions.CodeAnalysis.Tools

# 生成可视化文件
cd src/Ncp.Admin.Web
netcorepal-codeanalysis generate --output architecture.html

支持生成架构流程图、命令链路图、事件流程图、类图等,可以直观地看到代码之间的关系和数据流向。

总结

这个项目算是一个DDD架构的实践案例,展示了如何在.NET 10生态中应用DDD、CQRS、事件驱动这些架构思想。整体架构清晰,职责分明,代码组织得也比较规范。

技术栈上,后端用.NET 10 + EF Core + FastEndpoints + MediatR,前端用Vue 3 + TypeScript + Vite,都是目前比较主流的技术。开发体验上,有代码片段、自动化工具,还有完善的开发规范,开发效率还可以。

可维护性这块,代码分层清晰,测试支持也比较完善,还有代码可视化工具,方便新人理解架构。云原生支持也很到位,Aspire让基础设施管理变得简单。

如果你也在做类似的管理系统,或者想了解DDD在实际项目中的应用,可以看看这个项目的代码,应该能有一些参考价值。项目地址在https://github.com/zhouda1fu/Ncp.Admin,欢迎交流讨论。

参考资料

最后附上一些相关的参考资料,有兴趣的朋友可以深入了解一下:

项目源码地址:https://github.com/zhouda1fu/Ncp.Admin

OpenCode和oh-my-opencode安装 - 锅总的程序人生 - 博客园

mikel阅读(27)

来源: OpenCode和oh-my-opencode安装 – 锅总的程序人生 – 博客园

OpenCode是一个开源的AI编程代理,类比Claude code的工具。支持接入任意的模型

oh-my-opencode是OpenCode的瑞士军刀,内置一堆代理工具吗,由主代理Sisyphus操作各类代理进行工作!

如何安装

先安装node V20+版本

如果没有安装Node,或Node的版本低于V20,安装最新的版本

再安装GIt

如果没有安装Git,先安装Git

MAC版本,直接运行:brew install git

安装OpenCode

# 安装node

# WIN+R打开运行
# 输入powershell,回车打开

# 安装OpenCode 
npm i -g opencode-ai@latest

重要!请把npm重置为 https://registry.npmjs.org ,不要用淘宝的镜像

npm i -g opencode-ai@latest --registry=https://registry.npmjs.org 

若报错:在此系统禁止运行脚本,则执行如下命令处理:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

安装oh-my-opencode

# 先安装bun
npm install -g bun --registry=https://registry.npmjs.org 

# claude、chatgpt、gemini的账号都没有,全写no
npx oh-my-opencode@latest install --no-tui --claude=no --chatgpt=no --gemini=no

安装uvx

# 执行如下命令(Powershell)
powershell -ExecutionPolicy Bypass -c "irm https://astral.sh/uv/install.ps1 | iex"

# 执行如下命令(MAC)
curl -LsSf https://astral.sh/uv/install.sh | sh

安装完成的截图如下,由于所有账号都没有,都自动配置成GLM-4.7了!
file-20260126202226757

启动

进入cmd命令行,进入需要操作的文件夹(比如你的代码文件夹,工作内容文件夹等等)

直接输入 opencode 即可启动

启动成功界面如下:
file-20260126202226935

如果出现bun禁用的问题,如下图:

file-20260126202226899

打开windows安全中心 → 应用和浏览器控制 → 智能应用控制 → 关闭,如下图:

file-20260126202226810

如何自定义配置

opencode配置

opencode的全局配置文件,在windows上位于如下位置:
C:\Users\用户\.config\opencode ,名字是:opencode.json

默认配置如下,仅包含一个插件:
file-20260126202226941

更多配置参数请参考:配置 |OpenCode

oh-my-opencode配置

oh-my-opencode的全局配置文件,在windows上位于如下位置:
C:\Users\用户\.config\opencode ,名字是:oh-my-opencode.json

该配置默认使用了,opencode提供的glm-4.7-free来提供各类agent和西西弗斯的功能

获取通用配置

  1. 直接使用git下载:已删除,自己整理下配置把
  2. 下载后的文件,把opencode-default-config文件夹中的内容复制到 C:\Users\用户\.config\opencode 中(mac是 ~.config\opencode),
  3. 然后联系你的领导要一个GLM的APIKey
  4. 打开命令行,输入opencode auth login
  5. 选择 Zhipu AI Coding Plan
  6. 输入Key
  7. opencode.jsonc 中的三个和GLM相关的部分替换成自己的Key,如下图:
    file-20260126202226945
  8. git checkout 自己的名字
  9. git push(推送自己的分支到服务器)

【开源推荐】AgentForce:当 GraphRAG 遇上 Agentic Workflow,打造下一代 AI 智能体平台 - TW-NLP - 博客园

mikel阅读(27)

来源: 【开源推荐】AgentForce:当 GraphRAG 遇上 Agentic Workflow,打造下一代 AI 智能体平台 – TW-NLP – 博客园

💡 为什么关注 AgentForce?

在构建企业级知识库或 AI 助手时,我们经常遇到两个痛点:

  1. RAG 的“碎片化”问题:向量检索只能找到相关的文本块,无法回答像“总结这份财报的主要风险”这种需要理解全局关系的宏观问题。
  2. Agent 的“执行力”问题:简单的 Chatbot 缺乏规划能力,无法处理“先查库存,再比价,最后生成报告”这种复杂任务。

AgentForce正是为了解决这些问题而生。它不是一个简单的问答机器人,而是一个具备“图谱认知”和“自主规划”能力的智能平台

项目地址:👉 https://github.com/TW-NLP/AgentForce


✨ 核心特性解读

1. ⚡️ Agentic Workflow (代理工作流)

AgentForce 引入了类似于人类的思考模式。它不仅仅是回答问题,而是在执行任务

  • 动态规划:Agent 会分析你的问题复杂度,自动判断是直接回答、查阅知识库,还是联网搜索(Tavily)。
  • 长程记忆:内置了会话持久化机制,它记得住你们上周聊了什么,保证了上下文的连贯性。
  • 多线程处理:完备的 Session 管理,支持多用户并发使用。image

 

2. 🕸️ Graph-Powered (图谱增强认知)

这是该项目最大的亮点。它利用 GraphRAG 技术,将碎片化的文档转化为结构化的知识图谱。

  • 实体与关系提取:自动从文档中提取 Entity(实体)并构建 Relationship(关系)。
  • 全局查询 (Global Query):这是传统 RAG 做不到的。它可以基于社区摘要(Community Summaries)回答宏观问题。
  • 多模态支持:扔给它 PDF、Word、TXT 甚至 CSV,它都能处理。

3. 🎛️ 动态可配置 (Dynamic Control)

开发者最爱的特性——热更新

  • 模型热切换:可以在 GPT-4o, Claude-3.5 或本地模型之间无缝切换,无需重启服务。
  • 工具链集成:一键开启 Tavily 联网搜索或 Firecrawl 网页爬取。

🛠️ 技术架构概览

AgentForce 采用了现代化的前后端分离架构,代码结构清晰,非常适合二次开发学习。

  • 后端:Python 3.12+, FastAPI, Uvicorn, LangChain (可选), NetworkX
  • RAG 引擎:GraphRAG, 社区发现算法
  • 前端:原生 JS (ES6+), HTML5, CSS3 (轻量级,无复杂构建依赖)

Plaintext

 

AgentForce/
├── config/                  # [控制中心] 提示词、配置与记忆存储
├── src/                     # [核心引擎]
│   ├── api/                 # RESTful API & WebSocket
│   ├── services/            # 核心业务 (LLM, GraphRAG, Search)
│   └── workflow/            # 代理大脑 (Agent Nodes & Edges)
├── static/                  # [交互界面] 轻量级 Web UI
├── run.py                   # 启动入口
└── README.md


🚀 快速上手体验

环境要求:Python 3.12+

第一步:克隆与安装

# 1. 克隆项目
git clone https://github.com/TW-NLP/AgentForce.git
cd AgentForce

# 2. 创建虚拟环境 (强烈推荐)
python -m venv venv
# Windows 激活: venv\Scripts\activate
# Mac/Linux 激活: source venv/bin/activate

# 3. 安装依赖
pip install -r requirements.txt

第二步:启动服务

AgentForce 分为后端 API 和前端 UI。

1. 启动后端引擎

python run.py
# 后端 API 将运行在 http://localhost:8000

2. 启动前端界面

cd static
python -m http.server 8080
# 访问浏览器 http://localhost:8080 即可开始使用


📖 玩法演示

1. 模型配置

系统启动后,点击左侧设置图标。填入你的 OpenAI API Key 或者兼容的 LLM 服务商信息。配置会自动保存到 saved_config.json,下次启动无需重新输入。

image

2. 构建知识库 (ETL)

进入“知识库”页面,拖拽上传你的 PDF 财报或技术文档。 观察控制台,你会看到 AgentForce 正在执行 ETL 流程: 文本分块 -> 实体提取 -> 关系构建 -> 社区检出。 这个过程非常解压,也是 GraphRAG 的核心魅力所在。

image

 

3. 深度对话

回到对话框,尝试提一个复杂问题:

“你好,对比一下本公司上市时间和百度公司上市时间,生成报告。”

你会发现 Agent 不再是机械地列出原文,而是生成了一份综合性的分析报告。

image


🔌 API 扩展

对于想把功能集成到自己系统的开发者,后端提供了标准的 Swagger 文档。 启动后访问 http://localhost:8000/docs 即可查看所有接口,支持 POST /chat 对话、POST /graphrag/query 图谱查询等。


✍️ 总结

AgentForce 是一个展示了 GraphRAG 与 Agentic Workflow 如何落地的优秀案例。无论你是想学习最新的 RAG 技术,还是想搭建一个私有的企业级知识库,这个项目都值得一试。

如果你觉得项目不错,欢迎去 GitHub 点个 Star ⭐️ 支持一下作者!

🔗 项目地址https://github.com/TW-NLP/AgentForce

 

国内四大AI编程IDE对比(一):直观印象与模型能力 - haibindev - 博客园

mikel阅读(41)

来源: 国内四大AI编程IDE对比(一):直观印象与模型能力 – haibindev – 博客园

前言

2025真的是AI编程风起云涌的一年,国产AI也在不断发力,比如阿里的灵码,腾讯codebuddy、百度comate和字节跳动的Trae。我准备把这四家的AI编程工具做一下对比;今天先来个简单的直观对比,所以多年深入研究视频技术和后端技术的开发者,我接下来会从实际项目入手,对这四家进行对比,包括C++工程的构建对比、现有工程重构能力的对比、web工程构建能力对比和移动app构建能力的对比,看看他们都能做到什么程度。

废话不多说,直接开整。


一、各自优势和对比

这是检索出来的数据,据说是根据第三方评测与企业数据,三款产品在代码生成质量上各有侧重:

产品 语言优势 场景亮点 核心差异
百度 Comate C++核心代码质量第一;Python首生成率达92.3% SQL生成准确率提升35%;Agent模式质量更高 知识图谱积累深厚,跨文件任务达91%
阿里通义灵码 Java/Go支持扎实,覆盖率98%;Python/JS表现优异 Spring Boot/Cloud生成精度超GitHub Copilot @workspace支持RAG检索本地代码库
腾讯 CodeBuddy Python/JS准确率较高;微信生态提升125% 微信小程序开发突出,符合审核规范 Plan模式自动拆解任务,采纳率达90%
字节 Trae CN 更偏“AI 原生 IDE + 中文需求直达代码”的强项;对前端/全栈原型类任务更友好(内置预览/调试链路贴近 Web 开发节奏) SOLO 模式主打从需求到实现的端到端推进(可在 IDE/终端/浏览器等工具面板间协作),并支持在预览里实时交互与调试 不是“插件增强 IDE”,而是把 Agent(SOLO)+ 工具调度 + 预览调试做成 IDE 的中心能力;企业版还提供 IDE/插件/CLI 多形态接入以嵌入研发流程

二、官网给人的第一印象

2.1 阿里通义灵码:像做运维文档的人来做产品(稳、清晰、不吵)

lingma_page

打开通义灵码官网的第一感觉:这是阿里云的产品

蓝白色调,排版规整,一看就是ToB企业级产品的风格。首页大标题”你的智能编码助手”,下面就是”立即免费使用”的按钮,简单直接。

阿里在下载页面把Lingma IDE放在最后(JetBrains插件 > VS Code插件 > Visual Studio插件 > Lingma IDE),但是默认项是是IDE,不知道这么排布的意思是什么?

2.2 腾讯 CodeBuddy:像在开发布会(而且 PPT 不止一页)

codebuddy_page

首屏最显眼的是”立即安装 CodeBuddy IDE”按钮,下面还跟着视频演示区域。这明显是想让我先用IDE

2.3 百度Comate:有点意思

comage_page

百度的官网最有趣,我点进去一看,默认展示的是插件列表,IDE的入口排到后面去了。说实话,我有点懵。百度不是刚推出了”行业首个多模态AI IDE”吗?怎么官网首页默认显示的还是插件,独立IDE反而被藏在角落里?

我的猜测:

  • 百度可能对自己IDE还不够自信?
  • 或者开发进度还不够完善,不敢大张旗鼓推?
  • 还是说百度觉得插件才是主流,IDE只是”锦上添花”?

2.4 Trae CN

trace_page


三、IDE界面对比

lingma

codebuddy

baiducomate

trace

下载安装完四家IDE后,我发现一个有趣的事实:它们长得都太像VS Code了

左边文件树,右边代码区,底部终端,中间聊天窗口——这布局熟悉得不能再熟悉。

产品 界面相似度 独特性 舒适度
通义灵码 95% 左侧有专门的AI图标 ⭐⭐⭐⭐
CodeBuddy 98% 聊天窗口在右侧 ⭐⭐⭐⭐⭐
Comate 96% 底部有知识库入口 ⭐⭐⭐⭐
Trae CN IDE模式97% 现代化设计,丰富快捷键,多窗口支持 ⭐⭐⭐⭐⭐

四、对话和模型

  • 通义灵码:对话模式只能选择“智能体”或者“智能问答”,没用模型选择

image

  • CodeBuddy:模式可以选择“Craft”、“Ask”和“Plan”。模型可选GLM、Kimi-Thinking、DeepSeek和“Hunyuan”。

image-1

image-2

  • Comate:模式选择最多“Zulu”、“Ask”、“Plan”、“Architech”、“Page Builder”、“Figma2Code”,模型可以选“Kimi”、“DeepSeek”、“GLM”和“MiniMax”。

image-3

image-4

  • Trae CN:在solo模式下,可以选择Doubao-Seed-Code、GLM、MiniMax和Kimi-K2,在IDE模式下,模型选择多了“Doubao-Seed-1.8”、“DeepSeek-V3.1-Terminus”和”Qwen-3-Coder”

image-5

image-6

还有一个特别的地方就是,Trae可以语音输入

image-7


五 模型架构设计

三款产品在底层模型选择和技术架构上呈现出不同的设计理念,以下数据也是检索出来的,整理了一下可以对比了解一下:

百度 Comate 采用”三明治”架构设计,将自身在AI领域的积累深度融入代码场景:

层级 核心技术 说明
底层模型 文心ERNIE 3.5 提供语义理解和推理能力
中间层 代码知识图谱 整合2400万+高质量代码片段
应用层 10+功能模块 智能补全、错误诊断、测试生成等

阿里通义灵码 基于通义代码大模型构建,2025年2月新增DeepSeek满血版支持:

层级 核心技术 说明
核心模型 Qwen-2.5-Coder 千亿级参数规模
扩展模型 DeepSeek-V3/R1 671B参数,128K上下文
技术特点 代码库知识图谱 类继承关系识别准确率达91%

腾讯 CodeBuddy 采用混合架构,兼顾响应速度与能力上限:

层级 核心技术 说明
本地模型 混元Turbo S 1.8B参数,FP8量化,快速响应
云端模型 DeepSeek-V3/R1 671B参数,线性注意力机制
内存优化 长文本处理 内存占用降低65%

字节跳动 Trae IDE 采用分层融合架构,基于自研代码大模型与开源模型深度集成:

层级 核心技术 说明
底层模型 Doubao-1.5-pro(豆包) 国内版公开信息中作为基座模型,主打中文需求理解与代码生成。
底层模型(可切换) DeepSeek R1 / V3(“满血版”切换) 多家报道与官方站点信息均提到支持切换 DeepSeek R1&V3,用于拉高能力上限(推理/复杂任务)。
中间层 SOLO 模式:上下文承接 + 工具调度 官方对 SOLO 的定义是“以 AI 为主导,可理解目标、承接上下文并调度工具,独立推进各阶段开发任务”。
中间层(工程化形态) IDE / 插件 / CLI 多形态接入(企业版) 企业版发布信息明确提到提供 IDE、插件、CLI 多形态,用于更好地嵌入企业研发流程。
应用层 自然语言生成项目框架 + 实时预览 + 智能修复 官方站点对产品能力的核心表述包括:中文自然语言生成完整代码框架、实时预览前端效果、智能修复 Bug。

合作请加WX:hbstream
http://haibindev.cnblogs.com),转载请注明作者和出处

工作中用MQ最多的10种场景 - 苏三说技术 - 博客园

mikel阅读(54)

来源: 工作中用MQ最多的10种场景 – 苏三说技术 – 博客园

前言

最近有球友问我:MQ的使用场景有哪些?工作中一定要使用MQ吗?

记得刚工作那会儿,我总是想不明白:为什么明明直接调用接口就能完成的功能,非要引入MQ这么个”中间商”?

直到经历了系统崩溃、数据丢失、性能瓶颈等一系列问题后,我才真正理解了MQ的价值。

今天我想和大家分享我在实际工作中使用消息队列(MQ)的10种典型场景,希望对你会有所帮助。

一、为什么需要消息队列(MQ)?

在深入具体场景之前,我们先来思考一个基本问题:为什么要使用消息队列?

系统间的直接调用:
image

引入消息队列后:
image

接下来我们将通过10个具体场景,带大家来深入理解MQ的价值。

场景一:系统解耦

背景描述

在我早期参与的一个电商项目中,订单创建后需要通知多个系统:

// 早期的紧耦合设计
public class OrderService {
    private InventoryService inventoryService;
    private PointsService pointsService;
    private EmailService emailService;
    private AnalyticsService analyticsService;
    
    public void createOrder(Order order) {
        // 1. 保存订单
        orderDao.save(order);
        
        // 2. 调用库存服务
        inventoryService.updateInventory(order);
        
        // 3. 调用积分服务
        pointsService.addPoints(order.getUserId(), order.getAmount());
        
        // 4. 发送邮件通知
        emailService.sendOrderConfirmation(order);
        
        // 5. 记录分析数据
        analyticsService.trackOrderCreated(order);
        
        // 更多服务...
    }
}

这种架构存在严重问题:

  • 紧耦合:订单服务需要知道所有下游服务
  • 单点故障:任何一个下游服务挂掉都会导致订单创建失败
  • 性能瓶颈:同步调用导致响应时间慢

MQ解决方案

引入MQ后,架构变为:

image

代码实现

// 订单服务 - 生产者
@Service
public class OrderService {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void createOrder(Order order) {
        // 1. 保存订单
        orderDao.save(order);
        
        // 2. 发送消息到MQ
        rabbitTemplate.convertAndSend(
            "order.exchange",
            "order.created",
            new OrderCreatedEvent(order.getId(), order.getUserId(), order.getAmount())
        );
    }
}

// 库存服务 - 消费者
@Component
@RabbitListener(queues = "inventory.queue")
public class InventoryConsumer {
    @Autowired
    private InventoryService inventoryService;
    
    @RabbitHandler
    public void handleOrderCreated(OrderCreatedEvent event) {
        inventoryService.updateInventory(event.getOrderId());
    }
}

技术要点

  1. 消息协议选择:根据业务需求选择RabbitMQ、Kafka或RocketMQ
  2. 消息格式:使用JSON或Protobuf等跨语言格式
  3. 错误处理:实现重试机制和死信队列

场景二:异步处理

背景描述

用户上传视频后需要执行转码、生成缩略图、内容审核等耗时操作,如果同步处理,用户需要等待很长时间。

MQ解决方案

// 视频服务 - 生产者
@Service
public class VideoService {
    @Autowired
    private KafkaTemplate<String, Object> kafkaTemplate;
    
    public UploadResponse uploadVideo(MultipartFile file, String userId) {
        // 1. 保存原始视频
        String videoId = saveOriginalVideo(file);
        
        // 2. 发送处理消息
        kafkaTemplate.send("video-processing", new VideoProcessingEvent(videoId, userId));
        
        // 3. 立即返回响应
        return new UploadResponse(videoId, "upload_success");
    }
}

// 视频处理服务 - 消费者
@Service
public class VideoProcessingConsumer {
    @KafkaListener(topics = "video-processing")
    public void processVideo(VideoProcessingEvent event) {
        // 异步执行耗时操作
        videoProcessor.transcode(event.getVideoId());
        videoProcessor.generateThumbnails(event.getVideoId());
        contentModerationService.checkContent(event.getVideoId());
        
        // 发送处理完成通知
        notificationService.notifyUser(event.getUserId(), event.getVideoId());
    }
}

架构优势

  1. 快速响应:用户上传后立即得到响应
  2. 弹性扩展:可以根据处理压力动态调整消费者数量
  3. 故障隔离:处理服务故障不会影响上传功能

场景三:流量削峰

背景描述

电商秒杀活动时,瞬时流量可能是平时的百倍以上,直接冲击数据库和服务。

MQ解决方案

image

代码实现

// 秒杀服务
@Service
public class SecKillService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public SecKillResponse secKill(SecKillRequest request) {
        // 1. 校验用户资格
        if (!checkUserQualification(request.getUserId())) {
            return SecKillResponse.failed("用户无资格");
        }
        
        // 2. 预减库存(Redis原子操作)
        Long remaining = redisTemplate.opsForValue().decrement(
            "sec_kill_stock:" + request.getItemId());
        
        if (remaining == null || remaining < 0) {
            // 库存不足,恢复库存
            redisTemplate.opsForValue().increment("sec_kill_stock:" + request.getItemId());
            return SecKillResponse.failed("库存不足");
        }
        
        // 3. 发送秒杀成功消息到MQ
        rabbitTemplate.convertAndSend(
            "sec_kill.exchange",
            "sec_kill.success",
            new SecKillSuccessEvent(request.getUserId(), request.getItemId())
        );
        
        return SecKillResponse.success("秒杀成功");
    }
}

// 订单处理消费者
@Component
@RabbitListener(queues = "sec_kill.order.queue")
public class SecKillOrderConsumer {
    @RabbitHandler
    public void handleSecKillSuccess(SecKillSuccessEvent event) {
        // 异步创建订单
        orderService.createSecKillOrder(event.getUserId(), event.getItemId());
    }
}

技术要点

  1. 库存预扣:使用Redis原子操作避免超卖
  2. 队列缓冲:MQ缓冲请求,避免直接冲击数据库
  3. 限流控制:在网关层进行限流,拒绝过多请求

场景四:数据同步

背景描述

在微服务架构中,不同服务有自己的数据库,需要保证数据一致性。

MQ解决方案

// 用户服务 - 数据变更时发送消息
@Service
public class UserService {
    @Transactional
    public User updateUser(User user) {
        // 1. 更新数据库
        userDao.update(user);
        
        // 2. 发送消息(在事务内)
        rocketMQTemplate.sendMessageInTransaction(
            "user-update-topic",
            MessageBuilder.withPayload(new UserUpdateEvent(user.getId(), user.getStatus()))
                .build(),
            null
        );
        
        return user;
    }
}

// 其他服务 - 消费用户更新消息
@Service
@RocketMQMessageListener(topic = "user-update-topic", consumerGroup = "order-group")
public class UserUpdateConsumer implements RocketMQListener<UserUpdateEvent> {
    @Override
    public void onMessage(UserUpdateEvent event) {
        // 更新本地用户信息缓存
        orderService.updateUserCache(event.getUserId(), event.getStatus());
    }
}

一致性保证

  1. 本地事务表:将消息和业务数据放在同一个数据库事务中
  2. 事务消息:使用RocketMQ的事务消息机制
  3. 幂等消费:消费者实现幂等性,避免重复处理

场景五:日志收集

背景描述

分布式系统中,日志分散在各个节点,需要集中收集和分析。

MQ解决方案

image

代码实现

// 日志收集组件
@Component
public class LogCollector {
    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;
    
    public void collectLog(String appId, String level, String message, Map<String, Object> context) {
        LogEvent logEvent = new LogEvent(appId, level, message, context, System.currentTimeMillis());
        
        // 发送到Kafka
        kafkaTemplate.send("app-logs", appId, JsonUtils.toJson(logEvent));
    }
}

// 日志消费者
@Service
public class LogConsumer {
    @KafkaListener(topics = "app-logs", groupId = "log-es")
    public void consumeLog(String message) {
        LogEvent logEvent = JsonUtils.fromJson(message, LogEvent.class);
        
        // 存储到Elasticsearch
        elasticsearchService.indexLog(logEvent);
        
        // 实时监控检查
        if ("ERROR".equals(logEvent.getLevel())) {
            alertService.checkAndAlert(logEvent);
        }
    }
}

技术优势

  1. 解耦:应用节点无需关心日志如何处理
  2. 缓冲:应对日志产生速率波动
  3. 多消费:同一份日志可以被多个消费者处理

场景六:消息广播

背景描述

系统配置更新后,需要通知所有服务节点更新本地配置。

MQ解决方案

// 配置服务 - 广播配置更新
@Service
public class ConfigService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    public void updateConfig(String configKey, String configValue) {
        // 1. 更新配置存储
        configDao.updateConfig(configKey, configValue);
        
        // 2. 广播配置更新消息
        redisTemplate.convertAndSend("config-update-channel", 
            new ConfigUpdateEvent(configKey, configValue));
    }
}

// 服务节点 - 订阅配置更新
@Component
public class ConfigUpdateListener {
    @Autowired
    private LocalConfigCache localConfigCache;
    
    @RedisListener(channel = "config-update-channel")
    public void handleConfigUpdate(ConfigUpdateEvent event) {
        // 更新本地配置缓存
        localConfigCache.updateConfig(event.getKey(), event.getValue());
    }
}

应用场景

  1. 功能开关:动态开启或关闭功能
  2. 参数调整:调整超时时间、限流阈值等
  3. 黑白名单:更新黑白名单配置

场景七:顺序消息

背景描述

在某些业务场景中,消息的处理顺序很重要,如订单状态变更。

MQ解决方案

// 订单状态变更服务
@Service
public class OrderStateService {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    
    public void changeOrderState(String orderId, String oldState, String newState) {
        OrderStateEvent event = new OrderStateEvent(orderId, oldState, newState);
        
        // 发送顺序消息,使用orderId作为sharding key
        rocketMQTemplate.syncSendOrderly(
            "order-state-topic", 
            event, 
            orderId  // 保证同一订单的消息按顺序处理
        );
    }
}

// 订单状态消费者
@Service
@RocketMQMessageListener(
    topic = "order-state-topic",
    consumerGroup = "order-state-group",
    consumeMode = ConsumeMode.ORDERLY  // 顺序消费
)
public class OrderStateConsumer implements RocketMQListener<OrderStateEvent> {
    @Override
    public void onMessage(OrderStateEvent event) {
        // 按顺序处理订单状态变更
        orderService.processStateChange(event);
    }
}

顺序保证机制

  1. 分区顺序:同一分区内的消息保证顺序
  2. 顺序投递:MQ保证消息按发送顺序投递
  3. 顺序处理:消费者顺序处理消息

场景八:延迟消息

背景描述

需要实现定时任务,如订单超时未支付自动取消。

MQ解决方案

// 订单服务 - 发送延迟消息
@Service
public class OrderService {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void createOrder(Order order) {
        // 保存订单
        orderDao.save(order);
        
        // 发送延迟消息,30分钟后检查支付状态
        rabbitTemplate.convertAndSend(
            "order.delay.exchange",
            "order.create",
            new OrderCreateEvent(order.getId()),
            message -> {
                message.getMessageProperties().setDelay(30 * 60 * 1000); // 30分钟
                return message;
            }
        );
    }
}

// 订单超时检查消费者
@Component
@RabbitListener(queues = "order.delay.queue")
public class OrderTimeoutConsumer {
    @RabbitHandler
    public void checkOrderPayment(OrderCreateEvent event) {
        Order order = orderDao.findById(event.getOrderId());
        if ("UNPAID".equals(order.getStatus())) {
            // 超时未支付,取消订单
            orderService.cancelOrder(order.getId(), "超时未支付");
        }
    }
}

替代方案对比

方案 优点 缺点
数据库轮询 实现简单 实时性差,数据库压力大
延时队列 实时性好 实现复杂,消息堆积问题
定时任务 可控性强 分布式协调复杂

场景九:消息重试

背景描述

处理消息时可能遇到临时故障,需要重试机制保证最终处理成功。

MQ解决方案

// 消息消费者 with 重试机制
@Service
@Slf4j
public class RetryableConsumer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    @RabbitListener(queues = "business.queue")
    public void processMessage(Message message, Channel channel) {
        try {
            // 业务处理
            businessService.process(message);
            
            // 确认消息
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            
        } catch (TemporaryException e) {
            // 临时异常,重试
            log.warn("处理失败,准备重试", e);
            
            // 拒绝消息,requeue=true
            channel.basicNack(
                message.getMessageProperties().getDeliveryTag(),
                false,
                true  // 重新入队
            );
            
        } catch (PermanentException e) {
            // 永久异常,进入死信队列
            log.error("处理失败,进入死信队列", e);
            
            channel.basicNack(
                message.getMessageProperties().getDeliveryTag(),
                false,
                false  // 不重新入队
            );
        }
    }
}

重试策略

  1. 立即重试:临时故障立即重试
  2. 延迟重试:逐步增加重试间隔
  3. 死信队列:最终无法处理的消息进入死信队列

场景十:事务消息

背景描述

分布式系统中,需要保证多个服务的数据一致性。

MQ解决方案

// 事务消息生产者
@Service
public class TransactionalMessageService {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    
    @Transactional
    public void createOrderWithTransaction(Order order) {
        // 1. 保存订单(数据库事务)
        orderDao.save(order);
        
        // 2. 发送事务消息
        TransactionSendResult result = rocketMQTemplate.sendMessageInTransaction(
            "order-tx-topic",
            MessageBuilder.withPayload(new OrderCreatedEvent(order.getId()))
                .build(),
            order  // 事务参数
        );
        
        if (!result.getLocalTransactionState().equals(LocalTransactionState.COMMIT_MESSAGE)) {
            throw new RuntimeException("事务消息发送失败");
        }
    }
}

// 事务消息监听器
@Component
@RocketMQTransactionListener
public class OrderTransactionListener implements RocketMQLocalTransactionListener {
    @Autowired
    private OrderDao orderDao;
    
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        try {
            // 检查本地事务状态
            Order order = (Order) arg;
            Order existOrder = orderDao.findById(order.getId());
            
            if (existOrder != null && "CREATED".equals(existOrder.getStatus())) {
                return RocketMQLocalTransactionState.COMMIT_MESSAGE;
            } else {
                return RocketMQLocalTransactionState.ROLLBACK_MESSAGE;
            }
        } catch (Exception e) {
            return RocketMQLocalTransactionState.UNKNOWN;
        }
    }
    
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
        // 回查本地事务状态
        String orderId = (String) msg.getHeaders().get("order_id");
        Order order = orderDao.findById(orderId);
        
        if (order != null && "CREATED".equals(order.getStatus())) {
            return RocketMQLocalTransactionState.COMMIT_MESSAGE;
        } else {
            return RocketMQLocalTransactionState.ROLLBACK_MESSAGE;
        }
    }
}

事务消息流程

image

总结

通过以上10个场景,我们可以总结出MQ使用的核心原则:

适用场景

  1. 异步处理:提升系统响应速度
  2. 系统解耦:降低系统间依赖
  3. 流量削峰:应对突发流量
  4. 数据同步:保证最终一致性
  5. 分布式事务:解决数据一致性问题

技术选型建议

场景 推荐MQ 原因
高吞吐 Kafka 高吞吐量,持久化存储
事务消息 RocketMQ 完整的事务消息机制
复杂路由 RabbitMQ 灵活的路由配置
延迟消息 RabbitMQ 原生支持延迟队列

最佳实践

  1. 消息幂等性:消费者必须实现幂等处理
  2. 死信队列:处理失败的消息要有兜底方案
  3. 监控告警:完善的消息堆积监控和告警
  4. 性能优化:根据业务特点调整MQ参数

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。

更多项目实战在我的技术网站http://www.susan.net.cn/project

张高兴的大模型开发实战:(七)基于 Dify + Ollama 搭建私有化知识问答助手 - 张高兴 - 博客园

mikel阅读(59)

来源: 张高兴的大模型开发实战:(七)基于 Dify + Ollama 搭建私有化知识问答助手 – 张高兴 – 博客园

 

你是否也有过这样的经历:当汽车仪表盘上突然跳出一个陌生的黄色故障灯,或者你想调整后视镜的倒车下翻功能,却不得不从副驾手套箱里翻出那本厚达 400 页、封皮都快粘连的《用户使用手册》。你试图在目录中寻找关键词,翻到第 218 页,却发现还有“参见第 56 页”的跳转。在那一刻,你一定希望有一个懂行的老司机坐在旁边,你只需问一句:“这个像茶壶一样的灯亮了是什么意思?”,他就能立马告诉你答案。在 AI 大模型时代,这个愿望已经可以零成本实现。今天这篇博客,将带大家实战一个非常典型的 RAG(检索增强生成) 场景:利用开源工具 Dify 和本地大模型工具 Ollama,搭建一个能够完全读懂你汽车手册的 AI 智能体。完成后,不仅可以通过 Web 界面与它对话,还能通过 Python API 将其集成到其他应用中。

为什么选择 Dify + Ollama

在开始动手之前,先聊聊为什么选择这套技术栈。市面上有很多构建 AI 应用的方法,比如像之前博客介绍的那样直接用 LangChain 手搓,或者使用云端的 API,但对于不懂编程、不懂技术的用户,Dify + Ollama 是目前性价比最高、上手最快的选择。

Ollama:之前已经介绍过了,它是目前在本地运行大语言模型(LLM)最简单的工具。不需要复杂的环境配置,不需要研究 PyTorch,只需一行命令,就能在 PC 上运行 Llama 3、Qwen 2.5 等开源模型,最重要的是,它是本地化的,隐私绝对安全。

Dify:如果说 Ollama 提供了“大脑”,那么 Dify 就提供了“身体”和“四肢”,使模型具备了一些“能力”。Dify 是一个开源的 LLM 应用开发平台,它解决了 LLM 开发中最常见的问题:知识库的切片与索引、Prompt 的编排、上下文记忆的管理,以及对外提供标准的 API 接口。它是低代码的,几乎不需要写代码就能搭出一个企业级的 AI 应用。

在接下来的教程中,将完成以下操作:

  • 环境搭建:在本地部署 Ollama 和 Dify。
  • 模型接入:让 Dify 连接上本地运行的 Qwen2.5 模型。
  • 知识库构建:上传《用户手册》PDF,通过 RAG 技术让 AI “学会”手册的内容。
  • 智能体编排:调试 Prompt,让它根据用户手册回答问题。
  • API 调用:编写 Python 脚本调用搭建好的智能体,实现问答。

操作用到的用户手册可在此处下载:https://oss.mpdoc.com/doc/2026/01/10/CA60DABA002540C5894B85DA2DB46E14.pdf?attname=BMW_用户手册_01405A7D339.pdf

Ollama 本地部署

Ollama 的安装极度简化,几乎是“开箱即用”。直接访问 Ollama 官网 https://ollama.com/download 下载安装包即可。Linux 使用官方的一键安装脚本 curl -fsSL https://ollama.com/install.sh | sh。安装完成后,在命令行输入 ollama -v,看到版本号即表示安装成功。

1

访问 https://ollama.com/search 可以查看 Ollama 支持的模型,这里选择 Qwen2.5-7B 版本(70 亿参数,平衡了速度和智能)。在命令行中执行 ollama run qwen2.5:7b,等待模型下载完成(大约 5GB),即可在本地运行该模型。下载完成后,会直接进入对话框。你可以试着问它:“你好,介绍一下你自己。” 如果它能流畅回复,说明模型已经激活。按 Ctrl + D 退出对话模式,模型会在后台继续运行。

Dify 本地容器化部署

为了保证环境的纯净和易于管理,官方推荐使用 Docker Compose 进行部署。首先,确保你的机器上安装了 Docker 和 Docker Compose(https://www.docker.com)。下面需要将 Dify 的代码仓库下载到本地。在命令行中执行以下命令 git clone --depth 1 https://github.com/langgenius/dify.git,如果你本地没有安装 Git,也可以直接去 GitHub 页面下载 ZIP 压缩包并解压。

2

Dify 是一个完整的应用架构,包含前端、后端、数据库(PostgreSQL)、缓存(Redis)和向量数据库(Weaviate/Qdrant)等多个组件。手动安装这些组件非常繁琐,但通过 Docker Compose,可以一键拉起所有服务。进入目录并执行以下命令,初次运行需要拉取多个 Docker 镜像。

# 进入 docker 目录
cd dify/docker
# 复制环境变量配置文件
cp .env.example .env
# 启动容器
docker compose up -d

3

等待所有容器启动完毕后,打开浏览器,访问 http://localhost/install,你将看到 Dify 的初始化引导界面。在这里设置你的管理员账号和密码。设置完成后,即可登录进入 Dify。

4

模型接入与知识库 RAG 构建

环境搭建完毕后,目前的 Dify 还是一个“空壳”。下面需要做两件事:

  1. 把 Ollama 的模型接入 Dify,让它拥有对话和理解能力;
  2. 把《用户手册》喂给它,构建向量知识库。

准备 Embedding 模型

在构建知识库时,除了对话模型,还需要一个专门的 Text Embedding(文本向量化)模型。之前的博客已经介绍了 Embedding 的概念,简单来说,它的作用是把手册里的文字变成计算机能理解的“数字向量”。打开命令行,拉取轻量级向量模型 ollama pull nomic-embed-text

5

在 Dify 中添加 Ollama 模型供应商

回到 Dify 的网页界面:

  1. 点击右上角的 头像 -> 设置 -> 模型供应商
  2. 找到 Ollama 卡片,点击“安装”。
  3. 安装完成后,点击 Ollama 卡片中的“添加模型”。

6

这里需要添加两次:

第一次:添加 LLM(对话模型)

  • 模型名称:qwen2.5:7b(必须与你在命令行 ollama list 查看到的名称完全一致)
  • 模型类型:LLM
  • 基础 URL:http://host.docker.internal:11434(Docker 容器访问宿主机的地址)

7

第二次:添加 Text Embedding(向量模型)

  • 模型名称:nomic-embed-text
  • 模型类型:Text Embedding
  • 基础 URL:同上

8

如果保存时提示“Error”,请检查 Ollama 能否通过 URL http://localhost:11434 访问,或者 Docker 网络配置和防火墙设置。

构建知识库

  1. 点击顶部导航栏的 知识库 -> 创建知识库
    9
  2. 上传文档:选择“导入已有文本”,将 用户手册.pdf 拖进去,点击“下一步”。
    10
  3. 分段(Chunk)设置:这里需要配置如何将 PDF 拆解成小段落,方便后续检索。
    11

    • 分段标识符:文档段落之间是怎样分隔的。\n 表示换行符,例如此处上传的文档段落之间就是通过换行符分隔的,有些时候可能会使用双换行符 \n\n,即两个段落之间有一个空行。
      12
    • 最大分段长度:决定了 AI “一口吃多少东西”。如果设置得太小,知识库会被切得过碎,影响检索效果;如果设置得太大,AI 可能无法有效利用上下文。
    • 分段重叠长度*:相邻段落之间重叠的字符数,有助于保持上下文连续性。
    • 使用 Q&A 分段:如果你的文档是“问答”类型的,开启此选项可以让 Dify 识别问答对,提升检索效果。
  4. 索引方式:选择 “高质量”,这会调用刚才配置的 nomic-embed-text 模型进行向量化处理。
    13
  5. 点击 “保存并处理”。

此时,Dify 会将几百页的 PDF 拆解成小段,转换成向量,并存入内置的向量数据库中。根据文档大小,这可能需要较长的时间。

14

检索测试

不要急着去创建聊天助手,先确认知识库“懂了”没有。在知识库详情页的左侧,找到 召回测试 按钮。这里可以模拟检索过程。例如输入测试文本:“如何打开远光灯?”,点击 测试,系统会展示它从手册中找到的最相关的几个段落。如果结果不准,说明分段可能切得太碎了,或者 PDF 解析乱码。这时需要回到 设置 中调整分段规则重新索引。

15

构建智能体应用

如果说知识库是 AI 的“图书馆”,那么 智能体编排(Orchestration) 就是给 AI 制定“员工手册”。需要告诉 AI:你现在的身份是什么?你应该怎么查阅资料?遇到不知道的问题该怎么回答?在 Dify 中,这一步不需要写代码,全程可视化操作。

创建应用

回到 Dify 首页的 工作室,点击 创建应用 按钮。应用类型选择 Chatflow,并起一个合适的名称。

16

编排界面概览

进入应用后,会看到一个左右分栏的界面:

  • 左侧:编排区,编排 AI 的工作流程。默认创建了一个包含 LLM 节点的最简单对话流程。
  • 右侧:调试区,用来设置提示词、上下文、开场白等,也可以实时测试 AI 的反应。

17

查询预处理

在实际测试中,你可能会发现 AI 有时候变得“笨笨的”。因为用户的口语表达和手册的书面术语不完全一致,导致检索失败。为了解决这个问题,需要在 AI 去知识库“翻书”之前,先对用户的问题进行“预处理”,也就是提取检索的关键词句。

18

下面点击默认提供的 LLM 节点,修改名称为“提取关键词”。在右侧的 SYSTEM 提示词区域,输入以下内容:

# Task
你将收到用户的问题。请先提取问题中的关键信息,用于进行检索知识库内容。

# Output
输出多个关键词或关键句,关键词或关键句之间使用空格分隔,禁止直接回答用户的问题

完成后可以点击顶部的 预览 按钮进行测试。

19

关联知识库

检索关键词有了之后,就可以利用关键词在知识库中检索相关内容。在 提取关键词 和 直接回复 节点之间,添加一个新节点 知识检索

20

将 查询文本 改为 提取关键词 节点的输出,知识库 选择刚刚创建的“用户手册”知识库。

21

编写提示词

从知识库中检索到 相关信息(Context,上下文) 后,接下来就是让 AI 根据这些信息回答用户的问题了。在 知识检索 和 直接回复 节点之间,添加一个 LLM 节点 名称为 回答问题

22

在右侧的 上下文 中选择 知识检索 节点输出的结果 resultSYSTEM 提示词区域,输入下面的提示词,这段提示词使用了 Role-Constraints-Goal 框架,能有效防止 AI 产生幻觉。

# Role
你是一位经验丰富的汽车维修与使用专家。你的任务是根据【Context】提供的内容,准确、简洁地回答用户关于车辆使用的问题。

# Constraints
1. 必须完全基于【Context】中的信息回答,严禁凭空捏造或利用外部知识回答手册未涉及的内容。
2. 如果【Context】中没有相关信息,请直接回答:“很抱歉,当前手册中未找到关于该问题的说明。”
3. 回答步骤要清晰,如果是操作指南,请按 1. 2. 3. 分点列出。
4. 语气要专业、耐心、乐于助人。

# Goal
帮助用户快速解决车辆使用中的疑惑,确保行车安全。

# Context
{{#context#}}

23

调整模型参数

点击模型右侧的图标,设置 温度(Temperature) 参数,可以设为小于 0.5 的值。温度越低,AI 越严谨、越死板;温度越高,AI 越发散、越有创造力。对于“查阅说明书”这种严肃场景,需要的是绝对的准确,而不是创造力。

24

调试与发布

以上配置完成后,先在右侧进行预览测试,观察 AI 的回答是否准确、步骤是否清晰,并且有无引用来源。如果不满意,可以继续调整提示词或上下文设置,直到满意为止。测试满意后,点击右上角的 发布 按钮。发布成功后点击 运行,即可通过 URL 进入 Web 界面和你的“车辆管家”聊天了!

25

Python API 调用实战

在前面的步骤中,已经实现了一个能在 Dify 网页端流畅对话的“用车顾问”。Dify 最强大的地方在于它遵循 API First 的设计理念。我们在网页上看到的所有功能,都可以通过 API 进行调用。这意味着可以把这个“大脑”接入到任何你想要的地方。接下来,编写一段 Python 代码,实现与智能体的远程对话。

获取 API 密钥

要通过 API 调用 Dify,首先需要拿到通行证。在 Dify 应用编排页面的左侧导航栏,点击 访问 API

  1. 在右上角点击 API 密钥 -> 创建密钥
  2. 复制生成的密钥。
  3. 留意页面上的 API 服务器地址,本地部署通常是 http://localhost/v1 。

26

环境准备

需要使用 Python 的 requests 库来发送 HTTP 请求。如果还没有安装,请在命令行执行 pip install requests

编写脚本

新建一个文件 car_bot.py,将以下代码复制进去。这段代码使用了阻塞模式 (Blocking),程序会等待 AI 完全生成完答案后,一次性返回结果。

import requests

# ================= 配置区域 =================
# 替换为你的 API 密钥
API_KEY = 'app-pJRiHLHP4UMJ3tGqyYLyAjGb' 
# Dify 的 API 地址
BASE_URL = 'http://localhost/v1'
# 定义请求头
headers = {
    'Authorization': f'Bearer {API_KEY}',
    'Content-Type': 'application/json'
}
# ===========================================

def ask(question, user_id="user_123", conversation_id=""):
    """
    发送问题给 Dify 智能体
    :param question: 用户的问题
    :param user_id: 用户唯一标识(用于区分不同用户的上下文)
    :param conversation_id: 会话 ID(用于多轮对话)
    """
    url = f'{BASE_URL}/chat-messages'
    
    payload = {
        "inputs": {},           # 如果你的 Prompt 没设置变量,这里留空
        "query": question,      # 用户的问题
        "response_mode": "blocking", # blocking=等待全部生成, streaming=流式输出
        "conversation_id": conversation_id,  # 留空表示开启新会话,填入 ID 可延续上下文
        "user": user_id,        # 必须字段,区分用户
    }

    try:
        print(f"正在思考问题:{question} ...")
        response = requests.post(url, headers=headers, json=payload)
        response.raise_for_status()
        result = response.json()
        
        # 提取 AI 的回答
        answer = result.get('answer', '')
        # 提取引用来源(如果有)
        metadata = result.get('metadata', {})
        usage = metadata.get('usage', {})
        
        print("-" * 30)
        print(f"🤖 AI 回答:\n{answer}")
        print("-" * 30)
        print(f"📊 消耗 Token:{usage.get('total_tokens', 0)}")
        
        return result.get('conversation_id') # 返回会话 ID 供下次使用

    except requests.exceptions.RequestException as e:
        print(f"请求出错: {e}")
        return None

if __name__ == '__main__':
    # 测试调用
    current_conversation_id = ask("如何分享数字钥匙?")

运行脚本 python car_bot.py,你将看到 AI 根据手册内容给出的准确回答。

27

通过这个 Python 脚本,想象力就可以起飞了。将脚本封装成一个 Web 服务,接收微信消息,转发给 Dify,再把答案发回微信,制作一个聊天机器人。也可以结合 Whisper(语音转文字)和 Edge-TTS(文字转语音),给这个智能体加上耳朵和嘴巴…

Claude Code 完全指南:使用方式、技巧与最佳实践 - knqiufan - 博客园

mikel阅读(93)

来源: Claude Code 完全指南:使用方式、技巧与最佳实践 – knqiufan – 博客园

最近在深度使用 Claude Code,发现真的很香!即整理了一份全面的指南,从零开始逐步了解 Claude Code 的核心功能、高级特性和最佳实践。这篇博客实际上更像是一本工具书,让我自己在使用时也能随时参考其内容,更好的使用这个强大的 AI 工具。

目录


一、Claude Code 简介

1.1 什么是 Claude Code?

Claude Code(CC)是由 Anthropic 开发的系统级 AI Agent,它不仅是一个代码编写工具,更是一个可以通过自然语言指令完成各种电脑任务的智能助手。

核心特性:

特性 说明
全功能访问 拥有系统级权限,可执行文件操作、运行命令、管理进程等
超大上下文 支持 200K token 上下文窗口,可处理大型项目
高度可扩展 支持 MCP、Skills、Plugins、Hooks 等多种扩展方式
多代理协作 支持子代理(Subagents)并行处理复杂任务
自然交互 支持自然语言指令,无需学习复杂命令语法

1.2 Claude Code vs 传统工具

传统开发工具

代码编辑器

Chat AI工具

Coding助手

Claude Code

代码编写

对话问答

数据分析

文件管理

爬虫自动化

Office处理

核心差异:

  • 传统工具:单一功能,需要人工操作多个工具完成复杂任务
  • Claude Code:系统级 AI Agent,通过自然语言指令即可完成全流程任务

二、安装与配置

2.1 前置准备

必需工具:

工具 用途 安装地址
Node.js 运行环境 https://nodejs.org
Git 版本控制 https://git-scm.com
API Key 模型服务 智谱GLM/月之暗面K2/阿里Qwen等

验证安装:

# 检查 Node.js 版本
node -v

# 检查 Git 版本
git --version

2.2 安装 Claude Code

全局安装(推荐):

npm install -g @anthropic-ai/claude-code

验证安装:

claude --version

2.3 配置模型

Claude Code 支持多种模型配置方式,你可以根据自己的需求选择合适的模型。

方式一:手动配置(通用方式)

手动配置适用于所有兼容 Anthropic API 的模型。配置方式如下:

Windows:

setx ANTHROPIC_BASE_URL "模型API地址"
setx ANTHROPIC_AUTH_TOKEN "你的API密钥"
setx ANTHROPIC_MODEL "模型名称"

macOS/Linux:

export ANTHROPIC_BASE_URL=模型API地址
export ANTHROPIC_AUTH_TOKEN=你的API密钥
export ANTHROPIC_MODEL=模型名称

# 永久配置(添加到 ~/.bashrc 或 ~/.zshrc)
echo 'export ANTHROPIC_BASE_URL=模型API地址' >> ~/.bashrc
echo 'export ANTHROPIC_AUTH_TOKEN=你的API密钥' >> ~/.bashrc
echo 'export ANTHROPIC_MODEL=模型名称' >> ~/.bashrc
source ~/.bashrc

常用国内模型配置示例:

模型 API地址 模型名称 获取API Key
智谱 GLM-4.7 https://open.bigmodel.cn/api/anthropic GLM-4.7 https://open.bigmodel.cn/
Kimi K2 https://api.moonshot.cn/v1 kimi-k2 https://platform.moonshot.cn/console/account
通义千问 https://dashscope.aliyuncs.com/compatible-mode/v1 qwen-coder-plus https://bailian.console.aliyun.com/
DeepSeek https://api.deepseek.com/v1 deepseek-coder https://platform.deepseek.com/

配置示例(以智谱GLM为例):

export ANTHROPIC_BASE_URL=https://open.bigmodel.cn/api/anthropic
export ANTHROPIC_AUTH_TOKEN=your_glm_api_key
export ANTHROPIC_MODEL=GLM-4.7

注意: 配置环境变量后需要重启终端或运行 source ~/.bashrc 使配置生效。

方式二:使用自动化助手(仅适用于智谱GLM)

如果选择使用智谱GLM系列模型,还可以使用自动化配置助手:

npx @z_ai/coding-helper

按照交互式提示完成配置:

  1. 选择界面语言
  2. 设置 Coding 套餐
  3. 配置 API 密钥
  4. 选择编码工具

这种方式可以自动完成智谱GLM模型的配置,适合不想手动设置环境变量的用户。

国内模型对比

模型 提供商 代码能力 价格 优势 适用场景
GLM-4.7 智谱AI ⭐⭐⭐⭐⭐ 中等 中文理解强,有Coding套餐 中文项目为主
Kimi K2 月之暗面 ⭐⭐⭐⭐⭐ 较低 超长上下文,MoE架构 大型项目重构
Qwen-Coder-Plus 阿里云 ⭐⭐⭐⭐⭐ 开源,性能优秀 Python/JS项目
DeepSeek-Coder 深度求索 ⭐⭐⭐⭐ 极低 价格优势 预算有限的场景

2.4 启动 Claude Code

基本启动:

claude

危险模式(跳过权限确认):

claude --dangerously-skip-permissions

Headless 模式(非交互式):

git diff | claude -p "解释这些更改"

三、核心概念详解

了解了 Claude Code 的安装配置后,深入了解一下它的一些核心概念。这些概念是充分发挥 Claude Code 能力的基础。

3.1 Skills(技能包)

什么是 Skills?

Skills 是预封装的工作流,就像游戏中的”技能包”,用完即走,不占用上下文。它是别人已经编写好的、可直接使用的功能模块。

官方 Skills 库: https://github.com/anthropics/skills (32k+ Stars)

Skills 的类型

类型 说明 示例
User Skills 用户自定义技能,存储在本地 个人工作流自动化
Plugin Skills 插件提供的技能,随插件安装 frontend-design
Built-in Skills Claude Code 内置技能 commit, review-pr

常用官方 Skills

# 前端设计技能
npx skills-installer install @anthropics/claude-code/frontend-design --client claude-code

# 文档协同技能
npx skills-installer install @anthropics/claude-code/doc-coauthoring --client claude-code

# Canvas 设计技能
npx skills-installer install @anthropics/claude-code/canvas-design --client claude-code

# PDF 处理技能
npx skills-installer install @anthropics/claude-code/pdf --client claude-code

# 算法艺术生成
npx skills-installer install @anthropics/claude-code/algorithmic-art --client claude-code

如何使用 Skills

查看可用 Skills:

claude /skills

调用 Skill:

# 在 Claude Code 对话中
使用 frontend-design skill 优化 https://example.com

使用 pdf skill 提取 report.pdf 中的表格数据

如何编写自己的 Skills

Skill 目录结构:

my-skill/
├── skill.json          # Skill 元数据
├── skill.md            # Skill 文档
├── api/                # API 定义(可选)
└── tools/              # 自定义工具(可选)

skill.json 示例:

{
  "name": "my-custom-skill",
  "description": "我的自定义技能",
  "version": "1.0.0",
  "author": "Your Name",
  "categories": ["automation"],
  "license": "MIT",
  "skill": {
    "file": "skill.md",
    "description": "这个技能用于..."
  }
}

skill.md 示例:

# My Custom Skill

这个技能帮助用户快速完成[特定任务]。

## 使用场景

- 场景1:描述...
- 场景2:描述...

## 使用方式

用户只需要告诉你要完成什么,这个技能就会自动:

1. 分析需求
2. 执行步骤
3. 返回结果

## 注意事项

- 注意事项1
- 注意事项2

安装本地 Skill:

# 将技能复制到 Claude Code 配置目录
cp -r my-skill ~/.claude/skills/

# 或使用安装命令
npx skills-installer install ./my-skill --client claude-code

3.2 Hooks(钩子)

什么是 Hooks?

Hooks 是在特定事件触发时自动执行的脚本,用于自定义工作流、拦截危险操作、自动格式化代码等。

核心价值:

事件触发

Hook 拦截

执行自定义脚本

返回结果

继续/阻止操作

Hook 事件类型

事件类型 触发时机 典型用途
user-prompt-submit 用户提交提示词前 验证、修改提示词
tool-use 工具使用前 权限检查、参数验证
after-tool-use 工具使用后 日志记录、结果处理
permission-request 权限请求时 拦截危险操作
notification 通知时 发送告警、更新状态

Hook 配置方式

方式一:通过 /hooks 命令

# 在 Claude Code 中
/hooks

方式二:通过配置文件

在 ~/.claude/settings.json 或项目 .claude/settings.json 中配置:

{
  "hooks": {
    "user-prompt-submit-hook": {
      "command": "npm run validate-prompt",
      "enabled": true
    },
    "tool-use-hook": {
      "command": "~/.claude/hooks/check-permission.sh",
      "enabled": true,
      "blocking": true
    },
    "after-tool-use-hook": {
      "command": "echo 'Tool used: {{toolName}}' >> ~/.claude/hooks.log",
      "enabled": true
    }
  }
}

Hook 实战示例

拦截危险命令:

#!/bin/bash
# ~/.claude/hooks/check-dangerous.sh

# 读取工具调用信息
TOOL_NAME=$(jq -r '.toolName' <<< "$CLAUDE_HOOK_INPUT")

# 危险操作列表
DANGEROUS_TOOLS=("rm" "delete" "format" "shutdown")

if [[ " ${DANGEROUS_TOOLS[@]} " =~ " ${TOOL_NAME} " ]]; then
  echo "⚠️  警告:即将执行危险操作 - $TOOL_NAME"
  echo "请确认是否继续? (yes/no)"
  read -r confirmation
  if [[ "$confirmation" != "yes" ]]; then
    exit 1  # 阻止操作
  fi
fi

自动格式化代码:

{
  "hooks": {
    "after-write-hook": {
      "command": "if [[ {{filePath}} == *.js ]]; then prettier --write {{filePath}}; fi",
      "enabled": true,
      "blocking": false
    }
  }
}

发送通知:

{
  "hooks": {
    "task-complete-hook": {
      "command": "notify-send 'Claude Code' '任务已完成'",
      "enabled": true
    }
  }
}

自动格式化代码(PostToolUse Hook):

来自创始人的实战经验 – 彻底消灭 CI 里的格式报错:

{
  "hooks": {
    "after-tool-use-hook": {
      "command": "bun run format || true",
      "enabled": true,
      "blocking": false
    }
  }
}

工作原理:

  1. 每次 Claude 使用 Write 或 Edit 工具后自动触发
  2. 运行格式化命令(这里是 bun run format)
  3. || true 确保即使格式化失败也不阻塞流程
  4. 虽然 Claude 已经写得很规范,但这最后 10% 的自动化处理能彻底解决格式问题

效果:

  • ✅ CI 中不再有格式报错
  • ✅ 代码风格始终一致
  • ✅ 无需手动运行格式化
  • ✅ Git diff 更清晰

3.3 Plugins(插件)

什么是 Plugins?

Plugins 是打包在一起的扩展集合,可以包含:

  • 5 个 Skills
  • 10 个斜杠命令
  • 3 个 MCP 服务器配置
  • 2 个 SubAgent 定义
  • 若干 Hooks

Plugins vs Skills:

特性 Skills Plugins
复杂度 简单工作流 完整功能套件
内容 单一技能 多种资源的集合
安装 独立安装 一次性安装多个资源
适用场景 单一任务 完整解决方案

Plugin 安装与使用

哪里获取已有 Plugins?

官方插件市场:

来源 地址 说明
Anthropic Skills https://github.com/anthropics/skills 官方Skills库,包含多个插件
Claude Code Marketplace https://claudecodemarketplaces.com 插件市场目录
Awesome Claude Code https://awesomeclaude.ai/plugins 社区插件精选

添加插件市场:

# 添加官方Anthropic插件市场
claude /plugin marketplace add anthropics/skills

# 添加本地插件市场
claude /plugin marketplace add ~/my-marketplace

# 浏览可用插件
claude /plugin
# 选择 "Browse Plugins" 查看完整列表

常用官方插件:

# 文档处理插件套件
claude /plugin marketplace add anthropics/skills
claude /plugin install document-skills

# 前端开发插件
claude /plugin install frontend-design

# Git工作流插件
claude /plugin install git-workflow
安装 Plugin

从市场安装:

claude plugin install <plugin-name>

从本地安装:

# 安装本地插件
claude plugin install ./my-plugin

# 或使用完整路径
claude plugin install /path/to/my-plugin

从GitHub安装:

# 直接从GitHub仓库安装
claude plugin install github:user/repo
查看 Plugins

查看已安装 Plugins:

claude /plugin

浏览可用插件:

# 在Claude Code中输入
/plugin
# 选择 "Browse Plugins"

卸载 Plugin:

claude plugin uninstall <plugin-name>

创建自定义 Plugin:

my-plugin/
├── plugin.json           # Plugin 配置
├── skills/              # Skills 目录
│   ├── skill1/
│   └── skill2/
├── commands/            # 自定义斜杠命令
│   └── my-command.md
├── mcp/                 # MCP 配置
│   └── mcp-config.json
├── agents/              # SubAgent 定义
│   └── agent1.json
└── hooks/               # Hook 脚本
    └── hook1.sh

plugin.json 示例:

{
  "name": "my-plugin",
  "version": "1.0.0",
  "description": "我的自定义插件",
  "author": "Your Name",
  "skills": [
    "skills/skill1",
    "skills/skill2"
  ],
  "commands": [
    {
      "name": "/my-command",
      "description": "我的自定义命令",
      "file": "commands/my-command.md"
    }
  ],
  "mcpServers": [
    {
      "name": "my-mcp",
      "config": "mcp/mcp-config.json"
    }
  ],
  "agents": [
    {
      "name": "my-agent",
      "config": "agents/agent1.json"
    }
  ]
}

3.4 MCP Servers(模型上下文协议服务器)

什么是 MCP?

MCP (Model Context Protocol) 是 AI 的扩展接口标准,通过添加 MCP 服务器可以扩展 Claude Code 获取外部工具、资源、服务的能力。

核心概念:

Claude Code

MCP Client

MCP Server 1

MCP Server 2

MCP Server N

GitHub API

Database

Browser

常用 MCP 服务器

MCP Server 功能 Star 数
chrome-devtools-mcp 浏览器自动化,26个工具 18.5k
github-mcp GitHub API 集成 10k+
postgres-mcp PostgreSQL 数据库操作 5k+
filesystem-mcp 增强文件系统操作 3k+
web-search-mcp 网络搜索功能 2k+

MCP 安装方式

方式一:命令行安装

claude mcp add chrome-devtools npx chrome-devtools-mcp@latest

方式二:配置文件安装

编辑 ~/.claude/mcp.json:

{
  "mcpServers": {
    "chrome-devtools": {
      "command": "npx",
      "args": ["chrome-devtools-mcp@latest"],
      "disabled": false
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_TOKEN": "your_github_token_here"
      }
    },
    "postgres": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "POSTGRES_CONNECTION_STRING": "postgresql://user:password@localhost:5432/db"
      }
    }
  }
}

验证安装:

# 在 Claude Code 中
/mcp

# 或通过命令行
claude mcp list
claude mcp test chrome-devtools

Chrome DevTools MCP 实战

安装:

claude mcp add chrome-devtools npx chrome-devtools-mcp@latest

使用示例:

# 在 Claude Code 中
用Chrome浏览器打开 https://example.com,然后通过 chrome devtools mcp 完成以下任务:
1. 截取页面截图
2. 提取所有链接
3. 分析页面结构
4. 获取页面性能数据

26个内置工具包括:

  • chrome_navigate: 导航到指定 URL
  • chrome_screenshot: 截取页面截图
  • chrome_click: 点击元素
  • chrome_fill: 填写表单
  • chrome_select: 选择元素
  • chrome_evaluate: 执行 JavaScript
  • 等等…

3.5 Subagents(子代理)

什么是 Subagents?

Subagents 是可以并行处理任务的独立 AI 代理,每个子代理拥有独立的 200K 上下文窗口,可以分配不同任务以提高效率。

核心理念: 把常用工作流看作自动化运行的”子智能体”,就像圣诞老人分派任务给精灵一样,每个子智能体专注于特定领域。

核心优势:

主代理 Claude Code

子代理1: 代码审查

子代理2: 测试编写

子代理3: 文档生成

子代理4: 性能优化

并行处理

结果汇总

Subagent 配置

方式一:通过 /agents 命令

claude /agents

方式二:配置文件

在 ~/.claude/agents.json 或项目 .claude/agents.json 中配置:

{
  "agents": {
    "code-reviewer": {
      "description": "专门负责代码审查的子代理",
      "model": "claude-opus-4-5",
      "instructions": "你是一个专业的代码审查专家,专注于检查代码质量、安全漏洞和性能问题。",
      "tools": ["read", "search", "git"],
      "permissions": {
        "allowWrite": false
      }
    },
    "test-writer": {
      "description": "专门负责编写测试的子代理",
      "model": "claude-sonnet-4-5",
      "instructions": "你是一个测试工程师,专注于编写全面的单元测试和集成测试。",
      "tools": ["read", "write", "bash"]
    },
    "doc-generator": {
      "description": "专门负责生成文档的子代理",
      "model": "claude-sonnet-4-5",
      "instructions": "你是一个技术文档专家,专注于生成清晰、准确的技术文档。",
      "tools": ["read", "write"]
    }
  }
}

Subagent 使用示例

场景:完成一个功能开发

# 主任务
我需要完成用户认证功能,请帮我:

1. 使用 code-reviewer agent 审查现有认证代码
2. 使用 test-writer agent 编写测试用例
3. 使用 doc-generator agent 更新 API 文档

这三个任务并行执行

Claude Code 会自动:

  1. 创建三个独立的子代理
  2. 分配各自的上下文(200K × 3)
  3. 并行执行任务
  4. 汇总结果返回

实战子代理案例

来自 Claude Code 创始人 Boris Cherny 的实际使用案例:

code-simplifier:

# .claude/agents/code-simplifier.md

你是一个代码精简专家。在 Claude 完成工作后,你的任务是:
1. 分析代码的复杂度和可读性
2. 识别可以简化的逻辑
3. 提供优化建议但保持功能不变
4. 优先考虑性能和可维护性

verify-app:

# .claude/agents/verify-app.md

你是一个端到端测试专家。你的任务是验证应用功能:
1. 运行完整的测试套件
2. 检查所有关键路径
3. 验证边界情况
4. 确保用户体验"感觉对劲"
5. 如果发现问题,提供详细的修复步骤

使用方式:

# 在 Claude Code 中
使用 code-simplifier agent 优化刚才写的代码

使用 verify-app agent 验证应用是否正常工作

3.6 CLAUDE.md(项目记忆文件)

什么是 CLAUDE.md?

CLAUDE.md 是 Claude Code 的”项目记忆文件”,记录项目结构、构建命令、代码规范、架构决策等信息,让 Claude Code 快速理解项目上下文。

CLAUDE.md 的作用

作用 说明
📚 项目知识库 记录项目架构、技术栈、依赖关系
🚀 快速启动 自动读取,无需重复解释项目背景
🤝 团队协作 共享项目规范,确保团队理解一致
🔄 持续迭代 随项目演进自动更新

CLAUDE.md 最佳位置

项目根目录_CLAUDE.md

src_.claude_CLAUDE.md

.claude_rules_auth.md

home_.claude_CLAUDE.md

全局项目配置

模块级配置

特定规则

用户级配置

优先级: 特定规则 > 模块配置 > 项目配置 > 用户配置

CLAUDE.md 示例

完整示例:

# 项目名称: E-Commerce Platform

## 项目概述
这是一个基于 Node.js + React 的电商平台,支持商品管理、订单处理、支付集成等功能。

## 技术栈
- **前端:** React 18, TypeScript, Tailwind CSS, Redux Toolkit
- **后端:** Node.js 20, Express, TypeScript
- **数据库:** PostgreSQL 15, Redis 7
- **认证:** JWT, OAuth 2.0
- **测试:** Jest, Playwright
- **部署:** Docker, Kubernetes

## 项目结构
\`\`\`
src/
├── frontend/          # React 前端
│   ├── components/    # 可复用组件
│   ├── pages/         # 页面组件
│   ├── store/         # Redux store
│   └── utils/         # 工具函数
├── backend/           # Node.js 后端
│   ├── controllers/   # 控制器
│   ├── services/      # 业务逻辑
│   ├── models/        # 数据模型
│   └── routes/        # API 路由
└── shared/            # 共享代码
    └── types/         # TypeScript 类型定义
\`\`\`

## 常用命令

### 开发环境
\`\`\`bash
# 安装依赖
npm install

# 启动前端开发服务器
npm run dev:frontend

# 启动后端开发服务器
npm run dev:backend

# 同时启动前后端
npm run dev
\`\`\`

### 构建与部署
\`\`\`bash
# 构建前端
npm run build:frontend

# 构建后端
npm run build:backend

# 构建所有
npm run build

# Docker 构建
docker-compose build
docker-compose up
\`\`\`

### 测试
\`\`\`bash
# 运行所有测试
npm test

# 前端单元测试
npm run test:frontend

# 后端单元测试
npm run test:backend

# E2E 测试
npm run test:e2e

# 测试覆盖率
npm run test:coverage
\`\`\`

### 代码质量
\`\`\`bash
# 代码格式化
npm run format

# 代码检查
npm run lint

# 类型检查
npm run type-check
\`\`\`

## 代码规范

### 命名规范
- **文件名:** kebab-case (user-profile.ts)
- **组件名:** PascalCase (UserProfile)
- **函数/变量:** camelCase (getUserProfile)
- **常量:** UPPER_SNAKE_CASE (API_BASE_URL)
- **类型/接口:** PascalCase (UserProfile)

### Git 提交规范
遵循 Conventional Commits:
- \`feat: 新功能\`
- \`fix: 修复 bug\`
- \`docs: 文档更新\`
- \`style: 代码格式调整\`
- \`refactor: 代码重构\`
- \`test: 测试相关\`
- \`chore: 构建/工具链更新\`

### 代码审查清单
- [ ] 代码符合项目命名规范
- [ ] 添加了必要的注释
- [ ] 更新了相关文档
- [ ] 编写了/更新了测试
- [ ] 通过了所有测试
- [ ] 通过了 lint 检查
- [ ] 没有引入安全漏洞

## 架构决策

### ADR-001: 选择 TypeScript 而非 JavaScript
**日期:** 2024-01-15
**状态:** 已接受
**理由:**
- 类型安全减少运行时错误
- 更好的 IDE 支持
- 代码可维护性更高

### ADR-002: 采用微服务架构
**日期:** 2024-02-20
**状态:** 已接受
**理由:**
- 便于团队并行开发
- 独立部署和扩展
- 技术栈灵活性

## 环境变量

### 必需变量
\`\`\`bash
DATABASE_URL=postgresql://...
REDIS_URL=redis://...
JWT_SECRET=your-secret-key
API_BASE_URL=https://api.example.com
\`\`\`

### 可选变量
\`\`\`bash
LOG_LEVEL=info
NODE_ENV=development
PORT=3000
\`\`\`

## 常见问题

### Q: 如何添加新的 API 端点?
A:
1. 在 \`backend/routes/\` 创建路由文件
2. 在 \`backend/controllers/\` 创建控制器
3. 在 \`backend/services/\` 实现业务逻辑
4. 添加测试用例
5. 更新 API 文档

### Q: 如何调试前端状态管理问题?
A:
1. 使用 Redux DevTools 浏览器扩展
2. 在 \`src/frontend/store/\` 添加日志
3. 检查 action 和 reducer 逻辑

## 重要注意事项

1. **安全:** 永远不要在代码中硬编码密钥或敏感信息
2. **性能:** 大数据查询必须使用分页
3. **测试:** 所有新功能必须包含测试
4. **文档:** API 变更必须更新文档
5. **兼容性:** 确保向后兼容,使用版本控制

## 相关资源
- [项目 Wiki](https://wiki.example.com)
- [API 文档](https://docs.example.com)
- [设计规范](https://design.example.com)

生成 CLAUDE.md 的方式

方式一:使用 /init 命令

# 在项目根目录
claude /init

Claude Code 会自动扫描项目并生成初始 CLAUDE.md,包含:

  • 构建和测试命令
  • 目录结构说明
  • 代码规范和架构决策
  • 技术栈信息

方式二:手动创建

# 创建基础文件
touch CLAUDE.md

# 让 Claude Code 帮助生成
claude "请根据当前项目结构生成 CLAUDE.md 文件"

方式三:模块化规则

# 在 .claude/rules/ 目录创建多个规则文件
.claude/rules/
├── auth.md          # 认证相关规则
├── database.md      # 数据库相关规则
├── api.md           # API 设计规范
└── testing.md       # 测试规范

方式四:Memory Updates – 动态更新记忆

# 直接告诉 Claude 更新知识
Update CLAUDE.md: always use bun instead of npm
Update CLAUDE.md: 不要使用 enum,改用 string union

# Claude 会自动把新知识写入记忆文件,无需手动编辑

CLAUDE.md 的 AI 进化机制

来自 Claude Code 创始人团队的实战经验:

核心理念: 让 Claude 在 Code Review 中自我迭代,越用越聪明

实战流程:

  1. 在 PR 中发现问题
# 在 GitHub PR 评论中
@claude 这里的代码使用了 enum,但我们项目规范要求使用 string union,请修复
  1. 让 Claude 记住教训
# 在 PR 中直接告诉 Claude
@claude 请把这次的教训写入 CLAUDE.md:不要使用 enum,改用 string union
  1. Claude 自动更新
# Claude 会在 CLAUDE.md 中添加
## 代码规范更新 (2026-01-03)

### Enum vs String Union
- ❌ 不要使用 enum
- ✅ 改用 string union
- 理由:更好的类型推断和 Tree-shaking
  1. 团队共同维护
# 将 CLAUDE.md 签入 Git
git add CLAUDE.md
git commit -m "docs: 更新 CLAUDE.md 规范"

# 整个团队共享这份"行为准则"

价值体现:

  • 🧠 集体智慧: 每个团队成员的反馈都让 AI 更聪明
  • 🔄 持续进化: Claude 不会重复犯同样的错误
  • 📚 知识沉淀: 项目规范自动文档化
  • 🤝 团队协作: 统一的 AI 助手理解团队偏好

实际案例:

# CLAUDE.md - 实际演进示例

## 初始版本 (第1周)
- 使用 TypeScript
- 测试覆盖率 > 80%

## 第1次更新 (第2周 - PR反馈)
+ 永远使用 bun 而不是 npm
+ 理由:启动速度快 10 倍

## 第2次更新 (第3周 - PR反馈)
+ 不要使用 enum,改用 string union
+ 理由:更好的类型推断

## 第3次更新 (第4周 - PR反馈)
+ 所有 API 必须添加错误处理
+ 使用 try-catch 包装所有 async 函数

四、高级功能

实际上CC还有一些高级功能,这些功能将帮助更高效地完成复杂任务。

4.1 Plan 模式(规划模式)

什么是 Plan 模式?

Plan 模式是一种”先规划、后执行”的工作模式,Claude 会先分析项目架构、依赖关系并起草实现方案,确认后才开始编写代码。

Anthropic 开发者关系负责人 Ado Kukic 有 90% 的时间都在使用这个模式。

核心价值: 在这个模式下,Claude 会阅读代码、分析架构、起草计划,但绝不修改代码。直到你批准计划,它才会动手。你是架构师,它是执行者。

核心价值:

接收任务

分析项目

探索代码库

设计方案

用户确认?

执行实现

调整方案

完成任务

进入 Plan 模式

快捷键:

# 按两次 Shift+Tab
Shift+Tab, Shift+Tab

命令方式:

/plan

Plan 模式工作流程

1. 探索阶段

  • 读取相关文件
  • 分析代码结构
  • 理解依赖关系

2. 规划阶段

  • 设计实现方案
  • 列出具体步骤
  • 识别潜在风险

3. 确认阶段

  • 展示完整计划
  • 等待用户反馈
  • 根据反馈调整

4. 执行阶段

  • 按计划实施
  • 实时反馈进度
  • 处理异常情况

Plan 模式最佳实践

适合场景:

  • ✅ 复杂功能开发(多文件、多步骤)
  • ✅ 架构重构
  • ✅ 性能优化
  • ✅ 代码迁移
  • ✅ 不熟悉的项目

不适合场景:

  • ❌ 简单 bug 修复
  • ❌ 单行代码修改
  • ❌ 文档查询
  • ❌ 快速原型验证

使用技巧:

# 启用 Plan 模式
Shift+Tab × 2

# 明确任务需求
请帮我实现用户认证功能,包括:
1. 用户注册
2. 用户登录
3. JWT token 验证
4. 密码加密存储

# Claude 会先探索并规划:
# Plan: 实现用户认证功能
#
# 1. 分析现有代码结构
# 2. 设计认证流程
# 3. 创建数据模型
# 4. 实现 API 端点
# 5. 添加中间件
# 6. 编写测试
#
# 确认后开始执行? (yes/no)

# 确认后开始实施
yes

4.2 Sandbox 模式(沙箱模式)

什么是 Sandbox 模式?

Sandbox 模式通过定义允许的操作范围,拦截危险操作,提高安全性。

核心机制:

允许

拒绝

需要确认

允许

拒绝

操作请求

Sandbox 规则检查

执行操作

拦截并警告

询问用户

配置 Sandbox 模式

方式一:通过 /permissions 命令

claude /permissions

方式二:配置文件

编辑 ~/.claude/settings.json:

{
  "permissions": {
    "allow": {
      "bash": [
        "npm install",
        "npm test",
        "npm run build",
        "git *",
        "node -v",
        "npm -v"
      ],
      "write": [
        "src/**/*",
        "tests/**/*",
        "*.md"
      ],
      "read": [
        "**/*"
      ]
    },
    "deny": {
      "bash": [
        "rm -rf *",
        "format *",
        "shutdown",
        "reboot"
      ],
      "write": [
        "node_modules/**/*",
        ".git/**/*",
        "/etc/*",
        "/usr/*"
      ]
    }
  }
}

Sandbox 最佳实践

最小权限原则:

{
  "permissions": {
    "allow": {
      "bash": ["npm test", "npm run build"],
      "write": ["src/**/*", "tests/**/*"]
    }
  }
}

特定项目配置:

// .claude/settings.json (项目级)
{
  "permissions": {
    "allow": {
      "bash": [
        "npm run dev:*",
        "npm run test:*",
        "npm run build:*"
      ],
      "write": ["src/**/*", "tests/**/*", "docs/**/*"]
    },
    "deny": {
      "write": ["dist/**/*", "build/**/*"]
    }
  }
}

4.3 Headless 模式(无头模式)

什么是 Headless 模式?

Headless 模式是非交互式运行方式,输出结果直接流向标准输出,可集成到 Shell 脚本或 CI/CD 流程中。

使用场景:

场景 示例
🔄 CI/CD 集成 自动化代码审查
📜 脚本自动化 批量处理任务
🔍 快速分析 不需要交互的代码分析
📊 报告生成 自动生成文档

Headless 模式使用

基本用法:

# 从管道输入
git diff | claude -p "解释这些更改"

# 从文件输入
cat file.txt | claude -p "总结这个文件"

# 直接指定
claude -p "检查代码质量" < src/main.js

CI/CD 集成示例:

# .github/workflows/claude-review.yml
name: Claude Code Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '20'

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Run Code Review
        run: |
          git diff origin/main...HEAD | claude -p "审查这个 PR 的代码变更" > review.txt

      - name: Comment PR
        uses: actions/github-script@v6
        with:
          script: |
            const fs = require('fs');
            const review = fs.readFileSync('review.txt', 'utf8');
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: review
            });

脚本自动化示例:

#!/bin/bash
# batch-process.sh

for file in src/**/*.js; do
  echo "Processing $file..."

  # 使用 Claude Code 分析代码
  claude -p "检查文件 $file 的代码质量,包括:
  1. 潜在的 bug
  2. 性能问题
  3. 安全漏洞
  4. 代码规范违规" < "$file" > "reports/$(basename $file).md"

  echo "✓ Completed $file"
done

echo "All files processed!"

4.4 Vim 模式

启用 Vim 模式

/vim

Vim 常用快捷键

快捷键 功能
h 左移光标
j 下移光标
k 上移光标
l 右移光标
ciw 修改单词
dd 删除行
yy 复制行
p 粘贴
u 撤销
Ctrl+r 重做

4.5 Slash Commands(自定义命令)

什么是 Slash Commands?

Slash Commands 是将高频工作流封装成可复用的斜杠命令,将复杂的”人机对话”变成简单的”命令行指令”。

来自 Claude Code 创始人的实战经验:为了避免重复输入相同的 Prompt,他将高频工作流封装成了 Slash Commands。

创建自定义命令

方式一:通过 /commands 命令

claude /commands
# 选择 "Create new command"

方式二:手动创建

在 .claude/commands/ 目录创建 Markdown 文件:

# .claude/commands/
├── commit-push-pr.md
├── daily-standup.md
└── deploy-staging.md

示例1:自动提交并创建 PR

# .claude/commands/commit-push-pr.md

你是一个发布助手。请执行以下步骤:

1. 检查 Git 状态
   !git status

2. 运行测试套件
   !npm test

3. 如果测试通过:
   - 添加所有更改
   - 生成符合 Conventional Commits 的提交消息
   - 推送到远程
   - 创建 Pull Request

4. 如果测试失败:
   - 分析失败原因
   - 提供修复建议

使用:

# 直接输入命令
/commit-push-pr

# Claude 会自动执行整个流程

示例2:生成每日站会日报

# .claude/commands/daily-standup.md

请生成今日站会报告,包括:

1. 昨天完成了什么
   !git log --since="yesterday" --oneline

2. 今天计划做什么
   (读取 CLAUDE.md 中的当前任务)

3. 遇到的阻碍
   (读取最近的 TODO 注释)

请以清晰的 Markdown 格式输出。

使用:

/daily-standup

实战案例

完整的部署工作流:

# .claude/commands/deploy-production.md

你是一个部署专家。请按以下步骤执行生产环境部署:

## 前置检查
1. 确认当前分支
   !git branch --show-current

2. 检查是否有未提交的更改
   !git status

3. 运行完整测试套件
   !npm run test:all

## 构建阶段
4. 构建生产版本
   !npm run build

5. 运行构建产物测试
   !npm run test:build

## 部署阶段
6. 打包部署
   !npm run deploy:staging

7. 验证部署
   !curl https://staging.example.com/health

8. 运行冒烟测试
   !npm run test:smoke

## 生产部署
9. 合并到主分支
   !git checkout main
   !git merge production

10. 推送到远程
    !git push origin main

11. 监控部署
    (等待 CI/CD 完成)

12. 验证生产环境
    !curl https://api.example.com/health

## 回滚准备
如果部署失败,立即执行:
!git revert HEAD
!git push origin main

## 部署后检查
13. 检查错误日志
    (使用 Sentry MCP 查询最新错误)

14. 发送团队通知
    (使用 Slack MCP 发送部署成功通知)

请每完成一步都报告进度,遇到问题立即暂停并询问。

价值:

  • ✅ 一键执行复杂流程
  • ✅ 减少人为错误
  • ✅ 团队共享最佳实践
  • ✅ 可以签入 Git 版本控制

4.6 Extended Thinking(扩展思考模式)

ultrathink 深度思考模式

当你需要设计复杂的缓存层或重构架构时,在提示词中加上 ultrathink

# 标准模式
设计一个 Redis 缓存层

# ultrathink 模式
ultrathink: 设计一个高可用的 Redis 缓存层,考虑:
- 缓存穿透、缓存击穿、缓存雪崩
- 分布式锁
- 缓存更新策略
- 降级方案

效果:

  • Claude 会分配高达 32k 的 Token 进行内部推理
  • 虽然反应慢一点,但逻辑准确率大幅提升
  • 适合架构设计、复杂重构等关键任务

Extended Thinking API

通过 API 调用时,开启 Extended Thinking 可以看到 Claude 的逐步推理过程(Thinking Blocks)。

价值:

  • 透明化思考过程
  • 便于调试复杂逻辑
  • 理解 Claude 的决策路径
  • 教学和学习工具

五、实用技巧与快捷操作

了解了 Claude Code 的高级功能后,分享一些实用的技巧和快捷操作,可以更高效地使用这个工具。

5.1 基础操作技巧

项目初始化(/init)

# 自动生成 CLAUDE.md
/init

# 或手动指定
claude /init "这是一个 Node.js + React 项目"

快速引用上下文(@提及)

# 引用单个文件
@src/auth.ts

# 引用整个目录
@src/components/

# 引用多个文件
@src/auth.ts @src/user.ts @src/database.ts

# 引用 MCP 服务器
@mcp:github

# 模糊匹配
@auth  # 自动匹配 auth.ts, auth.controller.ts 等

即时执行 Bash 命令(!前缀)

# 查看状态
!git status

# 运行测试
!npm test

# 查看进程
!ps aux | grep node

# 组合使用
!git diff && echo "=== Changes Summary ==="

回退操作(双击 ESC)

ESC ESC

选项:

  • 仅回退对话
  • 仅回退代码
  • 同时回退对话和代码

注意: 已执行的 Bash 命令无法回退

5.2 效率提升技巧

反向搜索历史提示词(Ctrl+R)

Ctrl+R    # 开始搜索
Ctrl+R    # 循环匹配项
Enter     # 运行
Tab       # 编辑后运行

提示词暂存(Ctrl+S)

Ctrl+S    # 暂存当前提示词
# ... 处理其他事务 ...
# 恢复暂存内容继续工作

类似 Git stash,但用于提示词

智能提示补全(Prompt Suggestions)

Claude 甚至能预测你接下来想问什么:

# 当你看到灰色的建议文字时
Tab       # 接受建议并编辑
Enter     # 直接运行建议

价值:

  • 减少打字量
  • 发现隐藏功能
  • 学习最佳实践

会话管理高级技巧

Continue & Resume – 无缝续关

# 终端意外关闭?电脑没电了?
claude --continue              # 瞬间恢复上一次对话
claude --resume                # 显示历史会话列表供选择

# 上下文完美保留,工作流永不丢失

Named Sessions – 会话命名

# 像管理 Git 分支一样管理会话
/rename api-migration          # 给当前会话命名
/resume api-migration          # 按名称恢复会话

# 用途:为不同任务创建独立会话
/rename feature-auth
/rename bugfix-login
/resume feature-auth

Claude Code Remote – 跨设备传送

# 在网页版 claude.ai/code 上开始任务
# 回家后用终端继续开发

claude --teleport session_id   # 把云端会话"拉"到本地

# 利用"传送(Teleport)"功能
# 在终端和网页间同步上下文
# 甚至早上起床和白天休息时,用手机版 Claude App 查看进度

自定义状态栏(/statusline)

/statusline

可显示信息:

  • Git 分支
  • 当前模型
  • Token 用量
  • 上下文占比
  • 任务进度

配置示例:

{
  "statusline": {
    "segments": [
      "git.branch",
      "model.name",
      "context.usage",
      "token.cost"
    ],
    "refreshInterval": 1000
  }
}

可视化上下文(/context)

/context

显示:

  • 当前 token 使用情况
  • 上下文占用百分比
  • 各文件占用大小
  • 建议优化方向

使用统计与监控

查看使用习惯:

/stats     # 查看你的使用习惯、最爱用的模型、连续使用天数等
/usage     # 查看当前的费率限制和使用进度

价值:

  • 了解自己的使用模式
  • 监控费用消耗
  • 晒 Claude Code 统计(现在比晒 GitHub 提交记录更流行)

5.3 文件夹管理技巧

工作空间隔离

最佳实践:

# 为每个任务创建独立文件夹
project-1/
project-2/
task-a/
task-b/

快速启动:

# Windows: 在地址栏输入 cmd
# macOS: 在右键菜单选择"服务 > 新建终端位于文件夹"

# 然后启动 Claude Code
claude

拖拽文件

支持操作:

  • 拖拽单个文件
  • 拖拽整个文件夹
  • 拖拽多个文件

使用场景:

# 拖拽文件后直接描述任务
[拖入 auth.ts]
这个认证模块有安全问题,请帮我审查并修复

5.4 粘贴技巧

文本粘贴

操作 方式
在 CC 中粘贴文本 鼠标右键 → 粘贴
在普通命令行粘贴 Ctrl+V
在 CC 中粘贴图片 复制图片 → Alt+V (Windows) / Ctrl+V (macOS)

注意:

  • CC 中不能用 Ctrl+V 粘贴文本
  • CC 中不能用 Ctrl+A 全选
  • 图片必须在打开状态复制,预览状态无法粘贴

5.5 常用斜杠命令速查

命令 功能 使用频率
/clear 清空对话历史 ⭐⭐⭐⭐⭐
/compact 清空对话但保留摘要 ⭐⭐⭐⭐⭐
/context 可视化上下文使用 ⭐⭐⭐⭐⭐
/model 切换模型 ⭐⭐⭐⭐
/cost 显示费用统计 ⭐⭐⭐⭐
/export 导出对话 ⭐⭐⭐⭐
/add-dir 添加工作目录 ⭐⭐⭐⭐
/status 查看系统状态 ⭐⭐⭐
/mcp 管理 MCP 服务器 ⭐⭐⭐
/skills 列出可用技能 ⭐⭐⭐
/hooks 管理钩子 ⭐⭐
/agents 管理子代理 ⭐⭐
/vim 切换 Vim 模式 ⭐⭐
/theme 更换主题
/doctor 诊断环境 ⭐⭐⭐⭐

六、最佳实践

继续。提供并建立一些最佳实践以提升团队协作和开发效率。

6.1 项目组织最佳实践

目录结构规范

project/
├── .claude/                    # Claude Code 配置
│   ├── settings.json           # 项目级设置
│   ├── agents.json             # 子代理配置
│   ├── rules/                  # 模块化规则
│   │   ├── auth.md
│   │   ├── database.md
│   │   └── api.md
│   └── mcp.json                # MCP 配置
├── src/                        # 源代码
├── tests/                      # 测试代码
├── docs/                       # 文档
├── CLAUDE.md                   # 项目主配置
└── README.md                   # 项目说明

CLAUDE.md 层级配置

用户级_home_claude_CLAUDE_md

项目级_CLAUDE_md

模块级_src_claude_CLAUDE_md

特定规则_claude_rules

合并规则

最终配置

6.2 工作流最佳实践

探索-规划-编码-提交工作流

这是一个完整的开发工作流程,需要配合特定的Skills和MCP使用。

前置准备 – 安装必要工具:

# 1. 安装代码分析MCP(可选,用于深度分析)
claude mcp add github npx -y @modelcontextprotocol/server-github

# 2. 安装commit skill(用于生成规范的commit消息)
npx skills-installer install @anthropics/claude-code/commit --client claude-code

# 3. 安装Chrome DevTools MCP(用于浏览器测试,可选)
claude mcp add chrome-devtools npx chrome-devtools-mcp@latest

详细工作流程:

第1步:探索阶段 – 理解项目

# 启动Claude Code
claude

# 探索项目架构
请帮我分析这个项目的架构,重点关注:
1. 整体项目结构
2. 认证模块的实现
3. 依赖关系
4. 技术栈

# 使用@引用特定目录
@src/

# 如果有GitHub仓库,使用GitHub MCP
请使用github MCP查看最近的commit历史和issue

第2步:规划阶段 – 使用Plan模式

# 进入Plan模式(按两次Shift+Tab)
Shift+Tab, Shift+Tab

# 或使用命令
/plan

# 明确任务需求
我需要添加 OAuth2.0 认证支持,请规划实现方案,包括:
1. 需要创建哪些新文件
2. 需要修改哪些现有文件
3. 需要安装哪些依赖
4. 实现步骤顺序
5. 潜在的风险点

# Claude会生成详细计划,等待你的确认
# Plan: 添加OAuth2.0认证支持
#
# 1. 分析现有认证代码
# 2. 设计OAuth2.0流程
# 3. 创建OAuth控制器
# 4. 实现token生成和验证
# 5. 添加测试用例
# 6. 更新文档
#
# 预计需要修改的文件:
# - src/auth/oauth.controller.ts (新建)
# - src/auth/auth.service.ts (修改)
# - src/config/oauth.config.ts (新建)
#
# 确认后开始执行? (yes/no)

# 确认后开始实施
yes

第3步:编码阶段 – 实施计划

# 让Claude按照计划实施
按照上面的计划开始实施

# 如果遇到问题,可以要求暂停
暂停,让我先检查一下这一步

# 继续实施
继续下一步

# 运行测试
!npm test

# 修复失败的测试
测试失败了,请帮我修复

第4步:提交阶段 – 使用commit skill

# 使用commit skill生成规范的commit消息
使用commit skill为这些更改创建一个规范的commit消息

# Claude会分析变更并生成commit
# commit skill会:
# 1. 分析git diff
# 2. 生成符合Conventional Commits的消息
# 3. 自动创建commit

# 或手动指导commit
请帮我创建git commit,包含这些更改
commit消息格式: feat(auth): 添加OAuth2.0认证支持

测试驱动开发(TDD)工作流

前置准备 – 安装测试相关工具:

# 1. 安装测试编写skill(可选)
npx skills-installer install @anthropics/claude-code/test-writer --client claude-code

# 2. 或者配置test-writer子代理(后面详细说明)

TDD工作流程:

# 第1步:先写测试
# 使用test-writer skill或agent
使用test-writer skill为用户登录功能编写测试,包括:
1. 正常登录场景
2. 错误密码场景
3. 用户不存在场景
4. Token验证场景

@src/auth/login.controller.ts

# 第2步:运行测试(预期失败)
!npm test

# 第3步:实现最小可行代码
测试失败了,请实现登录功能使测试通过,只写能通过的代码

# 第4步:重构代码
代码通过了但不够优雅,请重构以提高可读性,但保持测试通过

# 第5步:重复循环
继续添加新功能的测试...

代码审查工作流

前置准备 – 创建和配置代码审查子代理:

方式1:使用 /agents 命令创建

# 在Claude Code中
claude
/agents

# 选择 "Create new agent"
# 按提示配置:
- Name: code-reviewer
- Description: 专门负责代码审查的子代理
- Instructions: 你是一个代码审查专家,专注于检查代码质量、安全漏洞和性能问题
- Tools: read, search, git
- Permissions: 禁止写入(allowWrite: false)

方式2:手动配置文件

# 创建agents配置文件
mkdir -p ~/.claude
cat > ~/.claude/agents.json << 'EOF'
{
  "agents": {
    "code-reviewer": {
      "description": "专门负责代码审查的子代理",
      "model": "claude-sonnet-4-5",
      "instructions": "你是一个专业的代码审查专家。专注于:\n1. 代码质量(Clean Code原则)\n2. 安全漏洞(OWASP Top 10)\n3. 性能问题(算法复杂度、资源使用)\n4. 最佳实践\n\n请以结构化方式输出审查结果。",
      "tools": ["read", "search", "git"],
      "permissions": {
        "allowWrite": false
      }
    },
    "security-reviewer": {
      "description": "专注于安全问题的子代理",
      "model": "claude-sonnet-4-5",
      "instructions": "你是一个安全专家,专注于识别:\n1. SQL注入、XSS、CSRF等漏洞\n2. 敏感信息泄露\n3. 权限控制问题\n4. 依赖安全问题",
      "tools": ["read", "search"],
      "permissions": {
        "allowWrite": false
      }
    },
    "performance-reviewer": {
      "description": "专注于性能问题的子代理",
      "model": "claude-sonnet-4-5",
      "instructions": "你是一个性能优化专家,专注于:\n1. 算法效率\n2. 内存使用\n3. 数据库查询优化\n4. 缓存策略",
      "tools": ["read", "search"],
      "permissions": {
        "allowWrite": false
      }
    }
  }
}
EOF

# 验证配置
claude
/agents
# 应该看到刚创建的三个agent

使用代码审查工作流:

# 第1步:使用子代理并行审查
# 代码质量审查
使用code-reviewer agent审查以下文件的代码质量:
- 是否符合Clean Code原则
- 是否有代码异味
- 是否易于维护

@src/auth.ts @src/user.ts @src/database.ts

# 安全审查(并行)
使用security-reviewer agent审查这些文件的安全问题:
- SQL注入风险
- XSS漏洞
- 敏感信息泄露

@src/auth.ts @src/user.ts @src/database.ts

# 性能审查(并行)
使用performance-reviewer agent审查这些文件的性能问题:
- 算法复杂度
- 数据库查询效率
- 内存使用

@src/auth.ts @src/user.ts @src/database.ts

# 第2步:生成综合审查报告
请综合以上三个agent的审查结果,生成一份详细报告,包括:
- 发现的问题列表
- 每个问题的严重程度(Critical/High/Medium/Low)
- 具体的修复建议
- 修复优先级排序

# 第3步:逐个修复问题
根据审查报告,请帮我修复Critical和High级别的问题:
1. 先修复安全问题
2. 再修复性能问题
3. 最后修复代码质量问题

# 第4步:重新审查
修复完成后,使用code-reviewer agent重新审查修复后的代码

6.3 团队协作最佳实践

共享 CLAUDE.md

场景:团队项目

实施步骤:

  1. 在项目根目录创建 CLAUDE.md
  2. 团队共同维护
  3. 定期更新
  4. 版本控制

示例:

# 团队项目规范

## 团队约定
- 代码审查至少 1 人 approve
- 所有 PR 必须通过 CI
- 文档与代码同步更新

## 分工信息
- @alice: 前端负责人
- @bob: 后端负责人
- @charlie: DevOps

## 沟通渠道
- Slack: #team-channel
- JIRA: 项目看板

GitHub 集成

安装 GitHub App:

/install-github-app

使用 PR 评论:

# 在 PR 中
@.claude 请审查这个 PR 的代码变更

# 自动添加问题到 CLAUDE.md
/pr-comments

6.4 性能优化最佳实践

极致的并行处理(Parallelism)

来自 Claude Code 创始人 Boris Cherny 的核心理念:不要让 AI 等你,也不要让你等 AI

1. 终端里的”多线程”操作

# 同时运行 5 个 Claude 实例
# 将终端标签页标记为 1-5

# 配置系统通知(System Notifications)
# 当某个 Claude 完成任务需要输入时,直接弹窗提醒

# 在 ~/.claude/settings.json 中配置
{
  "notifications": {
    "enabled": true,
    "sound": true,
    "position": "top-right"
  }
}

就好比你雇了 5 个初级程序员同时干活,你只需要负责 Review 和分配任务,效率直接翻倍。

2. 本地与云端的”混合双打”

# 在本地终端运行 5 个实例
# 同时在 claude.ai/code 网页端运行 5-10 个会话

# 利用 & 命令将本地会话"甩"给网页端后台运行
& 将这个任务转到网页端继续

# 在网页版开始新任务
# 然后在终端用 claude --teleport session_id 拉回本地

3. 跨设备同步工作流

# 早上在办公室:终端 + 网页版
# 中午休息:手机版 Claude App 查看进度
# 晚上回家:claude --teleport 继续开发

# 工作流永不中断

效果对比:

方式 并发度 效率提升 适用场景
单实例 1x 基准 简单任务
5个终端 5x 400% 本地开发
5终端 + 10网页 15x 1400% 大型项目
全设备协作 20x+ 1900%+ 复杂重构

上下文管理

策略:

# 长对话定期 compact
/compact "保留以下要点: ..."

# 新任务先 clear
/clear

# 监控上下文使用
/context

# 定期 export 备份
/export conversation-2026-01-06.json

Token 优化

技巧 说明 节省效果
使用 @提及 只加载需要的文件 30-50%
定期 /compact 清理历史保留摘要 40-60%
避免重复加载 检查 /context 输出 20-30%
使用 Subagents 并行处理减少串行上下文 50-70%

模型选择策略

Claude Code 创始人的独家见解: 只用最强的模型:Opus 4.5 + Thinking

很多人为了省钱或追求速度会用 Haiku 或 Sonnet,但 Boris Cherny 只用 Opus 4.5,并全程开启 Thinking(思考)模式。

理由:

  • 虽然 Opus 4.5 更贵、更慢,但它不需要你频繁纠正(Steer less)
  • 工具使用能力更强,一次就能做对
  • 从”任务完成总耗时”来看,聪明的大模型反而比”快但笨”的小模型更快
  • 一次做对,永远比反复修改更省时间

土豪专属了属于是。

国外模型选择策略:

简单任务

Haiku 4.5

中等复杂度

Sonnet 4.5

高复杂度

Opus 4.5 + Thinking

成本优化

平衡性能

质量优先

国外模型使用建议:

  • 快速查询/格式化: Haiku 4.5 – 最快最便宜
  • 日常开发/代码编写: Sonnet 4.5 – 性价比平衡
  • 架构设计/复杂重构: Opus 4.5 + Thinking – 最高质量(创始人首选)

国内模型选择策略:

简单任务

DeepSeek-Coder

中文项目

GLM-4.7

大型项目

Kimi K2

Python/JS

Qwen-Coder-Plus

极低成本

中文优化

超长上下文

开源优秀

国内模型使用建议:

任务类型 推荐模型 理由 价格(相对)
简单查询 DeepSeek-Coder 极低成本,够用
中文项目 GLM-4.7 中文理解最强,有Coding套餐 ⭐⭐⭐
大型重构 Kimi K2 超长上下文(2M+),MoE架构 ⭐⭐
Python/JS Qwen-Coder-Plus 开源,Python/JS性能优秀 ⭐⭐
预算有限 DeepSeek-Coder 价格优势明显
团队协作 GLM-4.7 有团队套餐,管理方便 ⭐⭐⭐

模型切换策略:

# 方式1:使用 /model 命令快速切换
claude
/model
# 选择对应模型

# 方式2:临时切换(当前会话)
export ANTHROPIC_MODEL=kimi-k2
claude

# 方式3:针对不同任务使用不同配置
# 创建alias
alias cc-glm='ANTHROPIC_MODEL=GLM-4.7 claude'
alias cc-kimi='ANTHROPIC_MODEL=kimi-k2 claude'
alias cc-qwen='ANTHROPIC_MODEL=qwen-coder-plus claude'

# 使用
cc-glm   # 使用智谱GLM
cc-kimi  # 使用Kimi
cc-qwen  # 使用通义千问

成本优化建议:

简单查询

中文开发

大型重构

Python项目

高质量要求

任务开始

任务类型?

DeepSeek-Coder

GLM-4.7

Kimi K2

Qwen-Coder-Plus

Sonnet 4.5

成本: $

成本: $$

成本: $$

成本: $$

成本:

混合使用策略:

# 日常开发用国产模型(便宜)
export ANTHROPIC_MODEL=GLM-4.7

# 遇到复杂任务时临时切换到高质量模型
/model
# 选择 Opus 4.5

# 完成后切换回国产模型
/model
# 选择 GLM-4.7

6.5 安全最佳实践

Sandbox 配置

{
  "permissions": {
    "allow": {
      "bash": ["npm run *", "git *"],
      "write": ["src/**/*", "tests/**/*"],
      "read": ["**/*.ts", "**/*.js", "**/*.json"]
    },
    "deny": {
      "bash": ["rm -rf *", "format *", "shutdown"],
      "write": ["node_modules/**/*", ".git/**/*", "/etc/*", "/usr/*"]
    }
  }
}

Hooks 安全检查

#!/bin/bash
# ~/.claude/hooks/security-check.sh

# 检查敏感操作
if [[ "$TOOL_NAME" == "Bash" ]]; then
  COMMAND=$(jq -r '.command' <<< "$CLAUDE_HOOK_INPUT")

  # 危险命令黑名单
  DANGEROUS_CMDS=("rm -rf" "format" "shutdown" "reboot" "chmod 000")

  for cmd in "${DANGEROUS_CMDS[@]}"; do
    if [[ "$COMMAND" == *"$cmd"* ]]; then
      echo "🚫 拦截危险命令: $COMMAND"
      exit 1
    fi
  done
fi

敏感信息保护

# CLAUDE.md 安全规范

## 禁止事项
- ❌ 在代码中硬编码密钥
- ❌ 在 CLAUDE.md 中记录密码
- ❌ 在 Git 提交中包含凭证

## 推荐做法
- ✅ 使用环境变量
- ✅ 使用 .env 文件(不提交)
- ✅ 使用密钥管理服务(AWS Secrets Manager 等)
- ✅ .gitignore 排除敏感文件

6.6 验证闭环(Feedback Loop)

来自 Claude Code 创始人的最重要的一条技巧:永远给 Claude 一种验证自己工作的方法

核心原理

如果 Claude 能看到自己代码的运行结果(报错信息、测试通过与否),它的代码质量会提升 2-3 倍。

实践方法

1. 简单的任务:运行 Bash 命令验证

# 编写代码后立即验证
请实现一个用户登录功能,然后:
1. 运行测试
!npm test

# 根据测试结果修复问题

# 重新验证
!npm test

# 直到所有测试通过

2. 复杂的 UI:使用浏览器自动化

# 使用 Claude Chrome 扩展
请修复这个 Bug 并验证:
1. 用 Chrome 打开 http://localhost:3000/login
2. 输入测试账号和密码
3. 点击登录按钮
4. 检查是否正确跳转到首页
5. 查看控制台是否有报错
6. 直到体验"感觉对劲"为止

3. 端到端验证流程

# 创建完整的验证循环
使用 verify-app agent 验证以下功能:
1. 用户注册流程
2. 登录和登出
3. 权限验证
4. 数据持久化

运行完整测试套件:
!npm run test:e2e

如果发现问题,请:
1. 分析根因
2. 修复代码
3. 重新验证
4. 确认问题已解决

效果对比

验证方式 代码质量 所需时间 返工率
无验证 ⭐⭐ 基准 40%
人工验证 ⭐⭐⭐ +50% 20%
Claude 自动验证 ⭐⭐⭐⭐⭐ +20% 5%

为什么验证循环如此重要?

人类开发流程:

  1. 写代码
  2. 手动测试
  3. 发现 bug
  4. 修复 bug
  5. 重复测试

Claude + 验证循环流程:

  1. Claude 写代码
  2. Claude 自己测试
  3. Claude 看到错误
  4. Claude 立即修复
  5. Claude 再次验证
  6. 循环直到完美

关键差异:

  • Claude 能立即看到错误信息
  • Claude 不需要等待人工反馈
  • Claude 可以在几秒内完成多个修复循环
  • 最终代码质量远超人工编写

最佳实践建议

✅ 推荐做法:

# 总是让 Claude 验证自己的工作
请实现功能 X,然后:
1. 运行测试验证
2. 检查代码格式
3. 验证边界情况
4. 确认无回归问题

❌ 避免做法:

# 不要让 Claude"盲写"
请实现功能 X
# (没有验证步骤,Claude 不知道代码是否正确)

七、实战案例

简单几个案例看看如何运用到实际工作中。

7.1 案例1:批量文件重命名

需求:将文件夹中所有文件名改为规范的英文名称

实现:

# 拖拽文件夹到 Claude Code

请将文件夹中的所有文件名改成规范的英文名称,只改名字,不改序号

# Claude Code 自动:
# 1. 读取文件夹内容
# 2. 分析文件名
# 3. 批量重命名
# 4. 报告结果

7.2 案例2:自动化数据抓取

需求:抓取公众号多页文章数据并导出 Excel

实现:

# 使用 Chrome DevTools MCP

用Chrome浏览器打开这个链接:[公众号链接]

然后通过 chrome devtools mcp 完成:
1. 获取第1、2、3页每篇文章的详细数据
2. 包括标题、阅读量、点赞量、发布时间等
3. 保存到 Excel 表格中

# Claude Code 自动:
# 1. 启动 Chrome
# 2. 导航到页面
# 3. 翻页抓取数据
# 4. 生成 Excel 报告

效果对比:

方式 耗时 准确率
人工 30分钟 90%
Claude Code + MCP 5分钟 99%

7.3 案例3:代码质量审查

需求:审查 PR 的代码变更

实现:

# 使用 code-reviewer subagent

使用 code-reviewer agent 审查这个 PR:
- 代码质量
- 安全漏洞
- 性能问题
- 最佳实践

@src/ @tests/

# Claude Code 自动:
# 1. 读取所有相关文件
# 2. 应用审查标准
# 3. 生成详细报告
# 4. 提供修复建议

7.4 案例4:自动化测试生成

需求:为新功能编写测试

实现:

# 使用 test-writer subagent

使用 test-writer agent 为用户认证功能编写测试:
- 单元测试
- 集成测试
- E2E 测试
- 边界情况测试

@src/auth.ts @src/auth.controller.ts

# Claude Code 自动:
# 1. 分析代码逻辑
# 2. 识别测试场景
# 3. 编写测试用例
# 4. 运行测试验证

7.5 案例5:CI/CD 集成

需求:在 PR 创建时自动审查代码

实现:

# .github/workflows/claude-review.yml

name: Claude Auto Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Configure Claude
        run: |
          echo "配置模型..."
          export ANTHROPIC_MODEL="claude-sonnet-4-5"

      - name: Run Review
        run: |
          git diff origin/main...HEAD > diff.txt
          claude -p "审查这个 PR 的代码变更,重点关注:
          1. 安全漏洞
          2. 性能问题
          3. 代码规范
          请提供详细审查意见" < diff.txt > review.txt

      - name: Comment on PR
        uses: actions/github-script@v6
        with:
          script: |
            const fs = require('fs');
            const review = fs.readFileSync('review.txt', 'utf8');
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `## 🤖 Claude Code 自动审查\n\n${review}`
            });

八、常见问题与解决方案

在使用 Claude Code 的过程中,你可能会遇到一些常见问题。本章节收集了最常见的问题及其解决方案,帮助你快速排除故障。

8.1 安装问题

Q1: npm install 失败

问题:

npm ERR! code EACCES
npm ERR! syscall access

解决方案:

# 方式1: 使用 sudo (macOS/Linux)
sudo npm install -g @anthropic-ai/claude-code

# 方式2: 修改 npm 全局目录
mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
export PATH=~/.npm-global/bin:$PATH
npm install -g @anthropic-ai/claude-code

# 方式3: 使用 nvm (推荐)
nvm install --lts
npm install -g @anthropic-ai/claude-code

Q2: claude 命令未找到

问题:

bash: claude: command not found

解决方案:

# 检查 npm 全局路径
npm config get prefix

# 添加到 PATH
export PATH=$(npm config get prefix)/bin:$PATH

# 永久配置
echo 'export PATH=$(npm config get prefix)/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

8.2 配置问题

Q3: 模型配置不生效

问题:配置后仍显示默认模型

解决方案:

# 1. 验证环境变量
echo $ANTHROPIC_BASE_URL
echo $ANTHROPIC_AUTH_TOKEN
echo $ANTHROPIC_MODEL

# 2. 重新启动终端
# 配置环境变量后必须重启终端才能生效

# 3. 使用 claude /status 检查
claude
/status

# 4. 手动设置(临时)
claude
/model
# 选择第4个(自定义模型)

Q4: MCP 服务器无法连接

问题:

Error: MCP server 'chrome-devtools' failed to start

解决方案:

# 1. 检查 MCP 状态
claude
/mcp

# 2. 测试连接
claude mcp test chrome-devtools

# 3. 重新安装
claude mcp remove chrome-devtools
claude mcp add chrome-devtools npx chrome-devtools-mcp@latest

# 4. 检查网络
npx chrome-devtools-mcp@latest --version

# 5. 查看日志
claude /doctor

8.3 使用问题

Q5: 上下文超出限制

问题:

Context exceeded: Request too large

解决方案:

# 1. 查看上下文使用
/context

# 2. 使用 compact 保留摘要
/compact "保留项目背景和当前任务"

# 3. 使用 clear 清空历史
/clear

# 4. 减少文件引用
# 不要用 @src/ 引用整个目录
# 改用 @src/file1.ts @src/file2.ts 精确引用

# 5. 使用 Subagents 分担上下文
# 将大任务拆分给多个子代理

Q6: 代码生成质量差

问题:生成的代码不符合项目规范

解决方案:

# 1. 完善 CLAUDE.md
# 在 CLAUDE.md 中明确代码规范

# 2. 使用 Plan 模式
Shift+Tab × 2
# 让 Claude 先理解项目再编写代码

# 3. 提供示例
# 这是符合规范的代码示例:
@src/good-example.ts
# 请参照这个风格编写新功能

# 4. 明确要求
请编写符合以下规范的代码:
- 使用 TypeScript 严格模式
- 遵循项目命名规范
- 包含完整的错误处理
- 添加必要的注释

8.4 性能问题

Q7: 响应速度慢

问题:Claude Code 响应延迟高

解决方案:

# 1. 检查网络
ping api.anthropic.com

# 2. 切换更快的模型
/model
# 选择 Haiku 4.5(最快) 或国产模型

# 3. 优化提示词
# 避免冗长的提示词,直接说明需求

# 4. 减少上下文
/context
# 如果接近 100%,使用 /compact 清理

# 5. 使用本地模型(如果有)
export ANTHROPIC_BASE_URL=http://localhost:8000

Q8: Token 消耗过快

问题:费用增长过快

解决方案:

# 1. 监控费用
/cost

# 2. 定期 compact
/compact "保留关键信息"

# 3. 新任务先 clear
/clear

# 4. 使用更便宜的模型
# Haiku < Sonnet < Opus
# 国产模型(更便宜)

# 5. 优化工作流
# 避免反复修改,一次性明确需求

8.5 调试技巧

启用调试模式

# 设置环境变量
export CLAUDE_DEBUG=true
export CLAUDE_LOG_LEVEL=debug

# 启动 Claude Code
claude

# 查看日志
tail -f ~/.claude/logs/claude.log

使用 /doctor 诊断

claude
/doctor

检查项:

  • ✅ 安装版本
  • ✅ 配置文件
  • ✅ API 连接
  • ✅ MCP 服务器
  • ✅ 权限设置
  • ✅ 环境变量

九、高级集成与扩展

Claude Code 的真正强大之处在于它的可扩展性。通过 LSP 集成和 Agent SDK,甚至可以构建自己的智能开发环境。

9.1 LSP 集成

什么是 LSP?

LSP (Language Server Protocol) 是语言服务器协议,通过集成 LSP,Claude Code 现在的代码理解能力达到了 IDE 级别

LSP 的强大能力

# Claude Code 现在可以:
- 看到实时报错和警告
- 跳转到定义
- 查看类型信息
- 理解符号引用
- 分析代码结构

效果对比:

能力 无 LSP 有 LSP
错误检测 ⭐⭐⭐ ⭐⭐⭐⭐⭐
类型推断 ⭐⭐⭐ ⭐⭐⭐⭐⭐
代码导航 ⭐⭐ ⭐⭐⭐⭐⭐
重构建议 ⭐⭐⭐ ⭐⭐⭐⭐⭐

实战案例:

# Claude Code 可以像 IDE 一样理解代码

@src/auth.ts
这个函数的返回类型是什么?
# (Claude 会使用 LSP 查看准确的类型定义)

这个函数在哪里被调用了?
# (Claude 会使用 LSP 查找所有引用)

这里有个类型错误,怎么修复?
# (Claude 会看到实时报错并提供建议)

配置 LSP

Claude Code 会自动检测项目中的 LSP 服务器:

# TypeScript 项目
# 自动使用 tsserver

# Python 项目
# 自动使用 pylsp

# Go 项目
# 自动使用 gopls

手动配置 LSP:

// ~/.claude/settings.json
{
  "lsp": {
    "typescript": {
      "command": "typescript-language-server",
      "args": ["--stdio"]
    },
    "python": {
      "command": "pylsp",
      "args": ["--stdio"]
    }
  }
}

9.2 Claude Agent SDK

什么是 Agent SDK?

Claude Agent SDK 将 Claude Code 的核心能力(Agent Loop、工具管理、上下文管理)作为一个 SDK 开放了。可以用几十行代码构建一个像 Claude Code 一样强大的自定义智能体。

核心能力

import { Agent, Tool, Context } from '@anthropic-ai/agent-sdk';

// 创建自定义 Agent
const myAgent = new Agent({
  model: 'claude-sonnet-4-5',
  tools: [
    new Tool({
      name: 'readFile',
      execute: async (path: string) => {
        return fs.readFileSync(path, 'utf-8');
      }
    }),
    new Tool({
      name: 'writeFile',
      execute: async (path: string, content: string) => {
        fs.writeFileSync(path, content);
      }
    })
  ],
  context: new Context({
    maxSize: 200_000, // 200K tokens
    compression: 'auto'
  })
});

// 运行 Agent
const result = await myAgent.run('创建一个用户认证系统');

实战案例

案例1:自动化测试生成器

import { Agent, Tool } from '@anthropic-ai/agent-sdk';

class TestGenerator extends Agent {
  constructor() {
    super({
      model: 'claude-sonnet-4-5',
      instructions: '你是一个测试专家,专门为代码编写全面的测试用例',
      tools: [
        new Tool({
          name: 'readSource',
          description: '读取源代码文件',
          execute: async (path: string) => {
            return fs.readFileSync(path, 'utf-8');
          }
        }),
        new Tool({
          name: 'writeTest',
          description: '编写测试文件',
          execute: async (path: string, content: string) => {
            fs.writeFileSync(path, content);
          }
        }),
        new Tool({
          name: 'runTests',
          description: '运行测试',
          execute: async () => {
            return execSync('npm test').toString();
          }
        })
      ]
    });
  }
}

// 使用
const testGen = new TestGenerator();
await testGen.run(`
  为 src/auth.ts 编写测试,包括:
  1. 正常登录场景
  2. 错误密码场景
  3. 用户不存在场景
  4. Token 验证场景

  然后运行测试确保所有测试通过
`);

案例2:代码审查机器人

import { Agent, Tool } from '@anthropic-ai/agent-sdk';

class CodeReviewer extends Agent {
  constructor() {
    super({
      model: 'claude-opus-4-5',
      instructions: `
        你是一个代码审查专家。审查代码时关注:
        1. 安全漏洞(OWASP Top 10)
        2. 性能问题
        3. 代码规范
        4. 最佳实践

        输出格式:
        - 严重程度(Critical/High/Medium/Low)
        - 问题描述
        - 修复建议
        - 代码示例
      `,
      tools: [
        new Tool({
          name: 'readFile',
          execute: async (path: string) => {
            return fs.readFileSync(path, 'utf-8');
          }
        }),
        new Tool({
          name: 'gitDiff',
          execute: async () => {
            return execSync('git diff').toString();
          }
        })
      ]
    });
  }
}

// 使用
const reviewer = new CodeReviewer();
const review = await reviewer.run('审查当前的代码变更');

console.log(review);
/*
输出:
## 🔴 Critical: SQL 注入风险

位置: src/auth.ts:45
问题: 直接拼接 SQL 查询,存在注入风险
建议: 使用参数化查询

代码示例:
\`\`\`typescript
// ❌ 不安全
const query = `SELECT * FROM users WHERE id = ${userId}`;

// ✅ 安全
const query = 'SELECT * FROM users WHERE id = ?';
await db.query(query, [userId]);
\`\`\`
*/

案例3:自动化部署助手

import { Agent, Tool } from '@anthropic-ai/agent-sdk';

class DeploymentBot extends Agent {
  constructor() {
    super({
      model: 'claude-sonnet-4-5',
      instructions: `
        你是一个部署专家。部署流程:
        1. 运行测试
        2. 构建项目
        3. 部署到 staging
        4. 验证部署
        5. 部署到生产
        6. 监控错误
        如果任何步骤失败,立即回滚
      `,
      tools: [
        new Tool({
          name: 'runTests',
          execute: async () => {
            return execSync('npm test').toString();
          }
        }),
        new Tool({
          name: 'build',
          execute: async () => {
            return execSync('npm run build').toString();
          }
        }),
        new Tool({
          name: 'deploy',
          execute: async (env: 'staging' | 'production') => {
            return execSync(`npm run deploy:${env}`).toString();
          }
        }),
        new Tool({
          name: 'verify',
          execute: async (url: string) => {
            return fetch(`${url}/health`).then(r => r.json());
          }
        }),
        new Tool({
          name: 'rollback',
          execute: async () => {
            return execSync('npm run rollback').toString();
          }
        }),
        new Tool({
          name: 'notify',
          execute: async (message: string) => {
            // 发送 Slack 通知
            await slackClient.chat.postMessage({
              channel: '#deployments',
              text: message
            });
          }
        })
      ]
    });
  }
}

// 使用
const deployBot = new DeploymentBot();
await deployBot.run('部署最新版本到生产环境');

Agent SDK 的核心优势

1. 完整的 Agent Loop

// 自动处理:
- 思考(Thinking)
- 工具调用(Tool Use)
- 结果观察(Observation)
- 迭代优化(Iteration)

2. 强大的上下文管理

const context = new Context({
  maxSize: 200_000,
  compression: 'auto', // 自动压缩历史对话
  priority: 'recent'   // 优先保留最近的内容
});

3. 灵活的工具系统

// 支持各种类型的工具
- 文件操作
- API 调用
- 数据库查询
- 网络请求
- 自定义脚本

4. 可观测性

const agent = new Agent({
  onThink: (thought) => console.log('思考:', thought),
  onToolUse: (tool, args) => console.log('调用工具:', tool),
  onError: (error) => console.error('错误:', error),
  onComplete: (result) => console.log('完成:', result)
});

使用场景

场景 价值
CI/CD 集成 自动化代码审查和测试
自动化运维 智能部署和监控
文档生成 自动生成 API 文档
代码迁移 批量重构和升级
教学工具 编程辅导和练习

附录

A. 快速参考卡

核心命令速查

# 基础操作
claude                    # 启动 Claude Code
claude -p "prompt"        # Headless 模式
claude --version          # 查看版本

# 斜杠命令
/clear                    # 清空对话
/compact                  # 压缩对话
/context                  # 查看上下文
/cost                     # 查看费用
/model                    # 切换模型
/mcp                      # 管理 MCP
/skills                   # 查看 Skills
/hooks                    # 管理 Hooks
/agents                   # 管理子代理
/status                   # 系统状态
/doctor                   # 诊断环境

# 快捷键
Ctrl+R                    # 搜索历史
Ctrl+S                    # 暂存提示词
Ctrl+C                    # 中止操作
Shift+Tab × 2             # Plan 模式
ESC ESC                   # 回退操作
Alt+V                     # 粘贴图片

# 文件操作
@file.ts                  # 引用文件
@src/                     # 引用目录
!command                  # 执行 Bash

B. 配置文件清单

配置文件 位置 作用
CLAUDE.md 项目根目录 项目配置
settings.json ~/.claude/ 或项目/.claude/ 全局/项目设置
agents.json ~/.claude/ 或项目/.claude/ 子代理配置
mcp.json ~/.claude/ MCP 服务器配置
hooks/ ~/.claude/hooks/ Hook 脚本
skills/ ~/.claude/skills/ 自定义 Skills
rules/ 项目/.claude/rules/ 模块化规则

C. 推荐资源

官方资源


总结

Claude Code 真的很强,是一个强大的系统级 AI Agent,用好这个工具能为自己提高很多工作效率。

核心能力清单

  • ✅ Skills: 预封装的工作流,快速复用专业能力
  • ✅ Hooks: 事件驱动的自动化,打造个性化工作流
  • ✅ Plugins: 完整解决方案,一键安装多功能套件
  • ✅ MCP Servers: 外部服务集成,无限扩展能力边界
  • ✅ Subagents: 并行处理复杂任务,提升团队协作效率
  • ✅ CLAUDE.md: 项目记忆系统,让 AI 理解你的项目,并支持自我进化
  • ✅ Plan 模式: 先规划后执行,减少返工提高质量(90% 时间都在用)
  • ✅ Slash Commands: 复杂工作流一键执行,团队共享最佳实践
  • ✅ Extended Thinking: ultrathink 深度思考模式,解决复杂问题
  • ✅ Sandbox 模式: 安全防护机制,保护你的工作环境
  • ✅ Headless 模式: CI/CD 集成,实现自动化工作流
  • ✅ LSP 集成: IDE 级代码理解,实时错误检测
  • ✅ Agent SDK: 构建自定义智能体,几十行代码创造强大工具

顶级开发者的秘诀

来自 Claude Code 创始人和 Anthropic 团队的实战经验:

1. 并行处理是效率倍增的关键

  • 同时运行 5 个终端实例 + 5-10 个网页会话
  • 利用系统通知和多设备协作
  • 效率提升可达 1900%+

2. AI 进化机制让工具越用越聪明

  • 在 PR 评论中直接 @claude 反馈
  • 自动将教训写入 CLAUDE.md
  • 整个团队的 AI 助手持续进化

3. 验证闭环是质量保证的基石

  • 永远给 Claude 验证自己工作的方法
  • 代码质量提升 2-3 倍
  • 返工率降低到 5%

4. 选择合适的工具

  • 简单任务: Haiku 4.5 或国产模型
  • 日常开发: Sonnet 4.5
  • 复杂任务: Opus 4.5 + Thinking(创始人首选)
  • 追求极致效率:聪明的大模型比”快但笨”的小模型更快

5. 先规划后执行

  • 90% 的时间使用 Plan 模式
  • 你是架构师,Claude 是执行者
  • 一次做对,永远比反复修改更省时间

设计哲学

看完这些技巧会发现 Claude Code 的设计哲学非常有意思:

  • 通过 Plan Mode,它尊重人的决策权
  • 通过 Hooks 和 Sandbox,它给人提供了控制权
  • 通过 Subagents 和 Automation,它帮人分担了繁琐的执行工作
  • 通过 LSP 和 Agent SDK,它提供了无限的扩展可能

正如 Ado Kukic 所说:”用得最好的开发者,不是那些把所有事情都丢给 AI 的人,而是那些懂得何时使用计划模式、何时开启深度思考、如何设置安全边界的人。”

Claude Code 不仅仅是一个工具,它是一个可编程、可扩展、可进化的智能开发环境。你的创造力决定了它的上限。


__EOF__

  • 本文作者: knqiufan
  • 本文链接: https://www.cnblogs.com/knqiufan/p/19449849
  • 关于博主: 这世界没有女孩子真的不会转! —— 来自一名代号65的技术宅
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐】一下。

共享打印机0x00000771错误解决方法-CSDN博客

mikel阅读(92)

来源: 共享打印机0x00000771错误解决方法-CSDN博客

0x00000771打印机错误,建议将打印机主机上的打印机驱动卸载重装。以下方法治标不治本。

1.打印机主机操作
1.1 键盘按下win+R键,弹出运行窗口。

1.2 在弹出的运行窗口输入框中输入services.msc。

1.3 鼠标左键单击运行窗口的确定,弹出服务窗口。

 

1.4 鼠标移动到服务窗口任务区,鼠标滚轮从前向后滚动,找到Remote Desktop Services右键单击。

1.5 鼠标左键单击重新启动(E),弹出重新启动其他服务对话框。

 

1.6 在重新启动其他服务对话框中,鼠标左键单击是(Y)。

 

1.7 等待服务重启完成。

 

1.8 找到Print Spooler右键单击。

1.9 鼠标左键单击重新启动(E),弹出重新启动其他服务对话框。

 

1.10 等待服务重启完成。

 

1.11 鼠标左键单击底色红色×关闭服务窗口。

 

2.打印机出错电脑操作
2.1 键盘按下win+R键,弹出运行窗口。

2.2 在弹出的运行窗口输入框中输入services.msc。

2.3 鼠标左键单击运行窗口的确定,弹出服务窗口。

 

2.4 找到Print Spooler右键单击。

2.5 鼠标左键单击重新启动**(E)**,弹出重新启动其他服务对话框。

 

2.6 等待服务重启完成。

 

2.7 鼠标左键单击底色红色×关闭服务窗口。

————————————————
版权声明:本文为CSDN博主「落.差.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_62825199/article/details/136684179

C# 中Task的核心讲解(线程的高级用法)

mikel阅读(128)

来源: C# 中Task的核心讲解(线程的高级用法)

Task 概述

Task 是 .NET 中用于表示异步操作的类,属于 System.Threading.Tasks 命名空间。它封装了一个异步操作,提供状态管理、取消支持、延续任务等功能,是编写异步代码的核心组件之一。

Task 的核心特性

  • 异步执行

    :Task 可以在后台线程或线程池中运行,避免阻塞主线程。

  • 状态跟踪

    :提供 Status 属性(如 RanToCompletionFaultedCanceled)。

  • 结果获取

    :通过 Result 属性获取返回值(泛型 Task<T>)。

  • 取消支持

    :结合 CancellationToken 实现任务取消。

  • 延续任务

    :通过 ContinueWith 定义任务完成后的操作。


常用使用方法

创建并启动 Task

使用 Task.Run 或 Task.Factory.StartNew 启动一个后台任务:


// 1. 使用 Task.Run(最常用)
staticvoidMain(string[] args)
 {
// 1. 使用构造函数(需要手动启动)
     Task task1 = new Task(() =>
     {
         Thread.Sleep(100);
         Console.WriteLine($"hello,task1的线程ID为{Thread.CurrentThread.ManagedThreadId}");
     });
     task1.Start();

// 2. 使用 Task.Factory.StartNew
     Task task2 = Task.Factory.StartNew(() =>
     {
         Thread.Sleep(100);
         Console.WriteLine($"hello,task2的线程ID为{Thread.CurrentThread.ManagedThreadId}");
     });
//3.使用 Task.Run(最常用)
     Task task3 = Task.Run(() => 
     {
         Thread.Sleep(100);
         Console.WriteLine($"hello,task3的线程ID为{Thread.CurrentThread.ManagedThreadId}");

     });
     Console.WriteLine($"主线程ID为{Thread.CurrentThread.ManagedThreadId}");
     Console.ReadKey();
 }

执行结果如下,可以看到先输出了 “主线程ID为1”,说明了Task不会阻塞主线程,并且线程执行是无序的

我们也可以创建有返回值的Task,用法和没有返回值的基本一致,,代码如下:


Task task1 = new Task(() =>
{
    Thread.Sleep(100);
return ($"task1的线程ID为{Thread.CurrentThread.ManagedThreadId}");

});
task1.Start();

Task task2 = Task.Factory.StartNew(() =>
{
    Thread.Sleep(100);
return222;
});

Task task3 = Task.Run(() =>
{
    Thread.Sleep(100);
returntrue;
});

Console.WriteLine($"主线程ID为{Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine(task1.Result);
Console.WriteLine(task2.Result);
Console.WriteLine(task3.Result);
Console.ReadKey();

执行结果如下:

task.Resut获取结果时会阻塞主线程,即如果task没有执行完成,会等待task执行完成获取到Result,所以这里是顺序执行。

等待 Task 完成

通过 WaitWaitAll 或 await 等待任务完成:

var task = Task.Run(()=>{
    Thread.Sleep(1000);
    return"完成";
});

// 阻塞等待
task.Wait();
Console.WriteLine(task.Result);

// 异步等待(需在 async 方法中使用)
string result = await task;

处理 Task 返回值

使用泛型 Task<T> 获取返回值:

Task<int> task = Task.Run(()=>{
  return 42;
});
Console.WriteLine(task.Result);// 输出 42

任务延续(ContinueWith)

在任务完成后执行后续操作:

Task.Run(()=>{
    Console.WriteLine("任务1");
}).ContinueWith(prevTask =>{
    Console.WriteLine("任务2");
});

取消 Task

通过 CancellationToken 实现任务取消:

var cts = new CancellationTokenSource();
var task = Task.Run(()=>{
while(true){
    cts.Token.ThrowIfCancellationRequested();
    Thread.Sleep(100);
}
}, cts.Token);

cts.CancelAfter(1000);// 1秒后取消

异常处理

通过 AggregateException 捕获任务异常:

try{
    Task.Run(()=>throw new Exception("错误")).Wait();
}catch(AggregateException ex){
    Console.WriteLine(ex.InnerException.Message);
}

最佳实践


  • 避免 Task.Result 或 Task.Wait 导致死锁(尤其在 UI 线程中)。


  • 使用 Task.WhenAll 并行执行多个任务:

Task<int> task1 = Task.Run(()=>1);
Task<int> task2 = Task.Run(()=>2);
int[] results = await Task.WhenAll(task1, task2);

Task 是现代 C# 异步编程的基础,合理使用可提升程序性能和响应能力。