- 该项目实现了一个兼容 ReAct 思考-行动-反馈循环的命令行 Agent,围绕
agent.go中的入口函数启动,与react_agent.go内部逻辑协同,利用github.com/openai/openai-go客户端访问阿里云 DashScope 的 Qwen 模型(默认qwen3-max)。 - Agent 在运行时会渲染
prompt_template.go中的系统提示词,公开tools.go定义的多种工具(读写文件、终端命令、达梦数据库查询等),并将每轮对话及工具调用通过logger.go写入控制台与agent_run_时间戳.log。 - 文章链接:https://mp.weixin.qq.com/s/B7Z_phcccBRvzr9Nb1EajQ
agent.go:命令行入口,负责解析参数、加载.env、初始化模型客户端、拼装工具并触发 Agent 流程。react_agent.go:封装 ReAct 流程(提示词渲染、消息循环、工具调度、日志记录与用户确认)。tools.go:实现read_file、write_to_file、run_terminal_command、query_database等工具,数据库部分依赖github.com/gaoyuan98/dm驱动。prompt_template.go:系统提示词模板,包含工具列表与注意事项。logger.go:统一格式化日志,并将消息同步输出到终端与文件。
- Go:建议 Go 1.23.7 及以上(参见
go.mod)。 - 网络:能够访问 https://dashscope.aliyuncs.com/compatible-mode/v1。
- 达梦数据库驱动:
github.com/gaoyuan98/dm会在go run时自动拉取,无需单独安装;若需要访问数据库,请确保可通过dm://DSN 访问。 - 可选
.env文件:agent.go会尝试加载项目根目录及当前工作目录的.env,用于统一管理密钥等敏感变量。
- 登录 DashScope 控制台、打开 API-Keys 页面,点击「创建 API Key」,为 Key 取一个方便辨识的名称。
- 复制新生成的 Key,仅在安全环境下保存;DashScope 只在首次展示明文。
- 在项目根目录创建
.env(若不存在),写入:DASHSCOPE_API_KEY=sk-xxxxxxxxxxxxxxxx DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 - 打开
agent.go中初始化 OpenAI 客户端的位置(约 55 行),将占位字符串option.WithAPIKey("填写成自己的密钥")替换为从环境变量读取,例如:然后重新client := openai.NewClient( option.WithAPIKey(os.Getenv("DASHSCOPE_API_KEY")), option.WithBaseURL(os.Getenv("DASHSCOPE_BASE_URL")), )
go run。若暂不修改代码,则需直接把密钥写入该位置,但不建议将明文 Key 提交到版本库。
- 安装依赖(首次)
go mod tidy
- 启动 Agent
- 交互式输入问题(默认):
程序将提示“请输入任务”,输入问题后回车即可。
go run . -project . -model qwen3-max
- 通过参数直接传入问题并指定日志文件:
go run . -project E:/path/to/project -model qwen3-max ^ -question "检查 README 是否完整" ^ -log-file logs/session.log
- 交互式输入问题(默认):
- 关键参数
-project:项目根目录,Agent 会枚举该目录文件供模型参考,默认.。-model:DashScope 兼容模型名,可替换为qwen2.5-coder-32k等。-question:直接指定任务;缺省则进入交互式模式。-log-file:自定义日志路径。未指定时将在-project目录生成agent_run_YYYYMMDD_HHMMSS.log。
以下示例来自 agent_run_20251219_210442.log,演示如何让 Agent 完成“达梦数据库巡检 + HTML 报告”任务。
- 任务输入
- 启动命令:
go run . -project . -model qwen3-max - 在提示后输入问题:“对达梦数据库进行巡检,并生成 html 报告,美观一点。”
- 启动命令:
- 关键交互
- Round 1:Agent 通过
request_user_input索取 DSN,用户提供SYSDBA:Dameng123@192.168.112.174:5245。 - Round 2~6:Agent 自动整理 DSN(转为
dm://),依次调用query_database执行:SELECT * FROM v$version;- 表空间使用率 SQL(
dba_data_files/dba_free_space聚合) SELECT COUNT(*) AS current_sessions FROM v$sessions;SELECT * FROM v$lock;SELECT * FROM v$system_long_exec_sqls WHERE exec_time > 1000;
- Round 7:将查询结果组装为带样式的 HTML,通过
write_to_file写入dm_inspection_report.html。
- Round 1:Agent 通过
- 最终输出
- Round 8 返回总结:“巡检完成,报告位于
E:\go_code\ai_agent\go_agent_study\dm_inspection_report.html。” - 生成的报告包含版本信息、表空间(提示 MAIN 使用率 98.81%)、会话数、锁明细和慢 SQL(无数据)。
- Round 8 返回总结:“巡检完成,报告位于
read_file(path):读取绝对路径文件内容。write_to_file(path, content):写入/覆盖文件内容,支持\n表示换行。run_terminal_command(command):执行系统命令,Windows 下调用 PowerShell,执行前需用户确认。query_database(dsn, sql):连接指定达梦数据库并返回 tab 分隔结果;需提供真实dm://用户名:密码@主机:端口/数据库与 SQL,缺少参数时 Agent 会使用request_user_input向终端索取。request_user_input(prompt):在信息不足时向人工提问,防止模型猜测。
- 每轮交互都会在日志中输出
<thought>、<action>、<observation>,可通过agent_run_*.log回放。 - 若终端命令或数据库连接失败,日志会包含详细报错信息,可据此重试。
- 当模型响应缺少
<action>或参数校验未通过时,Agent 会立即在控制台提示;通常是因为提示词或 Key/DSN 未正确配置。
微信公众号:达梦课代表
分享DM数据库一线遇到的各类问题和解决方案
