一文带你了解AI程序员DEVIKA

1. 引言

随着人工智能技术的飞速发展,其能力正逐渐比肩人类。在软件工程领域,AI程序员如 Devin 和 AutoDev 已经成为热门话题。这些人工智能工具不仅极大提升了软件开发的效率和自动化程度,而且预示着程序员工作方式可能会发生重大变革。

以 Cognition Labs 推出的历史上第一位 AI 程序员 Devin 为例,其可以从头到尾独立规划和完成软件工程任务,无需人工协助即可完成复杂的编码任务。在 SWE-Bench 基准测试中,Devin 在没有任何帮助的情况下 (目前有爆出 Devin 造假)解决了 13.86% 的问题,显著超过了之前表现最好的模型,这表明 Devin 已经超越了其他人工智能工具,可以作为一名自主程序开发工程师。(首个AI程序员造假被抓,Devin再次"震撼"硅谷

遗憾的是,Cognition Labs 未披露支持 Devin AI 的人工智能模型的技术细节,现在也未对外开放使用,无法及时体验到。幸运的是,由印度 Stition AI 模仿 Cognition Labs 开发的 Devin AI的替代品 Devika AI 已开源,Devika AI 的目标是达到 Devin 在sw基准测试中相同的分数,并最终战胜它。

接下来,本文将为大家介绍 Devika AI 的实际能力、架构以及实际使用体验。

2. DEVIKA AI 介绍

Devika AI,由印度团队 Stition AI 精心打造的一位人工智能软件工程师。它具备理解复杂人类指令的能力,并能将其拆解为一系列可执行的步骤。通过深入研究和信息搜集,Devika 能够编写出实现人类目标指令的代码。Devika AI 的主要目标是通过提供能够在最少的人工指导下处理复杂编码任务的 AI 结对程序员来彻底改变软件开发过程。

首先,介绍一下 Devika 处理人类指令的基本流程:Devika 通过大模型实现自动拆解任务、自动下发任务或交付任务、以及自动将用户最近的询问转为行动指令等流程,直到完成用户的指令。

目前, Devika 支持的行动指令有6 种,我们与 Devika 对话时应贴近这些指令,效果会更好。

markdown 复制代码
- `answer` - Answer a question about the project.
- `run` - Run the project.
- `deploy` - Deploy the project.
- `feature` - Add a new feature to the project.
- `bug` - Fix a bug in the project.
- `report` - Generate a report on the project.

Devika 的基本流程如下图所示:

Devika 的系统架构由以下关键组件组成:

  1. 用户界面:基于网络的聊天界面,用于与 Devika 交互、查看项目文件以及监控代理的状态。
  2. Agent Core:编排AI规划、推理和执行过程的核心组件。它与各种子代理和模块通信以完成任务。
  3. 大型语言模型:Devika 利用Claude、GPT3.5/4和Ollama 的本地 LLM等最先进的语言模型进行自然语言理解、生成和推理。
  4. 规划和推理引擎:负责将高层目标分解为可操作的步骤,并根据当前环境做出决策。
  5. 研究模块:利用关键字提取和网页浏览功能来收集当前任务的相关信息。
  6. 代码编写模块:根据计划、研究结果和用户需求生成代码。支持多种编程语言。
  7. 浏览器交互模块:使 Devika 能够根据需要导航网站、提取信息并与 Web 元素交互。该模块使用 Playwright 实现:Playwright提供了跨浏览器、跨平台的支持,可以模拟用户在浏览器中的交互行为,如点击、填写表单、截图等
  8. 知识库:存储和检索项目特定信息、代码片段和学到的知识,以便高效访问。
  9. 数据库:保存项目数据、代理状态和配置设置。

Devika 整体架构如下图所示:

3. DEVIKA AI 安装配置

安装过程请参照官方文档:GitHub - stitionai/devika

安装及使用过程中可能需要注意以下三点:

  1. 环境要求
diff 复制代码
- Python >= 3.9 and < 3.12
- NodeJs >= 18 # UI运行要求
- bun
  1. 模型配置:可以在代码跑起来后,通过设置界面修改配置文件,也可直接修改config.toml配置文件。 推荐使用 Google Gemini 1.0 Pro,可以白嫖。 3. 科学上网:大模型 API 接口基本都有 IP 校验,需要科学上网。本文是在本地构建运行,需要配置VPN 和终端代理绕过 IP 检测。 例如,本文运行设置的终端代理如下:
shell 复制代码
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890

4. DEVIKA AI 使用体验

4.1. 完整视频 demo:创建一个简单的贪吃蛇游戏

这是一个要求 Devika 创建一个简单的贪吃蛇游戏的完整录屏 demo: 录屏

Devika 自动化的开始拆解并完成该任务流程,并通过导航网站、提取信息来提供更多有用的信息给大模型。

起初生成的代码不符合要求,经过人工介入提示可以慢慢修复代码,Gemini 对中文的支持不是很友好,修复 bug 的很多命令识别成了 run,更换 GPT 会更佳。生成的最终代码如下:

python 复制代码
import pygame
import random

pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()

snake = [(320, 240), (320, 240), (320, 240)]
food = (random.randint(0, 59) * 10, random.randint(0, 47) * 10)
direction = pygame.K_RIGHT

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and direction != pygame.K_DOWN:
                direction = pygame.K_UP
            elif event.key == pygame.K_DOWN and direction != pygame.K_UP:
                direction = pygame.K_DOWN
            elif event.key == pygame.K_LEFT and direction != pygame.K_RIGHT:
                direction = pygame.K_LEFT
            elif event.key == pygame.K_RIGHT and direction != pygame.K_LEFT:
                direction = pygame.K_RIGHT

    if snake[0] == food:
        food = (random.randint(0, 59) * 10, random.randint(0, 47) * 10)
        snake.append((0, 0))
    else:
        for i in range(len(snake) - 1, 0, -1):
            snake[i] = snake[i - 1]
    if direction == pygame.K_UP:
        snake[0] = (snake[0][0], snake[0][1] - 10)
    elif direction == pygame.K_DOWN:
        snake[0] = (snake[0][0], snake[0][1] + 10)
    elif direction == pygame.K_LEFT:
        snake[0] = (snake[0][0] - 10, snake[0][1])
    elif direction == pygame.K_RIGHT:
        snake[0] = (snake[0][0] + 10, snake[0][1])

    if snake[0][0] < 0 or snake[0][0] > 630 or snake[0][1] < 0 or snake[0][1] > 470:
        running = False
    for i in range(1, len(snake)):
        if snake[0] == snake[i]:
            running = False

    screen.fill((0, 0, 0))
    for part in snake:
        pygame.draw.rect(screen, (255, 255, 255), pygame.Rect(part[0], part[1], 10, 10))
    pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(food[0], food[1], 10, 10))

    pygame.display.update()
    clock.tick(10)

