AI 程序员后端使用实践

更新时间:2025-03-26 03:17:28

通义灵码 AI 程序员,具备多文件代码修改(Multi-file Edit)和工具使用(Tool-use)的能力,可以与开发者协同完成编码任务,如需求实现、问题解决、单元测试用例生成、批量代码修改等。本文聚焦于后端研发中的典型场景,提供包含代码生成、代码重构以及自动化测试编写等核心场景使用实践。同时,通过结合企业私域数据,可实现符合企业特定的个性化推荐与生成,显著提升研发效率与质量。

背景信息

在现代企业开发中,基于企业自研框架的代码生成、技术框架的代码替换与重构以及单元测试编写等场景,是开发者频繁面对的核心任务和高频需求。然而,传统的AI工具通常依赖通用模型进行代码生成和推荐,难以充分结合企业的私域数据,实现个性化支持,这在一定程度上限制了其在实际开发中的应用效果。

通义灵码通过提供 AI 程序员和企业知识库两大核心功能,不仅能够使用 AI 程序员完成工程级代码生成,还能够基于企业私域数据完成个性化推荐,为开发者提供更加贴合实际需求的智能化解决方案。本文将通过几个使用实践,详细展示通义灵码在这些场景中的实际应用与价值。

说明

为了使知识库检索增强技术发挥最佳效果,请确保知识库文档(例如 API 文档、技术框架说明等)符合企业知识库准备中的规范要求,更多信息可参考知识库构建指南检索增强指南

场景1:基于 API 文档的代码生成

在企业开发中,通义灵码可利用 API 文档,快速生成高质量业务代码。只需输入需求描述和相关参数,通义灵码即可为您自动生成后端代码,提升开发效率,让您的团队投入更多精力专注于更高价值的开发工作。

1. 企业知识库准备

API 文档准备原则

  1. 结构清晰:应按逻辑顺序组织,分为接口描述、请求参数、返回数据等模块,每个模块需有清晰标题。

  2. 接口信息:

    • 功能:简述接口功能(如获取知识库列表)。

    • 方法:说明使用的 HTTP 方法(如 GET )。

    • 地址:提供完整 URL 示例。

    • 认证:说明需要的认证方式(如通过 Header 中的 Authorization 进行身份验证)。

  3. 请求参数:列出每个参数,说明含义、类型、是否必填及默认值。

  4. 响应数据:描述成功和错误响应的数据结构。

  5. 错误处理:说明错误场景和对应的状态码。

  6. 代码示例:提供任意语言的代码实现或 curl 示例即可。具体可参考以下《获取知识库文件列表 API 文档》示例。

文档参考示例

获取知识库文件列表 API 文档.md

# ListKbFiles - 获取知识库文件列表

获取知识库文件列表。


### 服务接入点与授权信息
- 获取服务接入点,替换 API 请求语法中的 <domain> :[服务接入点(domain)](../../API接入.md)。
- 获取个人访问令牌,具体操作,请参见[获取个人访问令牌](../../获取访问令牌.md)。

|产品|资源|所需权限|
|-|-|-|
|灵码|知识库文件|只读|


### 请求语法
```
GET https://{domain}/oapi/v1/lingma/organizations/{organizationId}/knowledgeBases/{kbId}/files
```

### 请求头
|参数|类型|是否必填|描述|示例值|
|-|-|-|-|-|
|x-yunxiao-token|string|是|个人访问令牌。|pt-0fh3\*\*\*\*0fbG_35af\*\*\*\*0484|


### 请求参数
|参数|类型|位置|是否必填|描述|示例值|
|-|-|-|-|-|-|
| organizationId | string | path | 是 | 所属企业 ID。  | <nil> |
| kbId | string | path | 是 | 知识库 id。  | <nil> |
| query | string | query | 否 | 文件名称模糊查询。  | <nil> |
| orderBy | string | query | 否 | 排序列,支持如下排序字段:gmt_added,kb_id,file_state。  | <nil> |
| sort | string | query | 否 | 排序顺序,支持倒序和正序:desc,asc。  | <nil> |
| page | integer | query | 否 | 当前页,默认1。  | <nil> |
| perPage | integer | query | 否 | 每页数据条数,默认20。  | <nil> |



