Skip to main content

AI编程:配置先行

· 5 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

代码和配置分离,这是软件开发的一个重要原则,如果你还不早知道道这个原则,那么请移步到12 Factor - Config。 配置文件通常包含应用程序的各种参数和设置,如数据库连接信息、API密钥、Base URL等。

在AI编程时代,我们的一些开发习惯可能要改变,典型的就是文档现行。我看过不少团队的项目,产品都上线有一年多,但是项目的README.md文件还是空的。 也不能说完全没有文档,如架构设计等,这些文档都保存在外部系统中,如语雀等,可以说很好地"实践"了代码和文档的隔离。

但是在AI的场景下,这种Demo先行、文档和代码分离的做法,可能就不太适用啦。 大家在项目创建完毕后,或者直接让AI帮助你创建项目框架。 项目创建后,你马上要做的事情就是编辑CLAUDE.md, AGENTS.md.cursor/rules/xxx.md等文件,当然也可以是README.md文件。 这些文件的内容主要是告诉AI你项目的全部上下文,包括项目的目标、功能、技术栈、依赖、数据库结构、配置等等,这样AI才能更好地帮助你完成代码的编写工作。

对的,我们在项目的上下文中明确了配置,对比项目的目标、功能、技术栈等,配置的重要性也非常重要,因为这些配置直接影响到代码的生成。

假设你想要AI帮你写一个连接数据库,执行SQL查询的代码片段,如果你没有提供相关的数据库连接信息,那么生成的代码中会包含很多的字符串变量, 这会让代码变得非常啰嗦,而且也不容易维护。 如果你告知AI,配置都保存在.env文件中,那么AI Agent就会读取.env文件中的配置, 然后会调用相关的dotenv开发包来加载配置,这样生成的代码就会非常简洁,而且也容易修改和维护,也很好地让AI践行代码和配置分离的原则。 如果你的配置项命名比较规范的话,AI生成的代码就会非常贴合你的需求,如你设置了JDBC URL,你都不需要再告诉AI你使用的是哪种数据库, AI就根据JDBC URL自动识别对应的数据库类型,然后生成对应的代码。

https://agents.md/ 我们可以看到AGENTS.md文件通常包含以下内容,主要用于指导AI Agent生成代码,如下:

- Project overview
- Build and test commands
- Code style guidelines
- Testing instructions
- Security considerations

当然你还可以添加其他内容,这里我们就在AGENTS.md文件中添加配置,该项也是用于指导代码的生成,毕竟代码还是要引用配置的。 样例内容如下:

## Project's config

The project uses `.env` and `org.mvnsearch:dotenvx-java` for config.
An example of Dotenvx to load `.env`.

---
import io.github.cdimascio.dotenv.Dotenv;
import io.github.cdimascio.dotenv.Dotenvx;


Dotenv dotenv = Dotenvx.configure().load();
---

一些火眼金睛的同学可能要问啦,我的.env文件中可是有有敏感信息啊,数据库密码、API Key等。如果直接告诉AI Agent,这些敏感信息,岂不是都泄露啦。 正如你担心的那样,即便你不告诉AI Agent你使用.env文件保存配置,AI Agent也很会自动扫描项目目录下的所有文件,一些Agent还会读取环境变量, 然后再进行代码生成,这样做的好处是可以更高效地生成代码。

我希望AI Agent读取这些配置,这样可以帮助我更好地生成代码,但是我又不希望AI Agent读取敏感信息,这该怎么办呢? 这个就是Dotenvx的出发点之一,就是加密配置项,同时也能方便地让AI Agent读取这些配置,更好地生成代码。

下面是一个示例的.env文件,包含了加密的配置项:

# ---
# uuid: 0198d1ea-7c14-7c29-abed-80c728df8409
# name: app_name
# group: group_name
# ---
DOTENV_PUBLIC_KEY=02e4ced9fa5c46fa6b24742eed6833a58983d10311507d662cf36af49dd8b758ba

# Environment variables. MAKE SURE to ENCRYPT them before committing to source control
# SQLite JDBC URL, such as jdbc:sqlite:sample.db
JDBC_URL=encrypted:BMAyk58zKDdT9bVUcwZJB1oeCXEa+4A6jPQufhk/rON1C8wZhoG0bpm4FeZnDaLhf0qswdNXy19G4FAKWyyCTJ4qVRGhnGq73JywK4VC7CJi43xTN7jtpSl+E87iDbquowzCP5NXMpYv33FCjXGwcpxRHpwCN7yUQw==
REDIS_URL=encrypted:BHUljwFtkPudwBg6Q7TAvzlWR5K13udrrJgSt5fgzFIAeIXJDYsBmNKM6Zy1MeziUOLToS8s5xHGZ+IlRlu/KUA+vp/6o51M7VNRat4nwjhOxzruC7QEEfsC6xRGppTcQWhQ0Ptz3IZtx8Xaf7YmWO/X+EKRNIY=

借助新的.env文件格式,AI Agent可以轻松地读取这些配置项,变量名和注释可以很好地帮助AI Agent理解这些配置项的含义,同时也不会泄露敏感信息。

在AI编程时代,配置先行是一个非常重要的原则,合理地管理和使用配置文件,可以大大提高AI Agent生成代码的效率和质量。 在你声明技术栈后,马上要进行的就是这些技术栈的配置文件,如数据连接配置,S3配置等,这些配置文件的内容会直接影响到AI Agent生成代码的质量。