查看原文
其他

技术应用 | 通义灵码:更适合码农宝宝的Copilot

张梓琦 张修海 翻译技术教育与研究
2024-09-09

通义灵码
           更适合码农宝宝的Copilot



在数字化转型浪潮中,通义灵码作为阿里巴巴达摩院的创新结晶,以其独特优势革新人机交互,联通现实与数字世界。面对海量代码与日益增长的智能需求,通义灵码以其强大的辅助功能,有效提升代码识别、管理与应用效率,赋能开发者应对复杂编程挑战,推动软件开发迈向更高智慧层次。本文将聚焦通义灵码在辅助代码工作方面的核心价值与实践应用,一窥其如何塑造更高效、智能的编程未来。









本地配置


在 Visual Studio Code 中安装通义灵码

  1. 已安装 Visual Studio Code 的情况下,在侧边导航上点击扩展。

  2. 搜索通义灵码(TONGYI Lingma),找到通义灵码后点击安装。

  3. 重启 Visual Studio Code,重启成功后登录阿里云账号,即刻开启智能编码之旅。

在 JetBrains IDEs 中安装通义灵码

以 IntelliJ IDEA 为例

  1. 已安装 IntelliJ IDEA 的情况下:

macOS系统:IntelliJ IDEA 菜单下点击设置

Windows系统:文件菜单下点击设置

  2. 点击导航-插件,打开应用市场,搜索通义灵码(TONGYI Lingma),找到通义灵码后点击安装或者下载 JetBrains IDEs 的 zip 安装包, 点击导航-插件,点击设置图标,下拉菜单中单击从本地安装插件,选择下载的 zip 文件后安装。

  3. 重启 IntelliJ IDEA,重启成功后登录阿里云账号,即刻开启智能编码之旅。









直接生成代码应用实例



既然是大语言模型,就要先考验直接生成代码的能力。

我的指令是:

写一段代码 调用百度翻译开放平台的通用翻译API进行机器翻译

生成结果如下:

Python
  import requests
  import hashlib
  import json
  from urllib.parse import quote
 
  # 百度翻译API相关配置
  APP_ID = 'xxxxxxxxxxxxxxxxx'
  APP_KEY = 'xxxxxxxxxxxxxx'
  API_URL = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
  def baidu_translate(q, from_lang='auto', to_lang='en'):
      # 构造请求参数
      salt = str(int(time.time()))
      sign = APP_ID + q + salt + APP_KEY
      sign =   hashlib.md5(sign.encode('utf-8')).hexdigest()
 
      params = {
          'q': quote(q), 
          'from': from_lang,
          'to': to_lang,
          'appid': APP_ID,
          'salt': salt,
          'sign': sign
      }
 
      # 发送请求并解析响应
      response = requests.post(API_URL,   data=params)
      result = response.json()
 
      if 'trans_result' in result:
          return   result['trans_result'][0]['dst']
      else:
          raise Exception('Translation   failed: ' + result['error_msg'])
 
  # 示例:将中文文本翻译成英文
  text_to_translate = "这是一段待翻译的中文文本"
  translated_text =   baidu_translate(text_to_translate,"auto","en")
  print(f"Translated text: {translated_text}")



乍一看是不是觉得很强,觉得程序猿不存在了?不尽然。虽然它能生成完整代码,但它也因存在一些问题而导致其无法正常运行:

• 未导入time库,否则第12行无法使用time库的time函数;

• 请求地址虽然有效,但最好改为http://api.fanyi.baidu.com/api/trans/vip/translate;

• 第16行的参数字典中键“q”的值应为翻译原文,而不是quote类,应改为‘q’: q并删除第四行;

• 由于31-32行,这个程序报错部分偷懒了,只要没结果就输出签名错误。



但是不要忘了它只是一个辅助工具而已。所以接下来的时间咱们一起来探索一下辅助功能。使用到的示例代码如下所示,来自于百度翻译开放平台的机器翻译API技术文档。