### 请求示例
```
curl -X 'GET' \
  'https://test.rdc.aliyuncs.com/oapi/v1/lingma/organizations/{organizationId}/knowledgeBases/{kbId}/files?query={query}&orderBy={orderBy}&sort={sort}&page={page}&perPage={perPage}' \
  -H 'Content-Type: application/json' \
  -H 'x-yunxiao-token: pt-0fh3****0fbG_35af****0484'
```


### 返回参数
|参数|类型|描述|示例值|
|-|-|-|-|
| gmtCreated | integer | 创建时间 | 1722149052460 |
| gmtModified | integer  | 修改时间 | 1722149055731 |
| gmtAdded | integer  | 添加时间 | 1722149052515 |
| fileId | string | 文件唯一 ID | 30d4****aca4 |
| filename | string | 文件名称 | history.txt |
| fileSize | string | 文件大小 | 5 B |
| filePath | string | 文件完整路径 | lingma/rag_kb/... |
| fileState | string | 文件处理状态 | PROCESSED |
| kdId | string | 知识库唯一 ID | 3a41****3eca |
| organizationId | string | 所属组织 ID | 9a2****5ef1 |                     
| uploadUser | object | 文件添加者信息 |  |
| &nbsp;&nbsp;&nbsp;&nbsp;id | string | 用户唯一 ID | d402****9ae6 |
| &nbsp;&nbsp;&nbsp;&nbsp;displayName | string | 用户登录名 | lingma |
| &nbsp;&nbsp;&nbsp;&nbsp;userName | string | 用户昵称 | lingma |
| &nbsp;&nbsp;&nbsp;&nbsp;avatarUrl | string | 用户头像地址 | /objects/ajax/... |


### 返回示例
```
[
    {
        "fileId": "",
        "filePath": "",
        "fileSize": "",
        "fileState": "",
        "filename": "",
        "gmtAdded": 0,
        "gmtCreated": 0,
        "gmtModified": 0,
        "kbId": "",
        "organizationId": "",
        "uploadUser": {
            "avatarUrl": "",
            "displayName": "",
            "id": "",
            "userName": ""
        }
    }
]
```



### 响应头
|参数|描述|示例值|
|-|-|-|
|x-next-page|下一页。| <nil> |
|x-page|当前页。| <nil> |
|x-per-page|每页数据条数。| <nil> |
|x-prev-page|上一页。| <nil> |
|x-total|总数据量。| <nil> |
|x-total-pages|总分页数。| <nil> |



### 错误码
|HTTP status code|错误码|错误信息|描述|
|400|BadRequest|Bad Request|错误请求。|
|401|Unauthorized|Unauthorized|未授权。|
|403|Forbidden|Forbidden|当前用户未加入组织。|
|429|TooManyRequests|TooManyRequests|发送了过多请求。|
|500|InternalServerError|InternalServerError|内部错误。|

2. 场景演示:《通义灵码知识库列表查询》

AI 程序员后端使用实践

场景2:基于业务框架的代码生成

在企业 AI 编码落地过程中,经常遇到模型生成的代码未能采用企业自研的技术和业务架构的问题,通义灵码通过集成企业知识库,即可适配自研框架。例如,在以下商品库存系统场景中,企业通过将分布式锁实现方案及业务框架标准化文档放至企业知识库后,开发者即可实现基于标准化库存管理模块的代码生成,通过标准化代码的复用,提升开发效率,减少重复开发成本。同时,又确保了业务逻辑的一致性,提升代码质量。

1. 企业知识库准备

知识选择原则

  1. 明确目标业务模式和具体实现机制:

    • 识别关键业务模块:确定系统中需统一实现的关键业务逻辑模块,如库存管理、订单处理、支付系统等。

    • 细化具体业务实现机制:例如,库存管理可能涉及库存扣减、查询和锁定等不同场景,每个场景可能需要不同的实现机制。

  2. 选择相关业务框架内的代码文件并纳入企业代码知识库:

    • 从业务框架中筛选出实现关键业务逻辑的核心代码,整理并存入独立知识库。例如,库存扣减需使用分布式锁机制确保并发安全,因此选择实现分布式锁的核心代码模块。

