辅助编程工具 Codeium
文档用途
介绍 AI 辅助编程工具 Codeium, 以及在 VSCode 中如何顺畅地使用它.
写在前面
已经存在了不少 AI 辅助编程工具, 例如最知名的 GitHub Copilot.
经过笔者的粗略调研, 目前 (2024年初) 此类工具中 Codeium 是个不错的选择.
Codeium 能与 GitHub Copilot 的体验不相上下, 且对于个人开发者 免费.
安全性注意事项
如果对于代码安全性有极高要求 (避免泄露), 应该选择私有部署的方案, 例如 Codeium 企业版.
理论上所有非私有部署的 AI 辅助编程工具都可能导致代码泄露 (无论是故意的还是无意的).
这也是 Codeium 相比 GitHub Copilot 的优势, 因为后者不支持私有部署, 只支持 SaaS.
准备工作
Codeium 支持 多个 IDE 和代码编辑器, 这里以 VSCode 为例.
先安装 Codeium 官方 VSCode 插件, 然后通过插件登录或注册 Codeium 账户.

在 VSCode 登录后, 应该就能看到上图中的页面, 并能在其中与 Codeium 对话.
这说明已经完成了准备工作, 我们接下来将会讨论它的: 优势, 使用场景, 最佳实践.
核心优势
可以 理解上下文 (也就是 "context awareness").
这些上下文可以帮助 AI "理解" 代码, 因此可以降低开发者的使用成本.
例如 ChatGPT 虽然也可以辅助写代码, 但是上下文信息需要开发者手动输入.
而 Codeium 可以自动获取上下文, 它们可以来自于很多方面:
正在编辑的文件, 光标所处的位置, 选中的代码块, 当前所处的代码仓库等等.
例如在下图中, 我们看看到被自动识别的上下文, 同时可以选择手动添加.
就实际使用体验而言, 自动识别的上下文已经能提供足够优秀的开发体验.

使用场景
生成代码
在光标所在处, 使用快捷键 Ctrl+I 打开下图中的窗口, 并输入文字使 Codeium 生成代码.
另外也可以在选中任意代码块后, 使用 Ctrl+Shift+I 打开此窗口, 并告诉 Codeium 做点什么.

TIP
尤其是 Ctrl+Shift+I 非常实用, 它甚至可以替代下文所述的大部分功能.
例如: 生成文档, 生成单元测试用例, 将 todo 变成真正的代码等等.
自动补全
默认情况下, 我们在编写代码时, Codeium 会在我们短暂停顿时对代码自动补全.
Codeium 官网中的宣传视频就把这个功能介绍地很清楚:
TIP
虽然 Codeium 会自动尝试补全, 但我们也可以按需手动触发, 通过快捷键 Alt+\.
帮助理解
我们可以让 Codeium 用自然语言描述一段代码的含义.
首先选中一段代码, 然后 Ctrl+Shift+P 并输入命令:Codeium: Explain Selected Code Block

就可以在 Codeium 的对话页面看到结果了:

也可以考虑进一步要求 Codeium 用说中文来复述:

生成注释
Codeium 总是会按照 编程语言的规范格式 来生成注释.
这类注释也被称之为 docstrings, 因为它们通常用于智能提示和文档生成.
C# 的注释

Python 的注释

Rust 的注释

