
摘要
代码翻译在实际应用时的挑战:不完备的上下文理解,不灵活的prompt设计,不完备的错误修复方法。
设计RepoTransAgent,多智能体框架实现repository-aware code translation,
具体实现:将翻译任务分解为特定的子任务,包括context retrieval,dynamic prompt construction和iterative code refinement,每个过程使用专用的agent
一. Introduction
现有工作缺陷:
- rule-based 系统难以处理复杂的语法结构和缺乏处理多重programming contexts的控制
- 基于prompt方法过于简单和静态,难以处理动态多样化的repository contexts
挑战: - 传统静态分析,包括call graphs和program dependency graphs,难以直接向LLM解释,同时引入了冗余和不相关信息
- prompt设计难以处理动态和变化的repo context
- 错误修复过度依赖于test case的执行,而不是提供可行动的guidance和comprehensive context
RepoTransAgent,将repo-level的代码翻译转换为特定的子任务:检索语义近似的functions,收集相关的上下文信息,并且执行迭代的code generation和refinement
Agent设计: - RAG Agent:基于检索从repo中识别与检索与source function语义相似的function
- Context Agent:使用特殊tools增量式收集必要的上下文信息,关注于code translation最重要的相关components
- Refine Agent:基于source function,target function signature和RAG,Context Agent检索到的comprehensive information完成翻译过程,同时执行test cases,收集执行的feedback进行反思生成,生成targeted suggestions
动态和可适应的prompting模板:
静态组件:包括Goals,Guidelines和Examples,明确目标任务,基本原则和工作流
动态组件:涵盖Gathered Context,Input和Last Command,使得智能体根据具体输入和之前上下文适应不同的工具
评测:
基于6个popular open-source projects收集数百个Java-C# translation pairs。翻译效果超越baseline,同时发现大多数的错误为编译错误
二. Motivation
2.1 Motivation Examples
示例:从camel case(驼峰)到 snake case(蛇形)function 从Java翻译为C#,挑战如下:

- 缺乏Context Retrieval的静态分析: 需要LLM识别和理解dependencies,invocation relationships和相似的function implementations用于指导翻译过程。传统方法基于call graphs和program dependency graphs收集必要的context,但是该信息难以转换为对LLM正确理解的格式。静态分析方法依赖于预定义规则和模式匹配,难以适应代码结构和外部依赖的动态变化。同时静态分析引入无关上下文。
- 固定Prompt设计提示不足:前序工作依赖于简单和固定的prompt designs,难以捕捉functions间结构和功能的差异,同时难以在varying contexts足够适应
- 错误机制纠正不足: 仅依赖erroneous code和related test failures难以正确的修复错误,错误信息可能是由于class symbol难以找到(当未提供解决方案信息),正确的修复应当是理解错误根因,收集必要上下文,之后得到target fixes
2.2 Key Ideas
- 多智能体framework:基于RAG、Context、Refine Agent,每个subtask交给专门的agent
- 基于工具引入的智能Context检索: 设计五个专用工具,允许agent选择性引入context。减少冗余context和提升翻译效率。并基于推理能力解释代码中自然语言描述,和利用语义知识推断语义信息,实现更为京都企鹅的上下文检索,以及处理传统静态分析的不灵活和冗余现象
- 动态Prompt Construction:在Context 和 Refine设置动态和well-structured prompts。静态包括Goal、Guidelines、Example和Output,而动态信息基于agent当前state,如Input基于被翻译的source function更新,Gathered Context协同前序收集的信息
- 上下文分析提升Error Correction:基于faulty code 和 test outputs分析error causes,之后提出针对性修复策略,指示agent重新调用工具,收集识别错误信息相关的上下文
三. Approach