Python
  # -*- coding: utf-8 -*-
 
  # This code shows an example of text translation from English to Simplified   Chinese.
  # This code runs on Python 2.7.x and Python 3.x.
  # You may install `requests` to run this code: pip install requests
  # Please refer to `https://api.fanyi.baidu.com/doc/21` for complete API   document
 
  import requests
  import random
  import json
  from hashlib import md5
 
  # Set your own appid/appkey.
  appid = 'INPUT_YOUR_APPID'
  appkey = 'INPUT_YOUR_APPKEY'
 
  # For list of language codes, please refer to   `https://api.fanyi.baidu.com/doc/21`
  from_lang = 'en'
  to_lang =  'zh'
 
  endpoint = 'http://api.fanyi.baidu.com'
  path = '/api/trans/vip/translate'
  url = endpoint + path
 
  query = 'Hello World! This is 1st paragraph.\nThis is 2nd paragraph.'
 
  # Generate salt and sign
  def make_md5(s, encoding='utf-8'):
      return   md5(s.encode(encoding)).hexdigest()
 
  salt = random.randint(32768, 65536)
  sign = make_md5(appid + query + str(salt) + appkey)
 
  # Build request
  headers = {'Content-Type': 'application/x-www-form-urlencoded'}
  payload = {'appid': appid, 'q': query, 'from': from_lang, 'to': to_lang,   'salt': salt, 'sign': sign}
 
  # Send request
  r = requests.post(url, params=payload, headers=headers)
  result = r.json()
 
  # Show response
  print(json.dumps(result, indent=4, ensure_ascii=False))
 
 

在左面的代码区,可以用鼠标选择一部分代码。在右边的对话框中,可以在对话框里打入一个/。这样就能调用出来四个基本功能了。









辅助功能



1. 解释代码

在示例代码的第11行可以看到一个笔者没有见到过的Python库,这时可以提问。


2. 生成单元测试

我们先了解一下什么叫做编程领域的单元测试。

单元测试是一种软件开发实践,它专注于对程序中的最小可测试单元进行独立、隔离的验证。单元测试的主要目标是确保每个源代码单元(如函数、方法、类等)按照预期工作,能够在给定特定输入时产生正确的输出,并且在边界条件、异常情况以及正常操作场景下行为正确。

以下是单元测试的关键特征和目的,以分点形式详细阐述:

最小可测试单元:

单元是代码的基本组成块,具体可以是函数、方法、类、模块等,取决于所使用的编程语言和项目结构。它是程序逻辑的基本封装单元,具有明确的接口和内部实现。

在C语言中,单元通常指一个函数;在Java或Go中,单元可能是单个类或类中的某个方法。

独立与隔离:

单元测试旨在测试单一单元的内部逻辑,而不涉及其依赖项的行为。为了达到这一点,通常会采取模拟(Mocking)、桩(Stub)、替身(Dummy)等技术来替换真实依赖,或者利用依赖注入使测试能够控制外部资源的行为。

这种隔离确保了测试结果仅反映被测单元本身的正确性,不受其他代码模块或外部因素(如网络延迟、数据库状态等)的影响,提高了测试的确定性和效率。

自动化执行:

单元测试通常编写为自动化脚本,使用专门的测试框架(如Python的unittest、pytest,Java的JUnit等)组织和运行。

自动化使得单元测试可以在开发过程中快速、频繁地执行,无需人工干预,有利于持续集成(CI)和持续部署(CD)流程,确保代码改动不会破坏已有功能。

覆盖范围:

好的单元测试应覆盖单元的所有关键逻辑路径,包括正常情况、边界条件、错误处理和异常情况。

代码覆盖率指标常用来衡量测试对源代码的覆盖程度,有助于识别未测试或测试不足的部分,但并非唯一评判标准,高质量的测试更关注逻辑覆盖而非行数覆盖。