业务框架文档准备原则

  1. 结构化呈现:文档必须包含简介、特性、架构设计、使用说明和示例代码等,采用 ## 模块名称/### 层级标记,标题命名无歧义。

  2. 术语标准化:使用企业统一且常用的术语(如 Lua 脚本、同步消息、异步消息等),方便您在 IDE 端通过写提示词准确召回。

  3. 代码示例要求

    1. 依赖声明:完整展示 pom.xml / gradle 引入方式。

    2. 核心实现:提供 Redis 加锁的完整代码块。具体可参考以下《Redis 加锁保护》示例,请确保文档已经放在企业知识库。

文档参考示例

Redis 加锁保护.md

# 基于 Redis 的分布式锁框架说明文档

## 简介

在分布式系统中,多个实例可能会同时访问共享资源,导致数据不一致或资源竞争等问题。分布式锁旨在通过协调多个服务实例的访问,确保同一时间只有一个实例能够操作特定资源。本框架基于 Redis 实现分布式锁,提供简单、高效的加锁与解锁机制,适用于 Java 应用程序。

---

## 特性

- **简单易用**:提供简洁的 API 接口,方便集成到现有项目中。
- **高效可靠**:基于 Redis 的原子操作,确保锁的可靠性。
- **可配置性强**:支持锁的过期时间和最大等待时间等参数的配置。
- **支持可重入锁**:同一线程可以重复获取锁,避免死锁。

---

## 架构设计

本分布式锁框架基于 Redis 的 `SET` 命令和 Lua 脚本实现。具体设计如下:

1. **加锁**:使用 Redis 的 `SET NX PX` 命令设置锁,保证操作的原子性。
2. **解锁**:通过 Lua 脚本验证锁的拥有者后再进行删除,防止误删其他客户端的锁。
3. **可重入锁支持**:通过在锁的值中存储线程标识和重入计数,允许同一线程多次获取锁。


---

## 使用说明

### 前提条件

- 已部署并运行 Redis 服务。
- Java 环境已搭建,使用 Maven 或 Gradle 进行项目管理。

### 集成步骤

1. **添加依赖**:在项目中引入 Redis 客户端库,如 Jedis 或 Lettuce。
2. **配置 Redis 连接**:配置 Redis 的主机、端口、密码等连接信息。
3. **初始化锁框架**:通过框架提供的工厂类获取锁实例。
4. **使用锁**:在需要加锁的代码区域调用锁的加锁与解锁方法。

---

## 示例代码

以下示例基于 Jedis 客户端实现,请根据实际使用的 Redis 客户端进行调整。

### 依赖配置

使用 Maven 管理依赖,在 `pom.xml` 中添加 Jedis 依赖:

```xml
<dependencies>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>4.3.1</version>
    </dependency>
</dependencies>
```

### 锁的实现

```java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;

import java.util.UUID;

public class RedisDistributedLock {
    private Jedis jedis;
    private String lockKey;
    private String lockValue;
    private long expireTime; // 锁的过期时间,单位毫秒
    private long acquireTimeout; // 获取锁的最大等待时间,单位毫秒

    public RedisDistributedLock(Jedis jedis, String lockKey, long expireTime, long acquireTimeout) {
        this.jedis = jedis;
        this.lockKey = lockKey;
        this.expireTime = expireTime;
        this.acquireTimeout = acquireTimeout;
        this.lockValue = UUID.randomUUID().toString();
    }

    /**
     * 尝试获取锁
     * @return 是否获取锁成功
     */
    public boolean lock() {
        long end = System.currentTimeMillis() + acquireTimeout;
        SetParams params = new SetParams();
        params.nx().px(expireTime);

        while (System.currentTimeMillis() < end) {
            String result = jedis.set(lockKey, lockValue, params);
            if ("OK".equals(result)) {
                return true;
            }
            try {
                Thread.sleep(100); // 等待一段时间后重试
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return false;
            }
        }
        return false;
    }

    /**
     * 释放锁
     * @return 是否释放锁成功
     */
    public boolean unlock() {
        String luaScript =
                "if redis.call('get', KEYS[1]) == ARGV[1] then " +
                "   return redis.call('del', KEYS[1]) " +
                "else " +
                "   return 0 " +
                "end";

        Object result = jedis.eval(luaScript, 1, lockKey, lockValue);
        return "1".equals(result.toString());
    }
}
```

