.NET Conf China 2023分享-.NET应用国际化-AIGC智能翻译+代码生成
今年.NET Conf China 2023技术大会,我给大家分享了
.NET应用国际化-AIGC智能翻译+代码生成的议题,今天整理成博客,分享给所有人。
随着疫情的消退,越来越多的企业开始向海外拓展,应用系统的国际化和本地化是一个巨大的技术挑战,我们今天重点探讨以下内容:
- .NET应用如何实现国际化?不仅仅包含资源文件和文本的替换,还有文本词条抽取、智能翻译、代码替换、本地化处理等各种场景。
- 基于Roslyn进行代码分析,查找中文文本、抽取词条,以及代码替换。
- 机器翻译与GPT的Battle,基于GPT4实现一个智能翻译服务。
- 彩蛋环节:如何使用Github Copilot自动生成代码和单元测试。
一、.NET应用如何实现国际化
目前我们的充电服务平台包含16大子系统,上千个功能菜单,数十个数据库... 大部分应用基于.NET技术栈构建,都需要支持国际化&本地化。 如何快速、高效、准确地完成产品国际化&本地化改造是团队面临的一个巨大的挑战! 没有相关经验怎么办? 好在有了ChatGPT!!! 我们先问一下ChatGPT~
总结:技术方案可行,但是有几个架构设计上的问题: 1. 重度依赖资源文件 2. 大型分布式部署,分发、管理成本很高、很复杂 3. 需要大范围扫描、改造代码 4. 翻译、校对工作量巨大 5. 无法批量、动态修改翻译文本。
在ChatGPT基础上,发挥.NET技术栈的能力,创新设计了一个新的解决方案:
抽象封装一个词条服务,根据线程上下文的CurtureInfo,动态获取对应的多语言文本 注:
1.1 词条通常用于标识需要被翻译文本的唯一标识。
上图中: 词条类I18NTerm:用于存储词条数据 词条管理接口:用于词条的批量新增、修改 词条服务接口:支持按词条查询对应的翻译文本。
2 基于Roslyn,解析代码中的中文,形成多语言词条,同时做代码替换 封装一个翻译服务,批量翻译词条
再次找到ChatGPT问一问 Prompt:你是一个.NET资深开发工程师,全面掌握C#语言,请基于Roslyn技术实现一个服务,输入一个sln解决方案的路径,扫描各个类中的中文文字,统一替换为I18nTermService.GetText('词条ID')
重新设计一下技术实现方案:
3. 机器翻译与GPT的Battle,基于GPT4实现一个智能翻译服务。
基于Azure AI services 的 Translator实现机器翻译
但是机器翻译的准确性怎么样?机器翻译有哪些问题
尝试使用ChatGPT做专业翻译:先设计Prompt 请把以下词语列表翻译为英文 1. 充电站,2.电站,3.充电桩,4.充电终端,5.终端,每个单词一行
依旧不理想,继续修改Prompt
Prompt:你是一个美国电动汽车充电服务运营商,精通中文和英文,请使用专业领域术语,把以下词语列表翻译为英文,1. 充电站,2.电站,3.充电桩,4.充电终端,5.终端,翻译时电站等同于充电站,充电终端等同于充电桩,终端也等同于充电桩,每个单词一行。
充电桩的专业翻译是 Charging point 需要一个专业术语表
继续改进Prompt
Prompt:你是一个美国电动汽车充电服务运营商,精通中文和英文,请使用以下格式的专业术语 {"充电站":"Charging station", "充电桩":"Charging point"},把以下词语列表翻译为英文,1. 充电站,2.电站,3.充电桩,4.充电终端,5.终端,翻译时电站等同于充电 站,充电终端等同于充电桩,终端也等同于充电桩,每个单词一行。
翻译准确性提升了 我们继续改进,同时实现工程化
Prompt:你是一个美国电动汽车充电服务运营商,精通中文和英文,请使用以下格式的专业术语 {"充电站":"Charging station", "充电桩":"Charging point"},把以下词语列表翻译为英文,1. 充电站,2.电站,3.充电桩,4.充电终端,5.终端,翻译时电站等同于充电站,充电终端等同于充电桩,终端也等同于充电桩,请以JSON格式返回,例如 {"充电站":"Charging station", "充电终端":"Charging point"},不需要做解释
更好的Prompt
请扮演一个美国电动汽车充电服务运营商,精通中文和英文,请使用以下专业术语 {"充电站":"Charging station", "电站":"Charging station", "场站":"Charging station", "充电桩":"Charging point", "充电终端":"Charging point", "终端":"Charging point" , "电动汽车":"Electric Vehicle", "直流快充":"DC Fast Charger","超级充电站":"Supercharger","智能充电":"Smart Charging","交流慢充":"AC Slow Charging"}, 把请将用户的输入翻译为英文, 请以JSON格式返回 例如 {"充电站":"Charging station", "充电终端":"Charging point"} 不需要做解释
1.3 Prompt搞定后,使用SK框架,基于GPT4实现翻译服务, 用于专业翻译
测试一下:
4. 彩蛋环节:如何使用Github Copilot自动生成代码和单元测试。
除了国际化翻译之外,我们还需要做应用的本地化处理。例如: 提供一个公共的本地化组件,支持对数字、时间、度量衡在不同区域下的处理。 接下来分享团队基于Github Copilot开发副驾,示例完成以上代码的生成过程。
先看一下Github copilot
Prompt: 请用C#生成一个提供度量衡服务的实现类MeasurementService,它提供了以下方法将长度值转换为英寸、长度值转换为英尺、 将长度值转换为英里、 将长度值转换为厘米、 将长度值转换为千米、 将重量值转换为克、 将重量值转换为千克、 将功率值转换为瓦特、 将电流值转换为安培、 将电压值转换为伏特。 例如将长度值转换为英寸的实现方法是public double ConvertToInch(double value, LengthUnit lengthUnit),这个方法中遍历LengthUnit,做长度转换。方法请添加标准注释,使用中文注释。
这里你会发现,其他方法未实现,需要继续告诉Github Copilot继续生成代码 Github Copilot生成的代码不一定全面准确,需要做代码确认,这个很关键 Prompt: MeasurementService类中, 请参考ConvertToInch这个方法的实现方式和注释要求, 继续生成ConvertToMile,ConvertToFoot,ConvertToCentimeter, ConvertToKilometer, ConvertToGram,ConvertToKilogram, ConvertToWatt,ConvertToAmpere, ConvertToVolt等方法的具体转换逻辑, 每个方法都要实现代码输出。
我们继续让Github Copilot生成单元测试代码:
首先选择整个类,然后输入以下Prompt Prompt: @workspace /tests 请对选中的代码,使用MSTest单元测试框架,生成单元测试代码,请为每个方法都实现单元测试
以上我们共同探讨了基于AIGC实现.NET应用国际化 从智能翻译到代码生成,
这是LLM时代一个小小的案例,但是 未来: 有LLM加持的智能翻译将更精准,全面提升用户体验。
代码自动生成将全面释放开发者创造力。
随着AIGC的迭代升级,AI将为我们带来更多应用创新和价值创造。
周国庆
2024/1/5