OpenClaw技能开发入门:为千问3.5-9B编写自定义文件处理器

1. 为什么需要自定义技能?

去年我接手了一个重复性极高的文档处理工作——每天需要从200多份PDF中提取特定字段,整理成结构化表格。手动操作不仅耗时,还容易出错。当我发现OpenClaw可以通过技能扩展实现自动化时,决定自己开发一个文件处理器。

与通用AI工具不同,OpenClaw技能能深度绑定我的工作流:

  • 场景定制化:针对特定文件格式和字段规则优化
  • 本地化执行:敏感数据无需上传第三方服务
  • 链式操作:从文件读取到最终输出可一气呵成

2. 开发环境准备

2.1 基础工具链

我的开发环境是macOS + VS Code,关键组件包括:

# 确认Node.js版本(需要v18+)
node -v
# 安装OpenClaw CLI工具
npm install -g @openclaw/cli
# 安装技能开发脚手架
clawhub install @openclaw/skill-scaffold

2.2 模型服务配置

为了让技能调用千问3.5-9B模型,需要先在~/.openclaw/openclaw.json中添加模型配置:

{
  "models": {
    "providers": {
      "qwen-local": {
        "baseUrl": "http://localhost:8080/v1",
        "apiKey": "your-api-key",
        "api": "openai-completions",
        "models": [
          {
            "id": "qwen3.5-9b",
            "name": "千问3.5-9B本地版",
            "contextWindow": 32768
          }
        ]
      }
    }
  }
}

注意:如果使用星图平台的千问镜像,baseUrl应替换为平台提供的接口地址。

3. 创建第一个技能

3.1 初始化项目

使用脚手架生成技能模板:

claw scaffold file-processor --model=qwen3.5-9b
cd file-processor

生成的核心文件结构:

├── package.json
├── src
│   ├── actions/      # 操作实现
│   ├── models/       # 数据模型
│   ├── skills.json   # 技能元数据
│   └── index.ts      # 入口文件
└── test/             # 测试用例

3.2 定义技能能力

skills.json中声明基础能力:

{
  "name": "file-processor",
  "description": "PDF/Word文档结构化提取工具",
  "actions": [
    {
      "name": "extract_fields",
      "description": "从文档中提取指定字段",
      "parameters": {
        "file_path": "string",
        "field_rules": "object" 
      }
    }
  ]
}

3.3 实现核心逻辑

src/actions/extract_fields.ts中编写处理逻辑:

import { QwenClient } from '@openclaw/qwen-adapter';

export async function extractFields(
  filePath: string,
  fieldRules: Record<string, string>
) {
  // 1. 读取文件内容
  const content = await readFile(filePath);
  
  // 2. 调用千问模型处理
  const qwen = new QwenClient('qwen3.5-9b');
  const prompt = `请从以下内容提取字段:\n${content}\n规则:${JSON.stringify(fieldRules)}`;
  
  const result = await qwen.completion({
    prompt,
    max_tokens: 2000
  });
  
  // 3. 返回结构化数据
  return JSON.parse(result.choices[0].text);
}

4. 调试与优化技巧

4.1 本地测试方法

开发过程中我常用两种测试方式:

  1. 单元测试:对独立功能模块验证
// test/extract_fields.test.ts
describe('PDF字段提取', () => {
  it('应正确识别发票金额', async () => {
    const result = await extractFields('invoice.pdf', {
      amount: '金额字段通常包含¥符号'
    });
    expect(result.amount).toMatch(/¥\d+/);
  });
});
  1. 实时调试:通过OpenClaw控制台触发
clawhub dev --watch

4.2 模型调用优化

在实践中发现几个关键点:

  • 提示词工程:给千问3.5的指令需要明确输出格式
请严格按JSON格式返回,包含字段:{amount:string, date:yyyy-mm-dd}
  • Token控制:长文档需要分块处理
// 分块处理大文件
const chunks = splitContent(content, 8000);
const results = await Promise.all(
  chunks.map(chunk => qwen.completion({...}))
);

5. 发布到ClawHub生态

5.1 打包与验证

发布前的必要检查:

# 1. 运行所有测试
npm test

# 2. 构建生产包
clawhub build

# 3. 本地安装验证
clawhub install ./dist/file-processor-1.0.0.claw

5.2 发布流程

  1. ClawHub官网注册开发者账号
  2. 创建新的Skill仓库
  3. 通过CLI上传技能包:
clawhub publish --token=你的API令牌

发布后其他用户可以通过以下方式安装:

clawhub install file-processor

6. 真实案例:合同分析器

我将这个技能实际应用在法律合同审查中,实现了:

  • 自动提取:签约方、有效期、违约责任等关键条款
  • 风险提示:通过与预设规则对比标记异常条款
  • 报告生成:输出结构化分析结果到Excel

典型使用场景:

# 通过OpenClaw CLI调用
openclaw exec file-processor extract_fields \
  --file_path=contract.docx \
  --field_rules='{"parties":"合同开头甲乙双方名称"}'

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