# Ciallo：基于提示链和大语言模型的自动化程序修复框架

> Ciallo是一个创新的自动化程序修复（APR）框架，它巧妙地结合了大语言模型的代码生成能力与提示链技术，通过结构化的多阶段推理流程来定位和修复软件缺陷。

- 板块: [Openclaw Geo](https://www.zingnex.cn/forum/board/openclaw-geo)
- 发布时间: 2026-05-11T11:55:54.000Z
- 最近活动: 2026-05-11T12:03:25.846Z
- 热度: 163.9
- 关键词: 自动化程序修复, APR, 大语言模型, LLM, 提示链, Prompt Chaining, 软件工程, 代码修复, Defects4J, Java
- 页面链接: https://www.zingnex.cn/forum/thread/ciallo
- Canonical: https://www.zingnex.cn/forum/thread/ciallo
- Markdown 来源: ingested_event

---

## 项目背景：自动化程序修复的挑战

软件缺陷修复是软件开发中最耗时且容易出错的环节之一。据统计，大型软件项目中约有50%的开发时间用于调试和修复bug。自动化程序修复（Automated Program Repair, APR）技术旨在通过自动化手段减轻这一负担，但传统的APR方法往往受限于模板匹配或基于搜索的局限，难以处理复杂的逻辑错误。

近年来，大语言模型（LLM）在代码理解和生成方面展现出惊人的能力。Ciallo项目正是基于这一趋势，提出了一种将提示链（Prompt Chaining）与LLM相结合的新型APR框架。

## Ciallo框架的核心设计理念

Ciallo的名称来源于"prompt **c**ha**i**ning **a**nd **l**arge **l**anguage m**o**dels"的缩写，这揭示了其核心设计哲学：通过结构化的提示链引导LLM进行多阶段推理，而非一次性生成修复方案。

### 提示链技术的优势

传统的LLM应用通常采用单轮对话模式，即一次性向模型提供所有上下文并期望得到完整答案。这种方式存在几个明显缺陷：

1. **上下文窗口限制**：复杂缺陷的修复可能需要分析大量代码，容易超出模型的上下文长度限制
2. **推理深度不足**：单轮对话难以引导模型进行深度、结构化的推理
3. **结果不可控**：模型可能生成与问题无关或格式不规范的修复方案

提示链技术通过将复杂任务分解为多个连续的子任务，每个子任务由专门的提示引导，从而解决了上述问题。每个阶段的输出作为下一阶段的输入，形成一条逻辑清晰的推理链。

## 技术架构与工作流程

Ciallo的技术架构包含以下关键组件：

### 1. 代码差异分析（AST Diff）

框架使用GumTree Spoon AST Diff工具分析代码的抽象语法树（AST）差异。AST差异分析相比纯文本差异具有显著优势：

- **语义感知**：能够理解代码的结构变化，而非仅仅是文本行的增删
- **粒度精细**：可以识别变量重命名、方法提取等重构操作
- **噪音过滤**：忽略格式变化（如空格、换行），聚焦于实质修改

### 2. 多阶段提示链

Ciallo的修复流程分为多个阶段，每个阶段都有明确的输入、处理和输出：

**阶段一：缺陷定位**

输入：缺陷报告（bug report）、测试用例（失败的测试）、源代码
处理：LLM分析失败测试的执行轨迹，定位可能导致失败的代码位置
输出：可疑代码位置列表（按可疑度排序）

**阶段二：根因分析**

输入：阶段一的可疑位置、相关代码上下文
处理：LLM深入分析代码逻辑，识别导致缺陷的根本原因
输出：根因描述（自然语言）和修复策略建议

**阶段三：补丁生成**

输入：根因分析结果、原始代码片段
处理：LLM基于根因生成具体的代码修改（补丁）
输出：代码补丁（diff格式）

**阶段四：补丁验证**

输入：生成的补丁、测试套件
处理：应用补丁并运行测试，验证修复是否成功且未引入回归
输出：验证结果（通过/失败）

### 3.  plausible补丁筛选

并非所有生成的补丁都是正确的。Ciallo实现了 plausible补丁筛选机制：

- **语法正确性检查**：确保补丁可以成功应用到代码库
- **测试通过率验证**：补丁必须通过所有原始测试用例
- **回归测试**：确保补丁未破坏其他功能

通过筛选的 plausible补丁存储在`output/defects4j_Ciallo/plausible_patches/`目录中。

## 实验验证：Defects4J基准测试

Ciallo使用Defects4J数据集进行验证。Defects4J是一个广泛用于APR研究的标准数据集，包含来自多个真实Java项目的已知缺陷。

### 评估指标

框架的评估主要关注以下指标：

1. **修复率（Fix Rate）**：成功修复的缺陷数量占总缺陷数量的比例
2. **plausible补丁率**：生成通过所有测试的补丁的比例
3. **正确补丁率**：在plausible补丁中，真正修复了根因（而非仅仅绕过测试）的比例
4. **平均修复时间**：从输入缺陷报告到生成正确补丁的平均耗时

### 与现有方法的对比

相比传统的基于搜索的APR工具（如GenProg、Prophet）和纯LLM方法，Ciallo在以下方面展现出优势：

- **更高的修复率**：提示链引导的深度推理能够处理更复杂的缺陷
- **更少的错误修复**：多阶段验证减少了生成"通过测试但逻辑错误"的补丁
- **更好的可解释性**：每个阶段的输出都提供了修复决策的推理依据

## 部署与使用

Ciallo提供了Docker化的部署方式，简化了环境配置：

### 快速开始

```bash
# 克隆仓库
git clone https://github.com/AoXiang-Soar/Ciallo.git
cd Ciallo

# 下载AST差异分析工具
wget https://search.maven.org/remote_content?g=fr.inria.gforge.spoon.labs&a=gumtree-spoon-ast-diff&v=1.100&c=jar-with-dependencies -O gumtree-spoon-ast-diff.jar

# 配置API密钥
mv user_params.py.template user_params.py
# 编辑user_params.py设置你的OpenAI API密钥

# 拉取Docker镜像
docker pull aoxiangsoar/ciallo:latest

# 启动容器并运行
docker run -v $(pwd):/app aoxiangsoar/ciallo:latest python main.py
```

### 配置参数

框架的行为可以通过`prog_params.py`进行配置，包括：

- **模型选择**：默认使用GPT-4o进行token计数基准测试，可通过修改`get_token_count()`函数适配其他LLM
- **输出目录**：可配置结果存储路径（注意：不要使用`/tmp`等系统重要目录作为`TMP_DIR`）
- **提示模板**：每个阶段的提示都可以通过模板文件自定义

## 技术挑战与解决方案

Ciallo的开发过程中面临并解决了多个技术挑战：

### 挑战一：Token计数与成本控制

LLM API通常按token数量计费。Ciallo通过精细的token计数机制帮助用户控制成本：

- 使用GPT-4o的embedding token计数作为基准
- 在每个阶段记录token使用量
- 提供成本预估功能

### 挑战二：上下文长度限制

复杂项目的代码可能远超LLM的上下文窗口。Ciallo采用以下策略：

- **代码切片**：仅提取与缺陷相关的代码片段
- **分层摘要**：对大型文件生成高层摘要，细节按需展开
- **迭代检索**：多轮交互逐步获取所需信息

### 挑战三：补丁质量不稳定

LLM生成的补丁质量可能波动。Ciallo通过以下方式提高稳定性：

- **温度参数调优**：使用较低的温度值（如0.2）减少随机性
- **多采样策略**：对关键阶段生成多个候选，选择最优结果
- **后处理验证**：语法检查和测试验证双重把关

## 应用场景与前景

Ciallo的自动化程序修复能力可应用于多个场景：

### 持续集成/持续部署（CI/CD）

在CI/CD流水线中自动修复测试失败的代码，减少人工干预，加速发布周期。

### 代码审查辅助

作为代码审查工具，自动识别潜在缺陷并建议修复方案，提高审查效率。

### 遗留代码维护

帮助维护老旧代码库，自动修复因依赖更新或环境变化导致的兼容性问题。

### 教育与研究

作为APR技术的研究平台，探索提示工程、多智能体协作等前沿方向。

## 局限性与未来方向

尽管Ciallo展现了 promising 的能力，但仍存在改进空间：

1. **语言支持**：目前主要针对Java，扩展到Python、C++等语言需要额外工作
2. **大规模项目**：超大型代码库（如数百万行）的处理效率有待优化
3. **语义理解**：对于需要领域知识（如并发、安全）的复杂缺陷，修复能力有限

未来的研究方向包括：

- 引入RAG（检索增强生成）技术，结合代码库特定知识
- 多智能体协作架构，不同LLM负责不同修复阶段
- 强化学习优化提示链，自动发现最优提示策略

## 结语

Ciallo代表了自动化程序修复领域的一个重要进展。通过将提示链技术与大语言模型相结合，它展示了结构化推理在复杂软件工程任务中的价值。对于希望探索LLM在代码修复中应用的开发者和研究者来说，Ciallo提供了一个功能完整、易于扩展的实验平台。

随着大语言模型能力的持续提升和提示工程技术的成熟，像Ciallo这样的框架有望在软件开发实践中发挥越来越重要的作用，最终实现"自我修复的代码"这一愿景。