### 使用示例

```java
import redis.clients.jedis.Jedis;

public class LockExample {
    public static void main(String[] args) {
        // 连接 Redis
        Jedis jedis = new Jedis("localhost", 6379);
        try {
            // 初始化分布式锁
            RedisDistributedLock lock = new RedisDistributedLock(jedis, "my_lock_key", 5000, 10000);

            // 尝试获取锁
            if (lock.lock()) {
                try {
                    // 获取锁成功后的业务逻辑
                    
                } finally {
                    // 释放锁
                    boolean unlocked = lock.unlock();
                    if (unlocked) {
                        System.out.println("锁释放成功");
                    } else {
                        System.out.println("锁释放失败");
                    }
                }
            } else {
                System.out.println("无法获取锁,执行其他逻辑或重试");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            jedis.close();
        }
    }
}
```

2. 场景演示:《电商库存管理的分布式锁资源保护》

AI 程序员后端使用实践

场景3:基于自研技术框架的代码重构

在企业技术架构调整中,替换技术组件(如将 RabbitMQ 替换为 RocketMQ)常面临代码改动复杂和质量保障难题。通义灵码通过 AI 程序员及企业知识库,助力企业高效完成组件替换,确保系统质量与一致性,同时缩短周期并降低风险。

1. 企业知识库文档准备