pygame.quit()

该代码的贪吃蛇游戏比较简单,更复杂的代码建议配合 GPT4 等更优秀的大模型使用。

4.2. 使用 Pygame 实现 Conway's Game of Life

康威生命游戏( Conway's game of Life)是官方演示的一个 demo,本文接下来对这个 demo 进行复现。

简要介绍一下康威生命游戏:该游戏在方格网上进行,有点像围棋。有填充的网格代表有生命,或理解成一个细胞,再或者按中国传统,把填充和无填充理解成"有"和"无"。游戏规则只有四条:

  1. 当周围仅有1个或没有存活细胞时, 原来的存活细胞进入死亡状态(模拟生命数量稀少)
  2. 当周围有2个或3个存活细胞时, 网格保持原样
  3. 当周围有4个及以上存活细胞时,原来的存活细胞亦进入死亡状态(模拟生命数量过多)
  4. 当周围有3个存活细胞时,空白网格变成存活细胞(模拟繁殖)

康威生命游戏的四条规则一目了然地对应着宇宙中的生命规律,它是一种元胞自动机(cellular automaton),体现了冯·诺依曼(Von Neumann)关于机器自我进化的思想。

下面,让我们深入了解实际的使用体验:

首先使用本地模型 Llama2 测试:

llama2 能正常分解并完成该任务流程,并通过导航网站、提取信息来提供更多有用的信息给大模型,但**最终生成的代码仅有print("Example") **。

经过排查源码,本质是因为 Devika 的prompt 包含这样的代码,以规定大模型返回代码的格式。

继续排查日志记录,发现在纠错过程中有返回任务代码相关的记录。然而,Llama2 模型没有以 Devika 预期的格式提供响应,在回复中包含了额外的解释、论证部分,导致 JSON 验证失败,Devika 继续向模型提示返回指定格式的修复代码,模型返回了预期格式的 JSON 但错误的代码,即上述提到的提示词。

本文根据 issue 修改 prompt 来显式通知模型遵循所请求的输出格式后,实际测试 llama 也没有改善这个问题。

接下来,实际体验一下 Google 大模型 Gemini 1.0 Pro:

Devika 按照既定流程拆分并推进完成指定的任务流程,并从网页提取浏览信息,最后返回了预期格式的代码,生成代码如下:

python 复制代码
import numpy as np
import pygame

# Initialize Pygame
pygame.init()

# Game settings
SCREEN_WIDTH = 500
SCREEN_HEIGHT = 500
CELL_SIZE = 10
FPS = 30

# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

# Create the game screen
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Conway's Game of Life")

# Create the game grid
grid = np.zeros((SCREEN_WIDTH // CELL_SIZE, SCREEN_HEIGHT // CELL_SIZE))

# Game loop
running = True
while running:
    # Handle events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Update the game grid
    for i in range(grid.shape[0]):
        for j in range(grid.shape[1]):
            # Count the number of alive neighbors
            neighbors = 0
            for x in range(-1, 2):
                for y in range(-1, 2):
                    if x == 0 and y == 0:
                        continue
                    if i + x >= 0 and i + x < grid.shape[0] and j + y >= 0 and j + y < grid.shape[1] and grid[i + x, j + y] == 1:
                        neighbors += 1

            # Apply the game rules
            if grid[i, j] == 1:
                if neighbors < 2 or neighbors > 3:
                    grid[i, j] = 0
            else:
                if neighbors == 3:
                    grid[i, j] = 1

    # Draw the game grid
    screen.fill(BLACK)
    for i in range(grid.shape[0]):
        for j in range(grid.shape[1]):
            if grid[i, j] == 1:
                pygame.draw.rect(screen, WHITE, (i * CELL_SIZE, j * CELL_SIZE, CELL_SIZE, CELL_SIZE))

    # Update the display
    pygame.display.update()

    # Clock tick
    pygame.time.Clock().tick(FPS)

# Quit the game
pygame.quit()

尝试在本地运行 Devika 生成的代码,能拉起终端,但是屏幕上看不到白色活细胞的演化进程。提示 Devika 自行修复未能成功。

继续让 Devika 使用正确代码(John Conways Game of Life in Python)替换掉他生成的代码并运行,经过一次人工提醒后Devika 完成了这个任务。

让他再次运行替换的代码,他会在当前项目重复创建文件,且再次使用的data/projects/当前项目名称的路径。即使后续我给出本地路径,也不会按照我的要求去完成,看了下项目代码,路径是可配置的,根据配置的路径写死的,有灵活性但不多。

从以上体验可以看出模型的优劣对 AI 程序员体验是至关重要的,本文后续均使用 Gemini 1.0 Pro 模型进行测试。

4.3. 克隆项目并编写 vue3 虚拟滚动列表组件

bash 复制代码
克隆***项目并安装依赖,克隆地址(https://github.com/***),完成后编写一个虚拟滚动列表的 vue3 组件,放在指定目录 packages/***/components/gemini/下

任务拆分毫无问题,但实际表现是并未按照步骤克隆项目。只增加了编写组件,但未放至指定文件路径下。

按照进一步提示,Devika 能完成克隆项目。Devika 完成稍微复杂指令任务的能力较弱。

4.4. 提供本地项目代码写单元测试

vbnet 复制代码
请为本地路径/Users/xxx/xxx/game-private/packages/shared/utils/format.ts的所有函数编写单元测试,要求语言使用jest

除了图中 format 文件,本文还让 Devika 为一个 Vue 组件编写单元测试, 实际体验下来证明, Devika 不会读取本地文件内容把它当作大模型的提示,总结就是不够智能。

人工提示他读取本地文件内容,日志报错提示文件不存在(Devika 只会读取默认配置路径下的文件),他并不能准确获取到本地文件路径。

4.5. 验证 Devika 知识库

新建项目,让 Devika 完成之前做过的任务(prompt 完全一致)。Devika 不会再通过 web 提取信息,也不会再通过模型生成代码,而是直接返回知识库的答案。

查看知识库相关的源码,发现只是简单的查询相等判断,可用性不大。

4.6. 使用体验小结

  1. Devika 提供了规划和推理引擎,能够将高级目标拆分为可操作的步骤,将用户后续提问或者指示统一转化为规定的行动指令
  2. 浏览器交互模块使 Devika 能够导航网站、提取信息以及与 Web 元素交互。此功能增强了 Devika 收集数据和提供准确代码生成的能力,收集的 web 信息通过截图展示给用户
  3. Devika 的代码生成质量严格依赖于大模型的代码生成质量
  4. Devika 遇到错误能自我纠正,但不稳定,执行一些指令遇到错误后再次发起指令Devika 无任何响应,基本上重启服务才得以解决
  5. Devika 生成的代码集中放在 data/projects/当前项目名称目录下,可通过配置文件更改路径
  6. Devika 不会主动读取本地文件内容,经提示也不能获取到文件内容,目前实际可落地性较差,如有需要可以自己根据需要完善工具代码(猜测这也是该开源工具后续的一个改进点)
  7. Devika 集成了一个知识库和数据库来存储和检索特定于项目的信息、代码片段和学到的知识。但目前只是任务标签的简单相等匹配,可用性较低
  8. Devika 提供了 UI 和服务的日志,能完成部分问题的定位,但与大模型的交互仅打印了错误日志,人工很难根据模型响应及时提醒优化代码质量
  9. Devika 生成代码后不会主动运行来完成自我纠错,只有人工让他运行遇到错误才会自我纠正

5. 总结

尽管 Stition AI 的 Devika 仍处于初期发展阶段,但它已经初步展示了作为软件工程领域中有一定能力的人工智能程序员的潜力。通过不断的改进,它可以自动执行重复性任务并提高生产力。凭借其强大的功能以及开源社区持续不断迭代,Devika AI 有望成为 Devin AI 具有竞争力的开源替代品。

此外,随着 AI 程序员不断发展,通过利用其强大功能,开发人员可以提高工作效率、简化工作流程并轻松处理复杂的编码任务。总体而言,像 Devika 和 Devin 这样的工具标志着人类与人工智能的合作编码时代的到来。

参考文献:

GitHub - stitionai/devika

AutoDev: Automated AI-Driven Development

最后,如果客官觉得文章还不错,👏👏👏欢迎点赞、转发、收藏、关注,这是对小编的最大支持和鼓励,鼓励我们持续产出优质内容。

6. 关于我们

MoonWebTeam目前成员均来自于腾讯,我们致力于分享有深度的前端技术,有价值的人生思考。

7. 往期推荐

前端依赖注入的探索和实践

MoonWebTeam前端技术月刊第1期

2024年前端技术演进&优秀实践技术扫描

E2E测试用例生成方案探索

穿越时空:2023年前端技术盘点与2024年技术展望

相关推荐
也无晴也无风雨44 分钟前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang1 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄4 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、4 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤6 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
邹阿涛涛涛涛涛涛6 小时前
月之暗面招 Android 开发,大家快来投简历呀
android·人工智能·aigc
AvatarGiser6 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la6 小时前
vue的样式知识点
前端·javascript·vue.js