开发益处:

通过编写单元测试,开发者在早期就能发现并修复代码缺陷,降低了后期修复成本。

测试驱动开发(TDD)等实践提倡先写测试再编写实现代码,这有助于驱动清晰的接口设计和模块化编码,提高代码质量。

单元测试作为文档的一种形式,展示了单元如何使用及其预期行为,对代码理解和维护有积极意义。

总结来说,单元测试是软件工程中确保代码模块正确性的一种基础测试手段,它通过对程序的最小可测试单元进行独立、自动化、详尽的验证,有助于发现并修复问题,促进代码质量提升,支持敏捷开发和持续交付流程。

我们可以全选所有代码然后在对话框中输入/,点击generate unit test。

代码如下

Python
  import unittest
  from hashlib import md5
 
  # 由于测试案例中提到了原文件路径,这里假设这个函数是从那个文件导入的
  from Baidu_Text_transAPI import make_md5    # 假定这是从你的待测文件中导入函数的方式
 
  class TestMakeMd5(unittest.TestCase):
     
      def   test_make_md5_with_default_encoding(self):
          # 测试默认的   utf-8 编码
            self.assertEqual(make_md5("hello"),   md5(b"hello").hexdigest())
     
      def   test_make_md5_with_custom_encoding(self):
          # 测试自定义编码
            self.assertEqual(make_md5("bonjour", encoding='utf-16'),   md5(b"bonjour".encode('utf-16')).hexdigest())
     
      def test_make_md5_with_non_string_input(self):
          # 测试非字符串输入
          with   self.assertRaises(TypeError):
              make_md5(123)  # 假设函数不接受非字符串输入
 
      def   test_make_md5_with_empty_string(self):
          # 测试空字符串
            self.assertEqual(make_md5(""),   md5(b"").hexdigest())
 
      def   test_make_md5_case_sensitivity(self):
          # 测试结果的不区分大小写
            self.assertEqual(make_md5("Hello"),   make_md5("hello"))
 
  if __name__ == '__main__':
      unittest.main()


3. 生成代码注释

接下来我们选择示例代码中8-11行导入Python库的代码,让它去解释这些库的作用,而且能提供这些库的示例。结果如下:

Python
  # 导入必要的模块
  import requests  # 用于发送HTTP请求
  import random  # 用于生成随机数
  import json  # 用于处理JSON数据
  from hashlib import md5  # 用于进行MD5加密
 
  # 示例函数:向指定URL发送GET请求,并返回请求结果的JSON格式数据
  # @param url 请求的URL地址
  # @return 请求结果的JSON格式数据
  def fetch_json(url):
      # 发送GET请求
      response = requests.get(url)
     
      # 检查请求是否成功
      if response.status_code == 200:
          # 返回请求结果的JSON格式数据
          return response.json()
      else:
          # 请求失败,返回空字典
          return {}
 
  # 示例函数:生成随机的MD5字符串
  # @return 随机生成的MD5字符串
  def generate_random_md5():
      # 生成随机字符串
      random_string =   ''.join(random.choices('abcdefghijklmnopqrstuvwxyz0123456789', k=16))
     
      # 将随机字符串加密为MD5
      md5_hash =   md5(random_string.encode()).hexdigest()
     
      # 返回加密后的MD5字符串
      return md5_hash
 
  # 示例函数:处理JSON数据中的特定键值对
  # @param data JSON格式的数据
  # @param key 需要处理的键
  # @return 对应键的值,如果键不存在则返回None
  def process_json_data(data, key):
      # 检查数据是否为字典类型
      if isinstance(data, dict):
          # 如果数据中包含指定键,则返回该键的值
          if key in data:
              return data[key]
      # 如果数据不是字典类型或键不存在,则返回None
      return None
 
  # 主程序入口
  if __name__ == "__main__":
      # 示例使用fetch_json函数获取数据并处理
      url =   "https://example.com/api/data"
      data = fetch_json(url)
      if data:
          # 示例使用process_json_data函数处理获取到的数据
          key_value =   process_json_data(data, "important_key")
          if key_value is not None:
              print(f"The value of   'important_key' is: {key_value}")
          else:
              print("The   'important_key' does not exist in the data.")
      else:
          print("Failed to fetch   data.")


4. 代码优化

可以在原本的基础上更好。全选代码后,得出的优化建议如下:

潜在问题及风险提示

1.      Python版本兼容性注释:虽然代码中提到该代码片段可在Python 2.7.x以及Python 3.x上运行,但实际代码使用了print作为函数以及json模块的方式,这暗示代码应是为Python 3.x设计的。对于Python 2.7的兼容性可能需要进一步测试和验证。

2.      安全性问题

○       使用md5进行签名可能存在安全隐患。md5已经不是被认为安全的加密方式,存在hash碰撞的可能性,建议使用更安全的加密算法如SHA-256。

○       明文存储和传输敏感信息(如appid和appkey)。建议通过环境变量或安全的配置管理系统来处理敏感信息,而不是在代码中硬编码。

3.      异常处理:缺少对请求发送过程中和解析响应时可能发生的异常的处理。网络请求可能会因多种原因失败,例如网络连接问题、服务端错误、请求超时等。建议增加异常处理逻辑来提高代码的健壮性。

4.      缺少输入验证:query变量的值直接被用于请求,如果该值来自不可信的源,可能存在注入攻击的风险。建议对输入进行验证和清理。

优化建议

1.      性能效率

○       目前看来,代码的性能瓶颈可能在于外部API调用的频率和响应时间。若API有限制调用频率,可以考虑实现调用频率控制,或者使用缓存机制减少对API的调用次数。

○       对于频繁调用的场景,可以考虑使用异步IO(如asyncio)来提高程序的响应性。

2.      可维护性

○       将API调用封装成函数或类,可以提高代码的可读性和可维护性。例如,创建一个translate函数,将所有与翻译API交互的逻辑包含在内。

○       对于make_md5函数,建议添加更详细的注释说明其用途,以及为什么需要生成这样的签名。

3.      代码清晰度

○       headers变量的定义未被直接使用,而是通过requests.post的参数直接传递。为了提高代码的可读性,建议直接在函数调用时定义headers。

○       可以考虑为整个翻译流程添加更详细的注释,从获取输入到发送请求、接收响应、处理结果,这有助于其他开发者快速理解代码的逻辑。

4.      使用环境变量管理敏感信息

○       使用如python-dotenv之类的库来管理环境变量,从而避免在代码中直接硬编码敏感信息,提高代码的安全性。








总结而言,在这个数字化转型的宏大背景下,通义灵码无疑是一股推陈出新的科技力量,以其开创性的设计理念和技术实力,有力地推进了人机交互体验的优化升级,成为链接现实与虚拟、实体与数据的坚实纽带。通义灵码不仅解锁了信息处理与传输的新维度,更为开发者提供了前所未有的代码辅助工具,显著提升了工作效率,赋予了软件开发更多可能性。

展望未来,随着通义灵码在各行各业的深度渗透与广泛应用,我们有理由相信,一个以高效、精准、智能为标志的全新代码世界正在徐徐展开。通义灵码将以其无穷的创新潜能和无限的应用前景,持续助力我们构建更加智慧化的生活环境,不断推动科技创新和社会进步的步伐,共绘未来数字世界的瑰丽蓝图。在这个过程中,每一位用户、每一个开发者,都将有机会携手通义灵码,共享这场技术革命带来的丰硕成果,共同书写属于我们的精彩篇章。












END







特别说明:本文仅供学习交流,如有不妥欢迎后台联系小编。




原创来源:张梓琦  张修海

推文编辑:王文轩

审核:朱华  陈佳艺

资讯推荐