甚至连 mod 开头的注释都能使用正确的格式 (即 //!):

操作如下:
选中代码块后, 使用快捷键 Ctrl+Shift+P 开始输入 VSCode 命令.
命令名为 Codeium: Refactor Selected Code Block (输入关键词就能找到, 不用完整输入).

可以看到多条重构选项, 它们大部分都很有用.
这里我们需要生成注释, 因此应该选择 Add comments and docstrings to the code.

可以看到新生成了注释, 并且非常像 VSCode 内 git diff 的效果.
此时我们可以使用快捷键 Alt+A 来应用, 若不想应用则可以按 Alt+R 来拒绝.

单元测试
例如我们正在开发某个库, 此时希望为某个公共方法生成单元测试用例.
手动编写测试用例可能会在开发过程中带来不小的工作量, 现在 Codeium 可以显著缓解这个问题.
让我们能做到: 相同的测试覆盖率, 使用更少的开发时间; 相同的开发时间, 达成更高的测试覆盖率.
类似于 生成注释, 我同样需要借助 Codeium: Refactor Selected Code Block 命令.
区别在于, 应该在紧接着的步骤中使用 Generate unit tests 子命令.

日志与调试
为了更好地调试, 我们可能希望在代码中打印日志.
类似于 生成注释, 我同样需要借助 Codeium: Refactor Selected Code Block 命令.
区别在于, 应该在紧接着的步骤中使用 Add logging statements so that it can be easily debugged 子命令.

当完成调试后, 可能会希望清理那些用于打印日志的调试代码.
此时可以使用 Clean up this code 子命令.
使用技巧
重构的快捷键
为了更便捷地使用 Codeium: Refactor Selected Code Block, 建议为其绑定快捷键.
笔者将默认的的 Ctrl+Shift+R 禁用, 并为其重新绑定了 Codeium 的重构命令:

接受部分改动
我们可以用名为 Git: Revert Selected Ranges 的 VSCode 命令来实现:
将光标所在的行恢复成改动前的样子 (相当于对光标附近的区域执行 git restore 命令).
这个命令在配合 Codeium 时非常有用, 因为我们可能只希望接受 Codeium 的部分改动,
此时就可以在 Alt+A 前后对 "希望保持原样的行" 执行 Git: Revert Selected Ranges.
然而, 默认的快捷键 Ctrl+K Ctrl+R 不会在 DiffEditor 以外的地方起效.
因此笔者建议修改这个快捷键的起效范围, 也就是下图中 When, 使其起效范围更广.

多次改进
如果单次生成的代码或注释不够满意, 我们也可以进一步要求 Codeium 做修改.
例如笔者做的一个实验:
- 先让 Codeium 编写一个 python 脚本, 将 csv 文件中的数据转换为 markdown table 格式.
- 代码顺利的生成了, 并且可以使用, 但遇到了一个 bug: 处理中文文本时会报错.
- 于是笔者要求 Codeium 修复这个 bug. 令人惊喜的是, bug 真的被修复了.
- 至此功能已经实现, 最后笔者要求 Codeium 为其添加注释, 得到了最终结果:
纯 AI 编写的代码, 用于将 csv 转为 markdown table
"""
Convert a CSV file to a markdown table.
This script takes a CSV file as input and converts it into a markdown table.
The markdown table is written to a new file with the same name as the input file,
but with a `.md` extension instead of `.csv`.
Usage:
python convert.py <csv_file>
"""
import csv
import sys
import codecs
import os
def convert_csv_to_markdown_table(csv_file):
"""
Convert a CSV file to a markdown table.
Parameters:
csv_file (str): The path to the CSV file to be converted.
Returns:
str: The markdown table as a string.
"""
with codecs.open(csv_file, "r", encoding="utf-8") as file:
reader = csv.reader(file)
table = []
for row in reader:
table.append("| " + " | ".join(row) + " |")
return "\n".join(table)
if __name__ == "__main__":
if len(sys.argv) != 2:
print(__doc__)
sys.exit(1)
csv_file = sys.argv[1]
markdown_file = os.path.splitext(csv_file)[0] + ".md"
with codecs.open(markdown_file, "w", encoding="utf-8") as f:
f.write(convert_csv_to_markdown_table(csv_file))开源方案
continue
continue 也许是个不错的替代选项, 因为它开源且可以自由选择大语言模型 (LLM).
也就是说 continue 只实现了前端, 而作为后端的大语言模型可自由选择 (通过 API Key).
甚至还可以支持通过 ollama 部署在本地的大语言模型, 充分保障数据安全.
pr-agent
pr-agent 可以自动为 GitHub PR (或 GitLab MR) 做分析, 写总结, 提建议等.
目前来看主要缺陷在于其仅支持 openai api, 因此在国内不方便使用.