技术框架文档准备原则

  1. 结构化要求

    • 标题层级:# 主标题定义功能模块(如消息发送机制),##/### 子标题划分操作步骤(如Topic创建/同步发送)。

    • 内容隔离:独立功能单元强制分节;消息发送方式(同步/异步/单向)分别独立说明。

  2. 技术关键参数说明

    • 对重要配置(如 autoCreateTopicEnable)标注作用域及风险场景。

    • 提供具体的 CLI 命令示例(如mqadmin updateTopic -t ORDER_TOPIC)和输出结果。

  3. 代码块格式化:使用 Markdown 的代码块语法(```)对命令行和代码进行格式化,区分不同语言(如 Shell、Java)。

  4. 容错设计:同步/异步操作需强制异常捕获及重试机制;单向传输不可靠,数据不允许丢失时应选择其他方式。

  5. 代码示范标准【重要】

    • 全链路示例:每种消息模式(同步/异步/单向)提供初始化→发送→关闭完整代码。

    • 关键注释:在producer 创建消息体构建等节点标注技术要点。

  6. 代码示例可参考以下《企业自研中间件 RocketMQ 消息发送》示例,请确保文档已经放在企业知识库。

文档参考示例

企业自研中间件 RocketMQ 消息发送.md

# 普通消息发送

## 1.向集群中创建 Topic

发送消息前,需要确保目标主题已经被创建和初始化。可以利用 RocketMQ Admin 工具创建目标 Topic 。

RocketMQ 部署安装包默认开启了 **autoCreateTopicEnable** 配置,会自动为发送的消息创建 Topic,但该特性仅推荐在初期测试时使用。

**生产环境强烈建议管理所有主题的生命周期,关闭自动创建参数**,以避免生产集群出现大量无效主题,无法管理和回收,造成集群注册压力增大,影响生产集群的稳定性。

```shell
$ sh bin/mqadmin updateTopic -c DefaultCluster -t TopicTest -n 127.0.0.1:9876
create topic to 127.0.0.1:10911 success.
TopicConfig [topicName=TopicTest, readQueueNums=8, writeQueueNums=8, perm=RW-, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=false, attributes=null]
```

可以看到在执行完命令后,在该台Broker机器上创建了8个队列,名为TopicTest的Topic。

## 2.添加客户端依赖

首先需要在 JAVA 程序中添加 RocketMQ 的客户端依赖。

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

<Tabs>
<TabItem value="Maven" label="Maven" default >

```java
<dependency>
  <groupId>org.apache.rocketmq</groupId>
  <artifactId>rocketmq-client</artifactId>
  <version>4.9.4</version>
</dependency>
```
</TabItem>
<TabItem value="Gradle" label="Gradle">

```java 
compile 'org.apache.rocketmq:rocketmq-client:4.9.4'
```

</TabItem>

</Tabs>


## 3.消息发送

Apache RocketMQ可用于以三种方式发送消息:**同步、异步和单向传输**。前两种消息类型是可靠的,因为无论它们是否成功发送都有响应。

### 3.1 同步发送

同步发送是最常用的方式,是指消息发送方发出一条消息后,会在收到服务端同步响应之后才发下一条消息的通讯方式,可靠的同步传输被广泛应用于各种场景,如重要的通知消息、短消息通知等。


同步发送的整个代码流程如下:
1. **首先会创建一个producer**。普通消息可以创建 DefaultMQProducer,创建时需要填写生产组的名称,生产者组是指同一类Producer的集合,这类Producer发送同一类消息且发送逻辑一致。
2. **设置 NameServer 的地址**。Apache RocketMQ很多方式设置NameServer地址(客户端配置中有介绍),这里是在代码中调用producer的API setNamesrvAddr进行设置,如果有多个NameServer,中间以分号隔开,比如"127.0.0.2:9876;127.0.0.3:9876"。 
3. **第三步是构建消息**。指定topic、tag、body等信息,tag可以理解成标签,对消息进行再归类,RocketMQ可以在消费端对tag进行过滤。
4. **最后调用send接口将消息发送出去**。同步发送等待结果最后返回SendResult,SendResult包含实际发送状态还包括SEND_OK(发送成功), FLUSH_DISK_TIMEOUT(刷盘超时), FLUSH_SLAVE_TIMEOUT(同步到备超时), SLAVE_NOT_AVAILABLE(备不可用),如果发送失败会抛出异常。
``` java
public class SyncProducer {
  public static void main(String[] args) throws Exception {
    // 初始化一个producer并设置Producer group name
    DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); //(1)
    // 设置NameServer地址
    producer.setNamesrvAddr("localhost:9876");  //(2)
    // 启动producer
    producer.start();
  
      // 创建一条消息,并指定topic、tag、body等信息,tag可以理解成标签,对消息进行再归类,RocketMQ可以在消费端对tag进行过滤
      Message msg = new Message("TopicTest" /* Topic */,
        "TagA" /* Tag */,
        ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
        );   //(3)
      // 利用producer进行发送,并同步等待发送结果
      SendResult sendResult = producer.send(msg);   //(4)
      System.out.printf("%s%n", sendResult);
    
    // 一旦producer不再使用,关闭producer
    producer.shutdown();
  
}
```

:::note
同步发送方式请务必捕获发送异常,并做业务侧失败兜底逻辑,如果忽略异常则可能会导致消息未成功发送的情况。
:::


### 3.2 异步发送


异步发送是指发送方发出一条消息后,不等服务端返回响应,接着发送下一条消息的通讯方式。
:::note
异步发送需要实现**异步发送回调接口**(SendCallback)。
:::
消息发送方在发送了一条消息后,不需要等待服务端响应即可发送第二条消息,发送方通过回调接口接收服务端响应,并处理响应结果。异步发送一般用于链路耗时较长,对响应时间较为敏感的业务场景。例如,视频上传后通知启动转码服务,转码完成后通知推送转码结果等。

如下是示例代码。

``` java
public class AsyncProducer {
  public static void main(String[] args) throws Exception {
    // 初始化一个producer并设置Producer group name
    DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
    // 设置NameServer地址
    producer.setNamesrvAddr("localhost:9876");
    // 启动producer
    producer.start();
    producer.setRetryTimesWhenSendAsyncFailed(0);
    
    final CountDownLatch countDownLatch = new CountDownLatch(messageCount);
   
      try {
          final int index = i;
          // 创建一条消息,并指定topic、tag、body等信息,tag可以理解成标签,对消息进行再归类,RocketMQ可以在消费端对tag进行过滤
          Message msg = new Message("TopicTest",
            "TagA",
            "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
          // 异步发送消息, 发送结果通过callback返回给客户端
          producer.send(msg, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
              System.out.printf("%-10d OK %s %n", index,
                sendResult.getMsgId());
              countDownLatch.countDown();
            }
            @Override
            public void onException(Throwable e) {
              System.out.printf("%-10d Exception %s %n", index, e);
              e.printStackTrace();
              countDownLatch.countDown();
            }
          });
        } catch (Exception e) {
            e.printStackTrace();
            countDownLatch.countDown();
        }
    
    //异步发送,如果要求可靠传输,必须要等回调接口返回明确结果后才能结束逻辑,否则立即关闭Producer可能导致部分消息尚未传输成功
    countDownLatch.await(5, TimeUnit.SECONDS);
    // 一旦producer不再使用,关闭producer
    producer.shutdown();
  }
}
```

:::note
异步发送与同步发送代码唯一区别在于调用send接口的参数不同,异步发送不会等待发送返回,取而代之的是send方法需要传入 SendCallback 的实现,SendCallback 接口主要有onSuccess 和 onException 两个方法,表示消息发送成功和消息发送失败。
:::

### 3.3 单向模式发送


发送方只负责发送消息,不等待服务端返回响应且没有回调函数触发,即只发送请求不等待应答。此方式发送消息的过程耗时非常短,一般在微秒级别。适用于某些耗时非常短,但对可靠性要求并不高的场景,例如日志收集。

``` java
public class OnewayProducer {
  public static void main(String[] args) throws Exception{
    // 初始化一个producer并设置Producer group name
    DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
    // 设置NameServer地址
    producer.setNamesrvAddr("localhost:9876");
    // 启动producer
    producer.start();
    
      // 创建一条消息,并指定topic、tag、body等信息,tag可以理解成标签,对消息进行再归类,RocketMQ可以在消费端对tag进行过滤
      Message msg = new Message("TopicTest" /* Topic */,
        "TagA" /* Tag */,
        ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
      );
      // 由于在oneway方式发送消息时没有请求应答处理,如果出现消息发送失败,则会因为没有重试而导致数据丢失。若数据不可丢,建议选用可靠同步或可靠异步发送方式。
      producer.sendOneway(msg);
    }
     // 一旦producer不再使用,关闭producer
     producer.shutdown();
  
}
```

单向模式调用sendOneway,不会对返回结果有任何等待和处理。

2. 场景演示:《消息队列组件的更换:从 RabbitMQ 到 RocketMQ》

AI 程序员后端使用实践

场景4:单测智能体

单元测试智能体是 AI 程序员的一项专业能力,针对代码变更(#codeChanges)、单个或多个代码文件批量生成单元测试文件。您只需输入待测内容和要求后,AI 自动生成测试计划、测试用例,并进行编译、运行及自动修复,提升测试覆盖率和质量,降低您的编写成本。

说明

IntelliJ IDEA 的通义灵码插件已上线单元测试智能体功能,包括自动编译、运行和修复。

1. 单测智能体度量指标

技术评估维度(编译通过率、运行通过率)——基于Java代码本地测评集的测评结果:

  1. 一次性编译通过率:该指标用于衡量单元测试智能体生成的代码在编译阶段的成功比例。当前编译通过率为81.00%。

  2. 一次性运行通过率:运行通过率关注的是生成的单元测试在实际运行环境中的表现情况。目前的运行通过率为80.55%,显示出代码在执行阶段的表现与编译阶段相近。

业务效能评估——业务团队单测覆盖率:单测覆盖率作为业务团队的关键度量标准,反映了自动化单元测试对代码库的覆盖程度。提高这一比率不仅能增强产品质量,还能促进更快的开发周期和更高的客户满意度。

2. 场景演示:《单元测试自动生成、编译与运行》

AI 程序员后端使用实践

  • 本页导读
  • 背景信息
  • 场景1:基于 API 文档的代码生成
  • 1. 企业知识库准备
  • 2. 场景演示:《通义灵码知识库列表查询》
  • 场景2:基于业务框架的代码生成
  • 1. 企业知识库准备
  • 2. 场景演示:《电商库存管理的分布式锁资源保护》
  • 场景3:基于自研技术框架的代码重构
  • 1. 企业知识库文档准备
  • 2. 场景演示:《消息队列组件的更换:从 RabbitMQ 到 RocketMQ》
  • 场景4:单测智能体
  • 1. 单测智能体度量指标
  • 2. 场景演示:《单元测试自动生成、编译与运行》