人人学得会的翻译搜索技术 Cut-18

收藏|翻译专业学生翻译技术学习推荐书目


▶ 海量工具,每款都值得一试

【01】听说Perplexity改变外语教育?你会用吗?

【02】Microsoft Office和WPS中大语言模型插件初探

【03】国内大语言模型对比——基于翻译问题或翻译案

【04】教你如何使用 Copilot 

【05】ChatGPT 和 Gemini 达到专八水平了吗?

【06】国外主流翻译APP

【07】国内主流翻译APP工具

【08】在Trados中利用TM做预翻译

【09】平行语料库在口译实践中的应用

【10】语料库探索之语料对齐及分词赋码

【11】语料处理之语料采集与清洗 

【12】如何创建应用于Trados的术语库?

【13】如何使用Trados建立翻译记忆库?

【14】国内外常见语料工具一览

【15】翻译人员不容错过的5个权威术语库

【16】国内外常见CAT工具一览

【17】AntConc简介及索引工具介绍(一)

【18】Quicker使用技巧

【19】Everything:一款“秒”搜文件的神器

【20】Sketch Engine探索第一弹来袭!

【21】LancsBox:语料库研究者的必备工具

【22】TermWiki:术语检索利器

【23】ABBYY FineReader PDF:文档识别小帮手


点击更多......


你最想了解的ChatGPT

【01】ChatGPT + Word = 高效办公

【02】如何利用聊天机器人制作双语术语表

【03】 ChatGPT在译前准备中的应用——术语准备

【04】投喂语料,提升译文质量

【05】(一)结合ChatGPT的译前编辑初探

【06】ChatGPT最新接入word方法(完美debug)

【07】AI外语写作助手,助力高效写作

【08】探索ChatGPT在翻译过程中的应用

【09】中科院学术优化本地部署


点击更多......


听听专家们怎么说

【01】崔启亮:翻译技术重新定义翻译能力,人机协作是大势所趋

【02】陈毅强:融会贯通,口译技能持续升级

【03】丁丽:译后编辑人员与译者身份是否对等?

【04】《翻译技术研究》作者王华树教授

【05】黄书剑:如何评价机器翻译质量的好坏?

【06】李长栓教授:ChatGPT在翻译中的崭新角色 

【07】李梅:机器翻译对未来翻译教育有何影响?

【08】李莹:教学、研究和实践三视角中的翻译技术

【09】骆玮:新时代译者的“适应与选择”

【10】刘开军:影视翻译的就业前景如何?

【11】刘海明:本地化行业需要什么样的人才?

【12】苏秋军:AIGC背景下的MTI学科建设 

【13】韩林涛:文科生如何学习机器翻译?

【14】王树槐:GPT与诗歌翻译批评:GPT与文学翻译之一

【15】张成智:搜索是一种态度【16】周兴华:机器翻译译后编辑会让译者越来越懒惰吗?
点击更多......
大家都在研究什么

【01】ChatGPT时代翻译技术发展及其启示

【02】ChatGPT时代人工翻译的价值空间与翻译教育转型

【03】从人际伦理到人机伦理——ChatGPT时代翻译伦理研究

【04】“生成式人工智能”(AIGC)及其哲学意蕴

【05】大语言模型技术驱动下翻译教育实践模式创新研究

【06】ChatGPT 人工智能翻译的隐忧与纾解

【07】涉海翻译中的机器翻译应用效能:基于BLEU、chrF++和BERTScore指标的综合评估【08】基于生成式人工智能的涉海翻译:优势、挑战与前景【09】用者为本,技之大道——评《以口译员为中心的技术可用性研究:以SmarTerp为例》

【10】数字人文视域下翻译研究:现状、问题与前景

【11】翻译技术的理论研究:问题与路径

【12】借他山之石, 助教研之力—— 《翻译项目管理》 评介


点击更多......





继续滑动看下一个
翻译技术教育与研究
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存