3.1 Overview
- RAG Agent:检索与目标函数相似的函数,以协助翻译原函数
- Context Agent:检索需要的上下文信息,用于翻译原函数
- Refine Agent:将翻译的代码迭代优化,基于test cases results生成reflections,并基于error messages重新检索context,再进行修正
3.2 RAG Agent
RAG Agent主要包括4个部分:Preprocessing,Selective Retrieval,Multi-Route Retrieval 和 Result Filtering
1)Preprocessing
首先预处理metadata,并将其两个截然不同的components生成对应的embedding
first component:所有source-target translation pairs 的 method bodies
second component:target repo所有methods的function names
存储至两个database中,指向pair store 和 name store
2)Selective Retrieval
在启动RAG之前,让Agent决定target function是否需要RAG协助。基于目标函数是否独立且具备足够的简单性,若Agent判断不需要RAG,则绕过RAG过程
3)Multi-Route Retrieval
该RAG包括两个互补部分
- first component:检索与当前source function相似的source-target translation pairs,基于BM25和余弦相似度检索,并基于Reciprocal Rank Fusion(RRF)精排
- second component:检索与target function名字最相似的top-k function
4)Result Filtering
并不是检索到的所有function是有助于翻译的,要求Agent基于functional similarity,structural resemblance 和 referenced context决定去留
3.3 Context Agent
基于Context Agent获取repository-aware 代码翻译的必要context
1)Workflow
基于相关的source 和 target functions,构建动态的prompts,确定引入什么工具。当确定后,Context Agent调用指定的工具获取相应的输出。之后,基于信息不断重建动态的prompt。
直至到达最大迭代次数 或者 agent确定获取足够的上下文
2)Tool Introduction
主要包括如下5类工具
- get_source_class_info:获取包含source function的class的所有field definitions和method signatures
辅助agent推断class是否包括该instance,有助于agent探索source function的class在target repo如何实现 - get_target_class_info:获取包含target function的class所有的field definitions和method signatures,
辅助agent理解在target function引入什么样的field和methods - find_target_imports:检索包含目标函数的文件中所有导入的类,揭示target class间的依赖关系
- find_target_class_info:给定class name,在target repo中检索所有field definition information和method signature information包括class。如果代理认为某个类在target function中被引用的可能性很高,这个工具功能可以有效地帮助代理找到关于该类的相关信息
- find_target_method_body:给定class name 和 method name,获取method body,便于agent在target function更好的利用该method,或决定是否使用该method
首先要求agent使用get_source_class_info,get_target_class_info和find_target_import,获取与source function相关的基本信息,之后基于获取的信息进行翻译,同时基于find_target_class_info和find_target_method_info多次得到更为具体的信息。所有的信息为JSON格式

3)Dynamic Prompt Construction
prompt主要包括如下部分:
- Goals(Static):收集最相关的信息,辅助repo 代码翻译
- Tools(Static):所有tools的定义,包括names,parameters 和 descriptions
- Guidelines(Static):首先要求Agent使用get_source_class_info,get_target_class_info和find_target_imports,来获取source function的相关基本信息。之后,指导使用find_target_class_info和find_target_method_body收集足够的context,包括识别新的类型依赖,验证接口实现,解析packages到namespace的mappings
- Example(Static):设计示例如何正确使用工具序列,收集必要的上下文
- Input(Dynamic):包括source function和target function signature,用于收集context,指导agent收集与source function相关的信息
- Gathered Context(Dynamic):基于tool检索的信息,作为agent memory确定调用下一个合适的工具
- Output Format(Static):输出格式统一使用JSON object
- Last Command(Dynamic):记录调用的tool序列和返回的output,提示agent反思是否存在缺陷,并避免重复调用工具
3.4 Refine Agent
作为代码翻译和迭代error correction的核心部分。基于test case执行和self-reflection方法迭代提升翻译质量
1)Initial Generation
Agent接受source function body和target function signature作为输入,最后附带Context Agent的上下文信息和RAG Agent的similar function,输出markdown格式的翻译代码
2)Test Execution
收集和分析test execution results,主要包括如下4类错误:
compilation errors,test failures,runtime errors 和 non-terminating executions
收集 error logs,error classifications,output messages 和 precise error locations辅助针对性修正
3)Reflection
检查source function,target function signature,generated erroneous code 和 相关的 test execution results
确定哪里出错以及为何错误
4)Error Correction
增加信息,包括上轮的错误代码,详细的测试执行结构,agent的反思和修复策略
不断迭代,直至修复成功
四. 实验
4.1 Dataset
包括6个highly-rated Github projects,提取Java-C#翻译pairs,包括对应的test cases
4.2 Baselines
选择3个,分别为UniTrans 和 PLTranslation,以及直接使用LLM翻译,不用Agent框架
4.3 Evaluation Metrics
compile rate 和 pass rate
五. 结果与分析
- RQ1:Effectiveness Comparison.相较于baseline的翻译效果
- RQ2:Ablation Study
- RQ3:不同模型下的效果
翻译效果(基于Deepseek v3):

翻译结果的交集:

不同类型的错误分布:


Case Study:
CellPropertyType:通过find_target_imports发现未引入CellUtils,而是等价的CellPropertyType
collectCount:
消融实验:

