开发者专属:OpenClaw+ollama-QwQ-32B实现Github Issue自动分类

1. 为什么需要自动化Issue分类

每次打开Github仓库看到堆积如山的Issue时,我都会陷入一种"分类焦虑"——新提交的bug报告、功能请求、文档问题混杂在一起,手动打标签和分配负责人要消耗大量时间。作为个人开发者或小团队,这种重复劳动尤其影响效率。

上个月在维护一个开源项目时,我尝试用OpenClaw+ollama-QwQ-32B搭建了自动化分类流水线。这个组合的独特优势在于:

  • 本地化处理:Issue数据无需离开开发环境,避免敏感信息外泄
  • 语义理解:32B参数的QwQ模型能准确捕捉自然语言描述中的意图
  • 灵活扩展:OpenClaw可以监听Github事件并执行复杂操作链

经过三周的迭代,系统现在能自动完成:

  1. 实时监听仓库的Issue创建/更新事件
  2. 提取正文关键特征(错误日志、功能描述等)
  3. 预测标签类别(bug/enhancement/documentation)
  4. 根据标签分配默认负责人

2. 环境准备与核心组件

2.1 基础架构拓扑

整个系统运行在我的M1 MacBook Pro上(16GB内存),主要组件包括:

  • ollama-QwQ-32B:本地运行的文本生成模型,处理语义分析
  • OpenClaw 1.2.3:任务调度与自动化执行框架
  • Github App:提供仓库事件推送的Webhook
# 验证组件版本
ollama --version  # ollama version 0.1.12
openclaw --version  # openclaw/1.2.3 darwin-arm64

2.2 OpenClaw关键配置

~/.openclaw/openclaw.json中声明模型接入点:

{
  "models": {
    "providers": {
      "local-ollama": {
        "baseUrl": "http://localhost:11434",
        "api": "openai-completions",
        "models": [
          {
            "id": "QwQ-32B",
            "name": "Local Ollama QwQ",
            "contextWindow": 32768
          }
        ]
      }
    }
  }
}

特别注意baseUrl需要与ollama服务端口一致(默认11434)。配置完成后执行:

openclaw gateway restart
openclaw models list  # 应显示QwQ-32B可用

3. 构建分类流水线

3.1 Github Webhook设置

在仓库Settings → Webhooks中创建新的推送目标:

  • Payload URL: http://your-openclaw-server:18789/github-webhook
  • Content type: application/json
  • Secret: 建议设置(需与OpenClaw配置一致)
  • Events: 仅勾选Issues

然后在OpenClaw中配置接收端:

openclaw plugins install @openclaw/github-listener

编辑~/.openclaw/skills/github.yml

webhooks:
  github:
    secret: "your_webhook_secret"
    events:
      - issues
    actions:
      - when: "action == 'opened' || action == 'edited'"
        then: "run classify-issue --repo=${repository.full_name} --issue=${issue.number}"

3.2 分类逻辑实现

创建~/.openclaw/skills/classify-issue.js

const { OpenClaw } = require('@openclaw/core');

module.exports = async function classifyIssue({ repo, issue }) {
  const github = new OpenClaw.GitHubClient();
  const issueData = await github.getIssue(repo, issue);
  
  // 构造分类提示词
  const prompt = `
  请根据以下Github Issue内容判断最合适的标签:
  Title: ${issueData.title}
  Body: ${issueData.body}

  可选标签:
  - bug:程序错误或异常行为
  - enhancement:功能改进或新增请求  
  - documentation:文档相关问题
  - question:使用咨询类问题

  只需回复标签名称,不要解释。`;

  // 调用本地模型
  const response = await OpenClaw.Models.generate({
    model: "QwQ-32B",
    prompt,
    max_tokens: 10
  });

  const label = response.trim().toLowerCase();
  await github.addLabels(repo, issue, [label]);
  
  // 根据标签分配负责人
  const assigneeMap = {
    'bug': 'backend-lead',
    'enhancement': 'product-owner',
    'documentation': 'tech-writer'
  };
  
  if (assigneeMap[label]) {
    await github.addAssignees(repo, issue, [assigneeMap[label]]);
  }
};

4. 提升分类准确率的技巧

初期运行时,模型可能会混淆"功能请求"和"使用问题"。通过以下方法显著提升了准确率:

4.1 少量样本微调

收集50个历史Issue作为训练样本,构造如下格式的微调数据:

### 输入:
Title: 登录页面报500错误
Body: 点击登录按钮后服务器返回500状态码

### 输出:
bug

### 输入:  
Title: 建议增加黑暗模式
Body: 希望在设置中添加主题切换功能

### 输出:
enhancement

使用ollama的微调接口:

curl -X POST http://localhost:11434/api/finetune \
  -H "Content-Type: application/json" \
  -d '{"model":"QwQ-32B", "data":"path/to/tuning_data.txt"}'

4.2 动态提示词优化

发现模型对模糊描述容易误判后,改进了提示词模板:

const prompt = `
请严格按以下规则分类Issue:
1. 出现"error/异常/报错"等关键词 → bug
2. 包含"建议/希望/可以...吗" → enhancement  
3. 涉及"文档/注释/README" → documentation
4. 其他情况 → question

Issue内容:
Title: ${title}
Body: ${body}

直接回复标签名称:`;

这种"规则引导+语义理解"的混合策略,使准确率从初期的72%提升到89%。

5. 实际运行效果与注意事项

部署后系统自动处理了仓库近期的137个Issue,其中:

  • 正确分类122例(89%)
  • 需要人工修正15例(主要是复杂场景描述)
  • 平均响应时间2.3秒(从Issue创建到完成分类)

几个关键教训

  1. 内存监控很重要:ollama-QwQ-32B会占用约12GB内存,长期运行需关注资源使用
  2. 频率限制:Github API有速率限制,大批量操作需要添加延迟
  3. 人工复核:建议保留标签修改权限,关键仓库可设置"auto-labeled"标签供复查
# 资源监控命令(MacOS)
top -o mem | grep -E 'ollama|openclaw'

这个方案特别适合个人开发者或小型开源团队。相比SaaS方案,本地部署在数据隐私和定制灵活性上有明显优势,而OpenClaw的任务编排能力让整个流程可以随需求灵活调整。


获取更多AI镜像

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

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