在软件开发领域,AI 编码助手正在迅速普及,它们能够显著提升开发效率。然而,许多商业化的 AI 编码工具会将你的代码发送到外部服务器,这对于注重代码安全和知识产权保护的企业来说,存在潜在的风险。本文将介绍如何使用 OpenHands 结合 Devstral 和 vLLM,搭建一个私有的、异步的 AI 编码助手,既能提升生产力,又能保证代码安全。
异步编码代理:超越 IDE 辅助工具
传统的 IDE 辅助工具,例如 Copilot 或 ChatGPT 插件,主要提供代码自动补全和代码片段生成等功能。而异步编码代理则更进一步,它们可以承担完整的编码任务,例如根据需求编写整个函数、类或模块。开发人员只需提交任务描述,AI 编码代理即可在后台独立完成编码,生成代码后提交 Pull Request (PR),开发人员审核并合并即可。这种模式极大地释放了开发人员的时间,使其能够专注于更具挑战性和创新性的工作。相当于团队中增加了一名按需使用的开发人员。
案例: 假设你需要在你的 Python 项目中添加一个数据清洗模块。你可以使用 OpenHands 向 Devstral 提交任务:“编写一个 Python 模块,用于清洗 CSV 数据,包括处理缺失值、异常值和重复值,并提供详细的文档说明。” Devstral 将自动完成代码编写、测试和文档生成,并将结果以 PR 的形式提交给你审核。
保持代码私有的重要性
大多数商业 AI 编码平台(例如 Copilot、Claude Code、Cursor 等)会将用户的代码发送到外部服务器进行处理。虽然这在一定程度上提高了编码效率,但也带来了潜在的代码安全风险。
- 保护专有逻辑和商业机密: 你的代码中可能包含独特的算法、业务规则和商业机密。将代码发送到外部服务器,可能会导致这些敏感信息泄露,给竞争对手带来可乘之机。
- 防止代码被用于训练闭源模型: 一些 AI 编码平台可能会使用用户的代码来训练其模型。这可能意味着你的代码将被用于改进竞争对手的产品,或者被用于未经授权的商业用途。
- 保持对代码的完全控制: 使用私有 AI 编码助手,你可以完全掌控你的代码,避免受到第三方服务提供商的限制。即使第三方服务出现故障或 API 访问限制,你的 AI 编码助手仍然可以正常工作。
私有技术栈:OpenHands + Devstral + vLLM
为了构建一个私有的 AI 编码助手,我们需要选择合适的技术栈。本文推荐使用 OpenHands、Devstral 和 vLLM 的组合。
- OpenHands: 一个开源的异步编码代理平台,它基于 Git 的 PR 工作流,可以与私有的 GitLab 和 Bitbucket 代码仓库无缝集成。OpenHands 在 SWE-bench 基准测试中表现出色,是目前领先的开源编码代理平台之一。
- Devstral: 截至 2025 年 6 月,Devstral 是性能最强大的开源代码大语言模型。它可以在本地部署,降低了 API 调用成本,特别是在大规模使用的情况下。Devstral 在私有云部署中,用户可以完全控制自己的代码。Devstral 在 SWE-Bench 上面性能经过验证。
- vLLM: 一个高性能的 LLM (Large Language Model) 服务解决方案,它具有快速推理引擎和 OpenAI 兼容的 API。vLLM 可以方便地部署在私有服务器上,并与 OpenHands 集成。
搭建 OpenHands + Devstral + vLLM 环境
以下是在 Linux 或云虚拟机(VM)上搭建 OpenHands + Devstral + vLLM 环境的步骤。
1. 获取 Hugging Face Token
从 Hugging Face Hub 下载 Devstral 模型需要用到 Token。如果没有 Hugging Face 账号,需要先注册一个。然后,在 Hugging Face 网站上创建一个具有 Read 权限的 Token,并将其保存为环境变量 HF_TOKEN
。
2. 设置 GPU 云虚拟机
除非你的计算机配备了 NVIDIA GeForce RTX 4090 或更高性能的 GPU,否则建议使用云虚拟机来运行 Devstral 模型。
GPU 需求:
- 对于 8-bit 量化模型和 128K 上下文长度,需要约 67GB 的 VRAM。
- 推荐使用 NVIDIA H100 (80GB) GPU。
可以选择 Hyperstack 等云服务提供商,它们提供按小时计费的 H100 GPU。
创建云虚拟机:
- 注册 Hyperstack 账号并购买 Credits。
- 在 Hyperstack 控制台中,选择 “Cloud” -> “Virtual Machines”,然后点击 “Deploy new virtual machine”。
- 选择 1x H100 GPU。
- 选择带有最新 CUDA 版本和 Docker 的操作系统镜像。
- 导入你的 SSH 密钥,并启用 SSH 访问。
- 启用公共 IP 地址。
- 设置虚拟机名称为 “vllm-devstral”。
- 点击 “Deploy” 并等待虚拟机激活。
连接到虚拟机:
# 替换为你的虚拟机公共 IP 地址
export VLLM_PUBLIC_IP=1.2.3.4
ssh ubuntu@$VLLM_PUBLIC_IP
重要提示: 在不再需要虚拟机时,请务必停止它,以节省成本。
3. 安装 vLLM 和 Devstral
在虚拟机上安装 vLLM,并使用 vLLM 的官方 Docker 镜像启动一个 OpenAI 兼容的服务器,以服务量化的 nm-testing/Devstral-Small-2505-FP8-dynamic
模型。
# 在临时磁盘空间上创建缓存目录
sudo mkdir -p /ephemeral/cache
export MODEL=nm-testing/Devstral-Small-2505-FP8-dynamic
export HF_TOKEN=你的 Hugging Face Token
docker pull vllm/vllm-openai:latest
docker run --runtime nvidia --gpus all \
-v /ephemeral/cache:/root/.cache \
--env "HUGGING_FACE_HUB_TOKEN=$HF_TOKEN" \
-p 127.0.0.1:8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model $MODEL \
--served-model-name devstral \
--tokenizer-mode mistral \
--tool-call-parser mistral \
--enable-auto-tool-choice \
--tensor-parallel-size 1 \
--enable-prefix-caching
成功启动后,你将看到类似以下的 vLLM 启动日志:
INFO 06-25 02:50:15 [__init__.py:244] Automatically detected platform cuda. …
INFO 06-25 02:50:17 [api_server.py:1287] vLLM API server version 0.9.1 …
INFO 06-25 02:50:56 [gpu_worker.py:227] Available KV cache memory: 45.71 GiB
INFO 06-25 02:50:56 [kv_cache_utils.py:715] GPU KV cache size: 299,552 tokens
INFO 06-25 02:50:56 [kv_cache_utils.py:719] Maximum concurrency for 131,072 tokens per request: 2.29x …
INFO: Application startup complete.
检查 vLLM 是否正在运行并提供 Devstral 模型:
curl http://localhost:8000/v1/models && echo
4. 通过 SSH 隧道连接到 vLLM
设置 SSH 隧道以从你的计算机访问 vLLM。
# 获取 Docker 主机 IP 地址
DOCKER_HOST_IP=$(docker network inspect bridge --format '{{(index .IPAM.Config 0).Gateway}}')
# 监听本地 Docker 主机地址 - 不要暴露给外部
ssh ubuntu@$VLLM_PUBLIC_IP -L $DOCKER_HOST_IP:8000:127.0.0.1:8000 -N
5. 配置 OpenHands
创建 OpenHands 配置文件,指向 vLLM OpenAI 兼容服务器和 Devstral 模型。
export VLLM_MODEL=devstral
# 使用 host.docker.internal 指向你的计算机,而不是容器的 "localhost"
export VLLM_URL=http://host.docker.internal:8000/v1
mkdir ~/.openhands
cat << EOF > ~/.openhands/settings.json
{
"language": "en",
"agent": "CodeActAgent",
"max_iterations": null,
"security_analyzer": null,
"confirmation_mode": false,
"llm_model": "openai/$VLLM_MODEL",
"llm_api_key": "unused",
"llm_base_url": "$VLLM_URL",
"remote_runtime_resource_factor": 1,
"enable_default_condenser": true,
"enable_sound_notifications": false,
"enable_proactive_conversation_starters": false,
"user_consents_to_analytics": false
}
EOF
6. 运行 OpenHands
启动 OpenHands UI。
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.45-nikolaik
docker pull docker.all-hands.dev/all-hands-ai/openhands:0.45
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.45-nikolaik \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/.openhands \
-p 127.0.0.1:3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.45
在你的浏览器中打开 http://localhost:3000
。
体验 OpenHands
现在你可以访问 OpenHands,创建任务并让它编写代码。例如,你可以尝试以下提示:
编写 Python 代码,从 URL 下载 CSV 文件,并将其写入 SQLite 数据库中的新表,创建表。
数据分析案例: 某数据分析团队需要定期从第三方网站下载 CSV 格式的销售数据,并将其导入到本地 SQLite 数据库中进行分析。使用 OpenHands 和 Devstral,他们可以自动完成数据下载和导入过程,无需手动编写代码,大大提高了数据分析的效率。
代码重构案例: 某软件开发团队需要对一个大型的遗留系统进行重构。使用 OpenHands 和 Devstral,他们可以将复杂的代码模块分解成更小的、更易于理解的函数,并自动生成单元测试代码,从而降低了重构的风险。
结论
通过本文的介绍,你已经了解了如何使用 OpenHands 结合 Devstral 和 vLLM 构建一个私有的 AI 编码助手。这种方案既能提升开发效率,又能保证代码安全,是注重知识产权保护的企业的理想选择。随着开源模型的不断发展,私有 AI 编码助手将在未来的软件开发中扮演越来越重要的角色。拥抱这项技术,你将能够在激烈的市场竞争中保持领先地位,并为你的企业创造更大的价值。
温馨提示:
- 密切关注云服务器的 GPU 成本,并根据实际需求进行调整。
- 使用清晰明确的提示,以获得更好的编码结果。
- 及时更新你的开源模型,以获得最佳性能。