# 翻译案例
近期，斯坦福大学教授吴恩达开源了一个AI智能体机器翻译——一个使用反思工作流进行翻译的智能体，该项目中演示了反思智能体工作流的机器翻译示例。智能体的主要步骤如下：
1. 初始翻译，使用大模型（LLM）将文本从source_language翻译为target_language;
2. 进行反思，让大模型指出翻译结果中的不足，并给出建设性的改进建议；
3. 修改翻译，让大模型根据反思给出的建议，重新进行翻译；
项目中采用的反思工作流，让模型自己去发现不足，再根据不足做定向的修改，是一种典型的多智能体协同工作机制，这也是agentUniverse一直涉足的领域，于是我就有将这个翻译智能体复刻到agentUniverse上面的想法。

## 多智能体的协同工作过程
翻译过程中，优先判断模型的长度是否超过了模型所能承受的最大token,针对超过模型长度的情况,先对文本进行切块，再对分块后的文本进行翻译，
但是无论长文本还是短文本，翻译过程都是基于初始翻译->反思->修改的流程进行的。
![多智能体协同工作流程](../../_picture/translation_flow_graph.png)

## 在aU中的实现
在aU中实现该翻译的过程主要分为以下几步：
1. 定义翻译相关的prompt，短文本翻译三个，长文本翻译三个，相关文件如下:  
[短文本翻译init prmpt](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/prompt/translation/translation_init_en.yaml)  
[短文本翻译reflection prmpt](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/prompt/translation/translation_reflection_en.yaml)  
[短文本翻译improve prmpt](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/prompt/translation/translation_improve_en.yaml)  
[长文本翻译init prmpt](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/prompt/translation/multi_translation_init_en.yaml)  
[长文本翻译reflection prmpt](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/prompt/translation/multi_translation_improve_en.yaml)  
[长文本翻译improve prmpt](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/prompt/translation/multi_translation_improve_en.yaml)  
在aU中,可以很容易的通过配置文件定义prompt，并统一由PromptManager管理。
  

2. 定义三个智能体  
[短文本翻译智能体](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/agent/agent_instance/translation_agent_case/translation_work_agent.yaml)  
[短文本翻译智能体](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/agent/agent_instance/translation_agent_case/translation_reflection_agent.yaml)  
[短文本翻译智能体](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/agent/agent_instance/translation_agent_case/translation_improve_agent.yaml)  
该智能体当中，需要根据执行的时长文本翻译还是短文本翻译切换对应的prompt，具体逻辑可参考[代码实现](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/agent/agent_instance/translation_agent_case/translation_agent.py)  
由于定义的prompt全部由PromptManager进行管理，这里可以很容易的实现prompt的切换
    

3. 定义三个智能体的协同工作过程  
协同过程可参考前面介绍的多智能体协同工作过程的流程图,具体的实现逻辑如图：    
![协同工作](../../_picture/translation_execute_flow.png)    
更细的流程可以参考[代码文件](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/agent/agent_instance/translation_agent_case/translation_by_token_agent.py)  
协同智能体的[配置文件](../../../../examples/sample_apps/translation_agent_app/intelligence/agentic/agent/agent_instance/translation_agent_case/translation_agent.yaml)

### 演示代码
[代码链接](../../../../examples/sample_apps/translation_agent_app/intelligence/test/test_translation_agent.py)

[长翻译文本](../../../../examples/sample_apps/translation_agent_app/intelligence/test/translation_data/long_text.txt)  
[短翻译文本](../../../../examples/sample_apps/translation_agent_app/intelligence/test/translation_data/short_text.txt)  

[短翻译结果](../../../../examples/sample_apps/translation_agent_app/intelligence/test/translation_data/short_text_result.txt)  
[长翻译结果](../../../../examples/sample_apps/translation_agent_app/intelligence/test/translation_data/long_text_result.txt)  

### 演示结果
可以看到，使用aU与原本的translation_agent原工程翻译结果保持一致，复刻成功。  
aU的执行结果:  
![aU执行长文本结果](../../_picture/long_translation_au.png)    
  
Translation_agent的执行结果:  
![translation执行长文本结果](../../_picture/long_translation_wu.png)  

### 其他
1. 在参考吴恩达教授的代码当中，处理分块翻译时，为了保证翻译的连贯性，翻译每一个分块时，会携带相应的上下文。但是在他的代码当中将所有的翻译内容都放在的上下文当中，会使切分失去原本的意义，某些情况下会导致token超过模型所能接受的最大token，针对此问题我在对应的仓库地址提问了相关[issue](https://github.com/andrewyng/translation-agent/issues/28)
2. 该案例基于千问大模型，使用前需要您在环境变量中配置`DASHSCOPE_API_KEY`。
