GitHub Copilot Agent模式与AI编程智能体工作流深度实战:从自定义指令到企业代码库治理的规模化实践全解析

举报
江南清风起 发表于 2026/08/28 19:16:43 2026/08/28
【摘要】 GitHub Copilot Agent模式与AI编程智能体工作流深度实战:从自定义指令到企业代码库治理的规模化实践全解析 引言GitHub Copilot已从2021年的行级补全工具演进为完整的AI编程智能体体系:Copilot Chat提供上下文对话,Copilot Edits实现多文件协同修改,Copilot Agent模式(2025年正式GA)则让AI自主完成"理解需求-规划任务-...

GitHub Copilot Agent模式与AI编程智能体工作流深度实战:从自定义指令到企业代码库治理的规模化实践全解析

引言

GitHub Copilot已从2021年的行级补全工具演进为完整的AI编程智能体体系:Copilot Chat提供上下文对话,Copilot Edits实现多文件协同修改,Copilot Agent模式(2025年正式GA)则让AI自主完成"理解需求-规划任务-编辑代码-运行测试-修复错误"的完整开发循环。企业落地Copilot的关键不再是"用不用",而是如何治理:代码库级别的自定义指令(.github/copilot-instructions.md)、MCP扩展、Agent工作流的安全边界、审计与合规、效果度量。本文从Copilot的技术架构讲起,覆盖自定义指令工程、Agent模式实战(issue-to-PR全流程)、MCP集成、Copilot API与GitHub Actions中的自动化Agent、企业治理策略(数据边界、许可合规、效果度量),并以真实场景展示完整工作流。

一、Copilot技术架构与模型体系

1.1 从补全到智能体的四层演进

Copilot的技术栈分四层:第一层行内补全(Ghost Text),基于FIM(Fill-in-the-Middle)任务训练的小型专用模型,延迟低于150ms,在本地完成邻接文件检索(Neighboring Tabs);第二层Chat对话,大模型注入工作区上下文(打开文件、光标位置、终端错误、Git差异),支持@workspace全局检索(基于文件路径与嵌入的混合召回);第三层Edits,多文件协同修改,模型输出统一的Edit会话,原子化应用与回滚;第四层Agent模式,模型获得工具集(终端执行、文件编辑、错误自诊断),自主循环执行直到任务完成。企业理解这一分层的意义在于:不同层的延迟、成本、风险特征完全不同,治理策略应分层设计——补全层几乎无风险,Agent层则需要与CI/CD同级的管控。

1.2 企业部署基础

# 组织级开启与策略配置(管理员在GitHub Enterprise设置)
# Settings -> Copilot -> Copilot Policy
# - 建议:成员 individually assigned 或 entire org
# - 数据边界:Allow Copilot to share additional data(决定是否发送代码片段做改进)
# - 模型选择策略:允许的模型白名单

组织级策略核心JSON(通过GraphQL API管理):

# 查询组织Copilot策略
query {
  organization(login: "acme-corp") {
    copilotOrganizationSettings {
      ideChatEnabled
      ideCodeSuggestionsEnabled
      publicCodeFilterEnabled
      dotcomChatEnabled
      claudeAvailable
    }
    copilotSeatAssignment {
      totalSeats
      assignedSeats
    }
  }
}

二、自定义指令工程

2.1 代码库级指令文件

.github/copilot-instructions.md是Copilot的"项目宪法",Agent模式与Chat都会自动加载。有效的指令文件遵循"结构化、可执行、带反例"三原则:

<!-- .github/copilot-instructions.md -->
# ACME Platform - Copilot Instructions

## 项目概览
这是acme-corp的电商平台单体仓库(monorepo),包含:
- `apps/web` - Next.js 15消费者前端(App Router, TypeScript strict)
- `apps/admin` - React管理后台(Vite + TanStack Router)
- `services/` - NestJS微服务(订单、支付、库存、通知)
- `packages/` - 共享库(ui组件、类型定义、工具函数)
- `infra/` - Terraform + Kubernetes manifests

## 技术栈版本约定
- TypeScript 5.6+, Node.js 22 LTS
- Next.js 15(App Router,禁用Pages Router新增页面)
- Tailwind CSS 4(禁止引入其他CSS方案)
- PostgreSQL 16 + Drizzle ORM(新查询一律Drizzle,禁止raw SQL字符串拼接)
- Vitest + Playwright(单元测试与E2E)

## 代码风格强约束
1. 函数优先使用命名导出,禁止export default(Next.js页面组件除外)
2. 所有异步函数必须显式处理错误,禁止空catch
3. React组件:函数组件 + hooks,禁止class组件;服务端组件优先
4. 数据获取:服务端组件用Next.js fetch缓存语义,客户端用TanStack Query
5. 任何SQL必须参数化;Drizzle动态构建时用sql模板标签

## 命名与结构
- 文件名:组件PascalCase,工具函数kebab-case,测试文件*.test.ts紧邻源文件
- API路由:`app/api/[resource]/route.ts`遵循RESTful
- 环境变量必须以NEXT_PUBLIC_(客户端)或服务端前缀APP_开头,集中定义在packages/env

## 测试要求
- 修改services/下的任何服务:运行 `pnpm --filter service test`
- 新增公共函数必须有单元测试覆盖正常与边界路径
- E2E只在apps/web/e2e下添加,使用现有page object模式

## 禁止事项
- 禁止引入新依赖(除非明确说明理由并经讨论)
- 禁止修改infra/下的Terraform文件(需要DevOps评审)
- 禁止使用any;类型断言需要注释理由
- 禁止提交.env*文件或硬编码密钥

## 常用命令
```bash
pnpm install                  # 安装依赖
pnpm dev --filter web         # 启动web开发服务器
pnpm test                     # 全量单元测试
pnpm lint && pnpm typecheck   # 检查
pnpm e2e                      # E2E测试(需要本地起服务)

处理这个仓库的特殊规则

  • 数据库schema变更:修改packages/db/schema,运行pnpm db:generate生成迁移
  • API契约变更必须同步更新packages/types/openapi.yaml
  • 中文文案集中在apps/web/messages/zh.json,代码中禁止硬编码中文字符串
### 2.2 指令文件的分层体系
指令分四个粒度,作用域从大到小:仓库级(.github/copilot-instructions.md,全局加载)、目录级(.github/instructions/*.instructions.md,通过applyTo通配符匹配路径)、语言级(VS Code设置github.copilot.chat.codeGeneration.instructions)、会话级(#file #selection等上下文标签)。目录级指令示例:
```markdown
<!-- .github/instructions/services.instructions.md -->
---
applyTo: "services/**"
---
# 微服务开发规则
- 遵循模块分层:controller -> service -> repository,禁止跨层调用
- 依赖注入用NestJS装饰器,禁止手动new服务实例
- 所有外部调用(HTTP/DB/队列)必须设置超时与重试(使用NestJS的Timeout与Retryable装饰器)
- 日志用注入的Logger,禁止console.*;敏感字段(token、手机号)必须mask
- 配置通过ConfigService读取,禁止process.env直接访问(测试可注入)
<!-- .github/instructions/frontend.instructions.md -->
---
applyTo: "apps/web/**"
---
# 前端开发规则
- 服务端组件为默认选择,仅交互部分下沉为客户端组件('use client'最小化)
- 样式用Tailwind原子类;超过15个类的组合提取为组件
- 图标用lucide-react;图片必须用next/image
- 表单用react-hook-form + zod,禁止受控state手写表单
- 任何fetch都走packages/api的typed client,禁止裸fetch

三、Agent模式深度实战

3.1 Issue-to-PR全流程

Agent模式的核心场景是把一个GitHub Issue变成可评审的PR。以"给订单列表加导出CSV功能"为例,在VS Code Agent模式中输入:

请实现issue #2847:订单列表支持CSV导出。

要求:
1. 在订单列表页加"导出CSV"按钮
2. 后端新增/api/orders/export端点,流式生成CSV(最多10万行)
3. 导出当前过滤条件命中的订单
4. 单元测试覆盖

完成后创建PR并关联issue。

Agent的执行轨迹展示了其自主循环:

Agent: 我先了解任务上下文。
[读取] .github/copilot-instructions.md
[读取] apps/web/app/(dashboard)/orders/page.tsx
[读取] services/order/src/order.controller.ts
[读取] services/order/src/order.service.ts
[读取] packages/db/schema/orders.ts
[搜索] "csv" in services/
[搜索] "export" in apps/web/

发现项目使用Drizzle与react-hook-form,尚无CSV依赖。
规划任务:
1. services/order添加导出服务方法(Drizzle流式查询 + csv-stringify)
2. 添加导出端点(流式响应)
3. 前端添加按钮与下载逻辑
4. 编写单元测试
5. 运行测试与typecheck

[终端] pnpm --filter order add csv-stringify
# 等等——指令禁止引入新依赖。csv-stringify是合理选择吗?
# 检查:packages/中是否已有CSV工具……未找到。
# 决定:csv-stringify是标准方案,修改量小,在PR说明中注明理由请求豁免。

[编辑] services/order/src/order.service.ts
+ async *streamOrdersForExport(filters: OrderFilters) {
+   const conditions = buildOrderFilters(filters);
+   const query = this.db.select().from(orders)
+     .where(and(...conditions))
+     .orderBy(desc(orders.createdAt));
+   // 游标式流式读取,避免10万行载入内存
+   yield* this.db.execute(query).stream();
+ }

[编辑] services/order/src/order.controller.ts
+ @Get('export')
+ @Header('Content-Type', 'text/csv; charset=utf-8')
+ async exportOrders(
+   @Query() filters: OrderFiltersDto,
+   @Res() res: FastifyReply,
+ ): Promise<void> {
+   // BOM头保证Excel正确识别UTF-8中文
+   res.header('Content-Disposition',
+     `attachment; filename="orders-${dayjs().format('YYYYMMDD-HHmm')}.csv"`);
+   res.raw.write('\ufeff');
+   const stringifier = stringify({ header: true });
+   stringifier.pipe(res.raw);
+   for await (const batch of this.orderService.streamOrdersForExport(filters)) {
+     for (const order of batch) {
+       stringifier.write([
+         order.id, order.orderNo, order.customerName,
+         order.totalAmount, order.status, order.createdAt.toISOString(),
+       ]);
+     }
+   }
+   stringifier.end();
+ }

[编辑] apps/web/app/(dashboard)/orders/order-toolbar.tsx
[编辑] services/order/test/order.export.test.ts

[终端] pnpm --filter order test
  ✓ order.export.test.ts (6 tests) 12ms
  Test Files 1 passed

[终端] pnpm typecheck
  All packages pass.

[终端] git checkout -b feat/order-csv-export && git add -A && git commit
[终端] gh pr create --title "feat(order): 订单CSV导出" --body "..." 

3.2 Agent的守护边界

Agent模式的终端执行有安全分级:默认只读命令(ls、git status、测试)自动执行,写命令(安装依赖、git commit)逐条请求确认,破坏性命令(rm -rf、git push --force、kubectl delete)永久阻止或需要明确白名单。VS Code设置示例:

// .vscode/settings.json - 团队共享的Agent策略
{
  "github.copilot.chat.agent.enabled": true,
  "github.copilot.chat.agent.maxRequests": 50,
  "github.copilot.chat.agent.terminal.allowedCommands": [
    "pnpm test*",
    "pnpm lint*",
    "pnpm typecheck",
    "pnpm --filter * test*",
    "git status",
    "git diff*",
    "git log*",
    "git checkout -b *",
    "git add *",
    "git commit -m *"
  ],
  "github.copilot.chat.agent.terminal.autoRun": [
    "pnpm test*",
    "pnpm lint*",
    "pnpm typecheck",
    "git status",
    "git diff*"
  ]
}

四、MCP集成与工具扩展

4.1 让Agent连接企业系统

Copilot Agent模式原生支持MCP客户端,VS Code配置:

// .vscode/mcp.json - 项目级MCP服务器
{
  "servers": {
    "postgres-dev": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres",
               "postgresql://localhost:5432/acme_dev"],
      "env": {}
    },
    "internal-docs": {
      "type": "http",
      "url": "https://mcp.internal.acme.com/docs",
      "headers": { "Authorization": "Bearer ${input:docs_token}" }
    },
    "design-system": {
      "type": "stdio",
      "command": "node",
      "args": ["./tools/mcp-design-tokens/dist/index.js"]
    }
  },
  "inputs": [
    {
      "id": "docs_token",
      "type": "promptString",
      "description": "内部文档MCP的访问令牌",
      "password": true
    }
  ]
}

配置后Agent对话中可直接调用:@workspace 用postgres-dev查询orders表最近7天的状态分布,然后根据design-system的令牌规范画一个状态分布柱状图组件。Agent会先调用MCP工具执行只读查询,再检索设计令牌,最后生成组件。

五、GitHub Actions中的自动化Agent

5.1 Copilot在CI中的两种形态

第一种是Copilot coding agent(GitHub托管的云Agent):把issue指派给@copilot,它在云端沙箱自主开发并开PR。第二种是Actions工作流中调用Copilot API做辅助任务(代码评审、日志分析)。企业更可控的是后者:

# .github/workflows/copilot-review.yml - AI辅助PR评审
name: Copilot Review
on:
  pull_request:
    types: [opened, synchronize, reopened]

permissions:
  contents: read
  pull-requests: write
  models: read    # 访问GitHub Models

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Security & Quality Review
        uses: actions/github-script@v7
        with:
          script: |
            const diff = await github.rest.pulls.get({
              ...context.repo,
              pull_number: context.issue.number,
              mediaType: { format: 'diff' },
            });

            const prompt = `你是资深安全评审员。审查以下diff,只报告CRITICAL或HIGH问题:
            1. 注入漏洞(SQL/命令/XSS/路径遍历)
            2. 认证授权缺陷
            3. 敏感信息泄漏(密钥、PII)
            4. 竞态与并发缺陷
            每个问题给出:位置(文件:行)、严重度、修复建议。
            没有问题输出"LGTM"。

            ${diff.data.slice(0, 100000)}`;

            // GitHub Models: 组织内免费额度调用Llama/GPT
            const response = await fetch(
              'https://models.github.ai/inference/chat/completions',
              {
                method: 'POST',
                headers: {
                  'Authorization': `Bearer ${process.env.GITHUB_TOKEN}`,
                  'Content-Type': 'application/json',
                },
                body: JSON.stringify({
                  model: 'openai/gpt-4o-mini',
                  messages: [{ role: 'user', content: prompt }],
                  temperature: 0.1,
                }),
              },
            );
            const result = await response.json();
            const review = result.choices[0].message.content;

            await github.rest.issues.createComment({
              ...context.repo,
              issue_number: context.issue.number,
              body: review === 'LGTM'
                ? '✅ Copilot安全评审通过'
                : `## 🔍 Copilot安全评审\n\n${review}`,
            });

5.2 Flaky测试自动诊断

# .github/workflows/flaky-diagnosis.yml
name: Flaky Test Diagnosis
on:
  workflow_run:
    workflows: ["CI"]
    types: [completed]

jobs:
  diagnose:
    if: ${{ github.event.workflow_run.conclusion == 'failure' }}
    runs-on: ubuntu-latest
    permissions:
      contents: read
      actions: read
      issues: write
    steps:
      - name: 获取失败日志并AI诊断
        uses: actions/github-script@v7
        with:
          script: |
            // 拉取失败job日志
            const jobs = await github.rest.actions.listJobsForWorkflowRun({
              ...context.repo,
              run_id: context.payload.workflow_run.id,
            });
            const failedJob = jobs.data.jobs.find(j => j.conclusion === 'failure');
            if (!failedJob) return;

            let logs = '';
            try {
              const logRes = await github.rest.actions.downloadJobLog({
                ...context.repo,
                job_id: failedJob.id,
              });
              logs = String(logRes.data).slice(-50000);
            } catch (e) { return; }

            const diagnosis = await fetch(
              'https://models.github.ai/inference/chat/completions',
              {
                method: 'POST',
                headers: {
                  'Authorization': `Bearer ${process.env.GITHUB_TOKEN}`,
                  'Content-Type': 'application/json',
                },
                body: JSON.stringify({
                  model: 'openai/gpt-4o-mini',
                  messages: [{
                    role: 'user',
                    content: `分析这段CI失败日志,判断是flaky还是确定性失败:
                    - flaky特征:超时、端口占用、竞态、外部服务抖动、随机数据
                    - 确定性失败:断言不匹配、编译错误、类型错误
                    输出JSON: {"verdict":"flaky|deterministic","confidence":0.9,
                    "reason":"...", "suggested_fix":"..."}
                    
                    日志:${logs}`,
                  }],
                  temperature: 0,
                }),
              },
            ).then(r => r.json());

            const parsed = JSON.parse(diagnosis.choices[0].message.content);
            
            // flaky自动打标签并开issue追踪
            if (parsed.verdict === 'flaky') {
              await github.rest.issues.addLabels({
                ...context.repo,
                issue_number: context.payload.workflow_run.id,
                labels: ['flaky'],
              });
            }

六、企业治理与效果度量

6.1 数据边界与许可合规

企业级部署必须明确三个数据问题。第一,内容边界:Copilot默认不使用企业代码训练模型(需在组织设置确认"Allow GitHub to use my code for training"关闭),但提示词与补全内容会传输到推理服务,因此涉密代码需要网络层隔离(本地网关或完全不用)。第二,许可风险:Copilot有公共代码过滤器(duplicate detection filter),组织策略应强制开启;对生成代码与开源许可证的相似性,建议在CI加入许可证扫描(如定期的片段比对)作为程序化保障。第三,合规审计:开启Copilot的使用审计日志(组织设置),记录谁在何时使用了哪些功能,满足金融/医疗行业的监管留痕要求。

6.2 效果度量框架

推广Copilot需要数据说话,核心指标分四组:采纳率(suggestion acceptance rate,Copilot dashboard直接提供,健康值25%-35%)、开发效率(PR周期时间、PR吞吐量、代码变更量,需对照实验测量)、质量代理(PR回滚率、bug密度、测试覆盖率变化,警惕"AI生成代码缺陷率"的幸存者偏差)、开发者体验(季度NPS调研,问"AI工具为你节省了多少重复劳动"比"满意度"更可操作)。一个务实的度量管道:

// tools/copilot-metrics/collect.js - 汇聚Copilot指标到看板
const { Octokit } = require('@octokit/rest');
const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });

async function collectPrMetrics(org, repo) {
  const prs = await octokit.paginate(octokit.rest.pulls.list, {
    owner: org, repo, state: 'all', per_page: 100,
    sort: 'updated', direction: 'desc',
  });

  const thirtyDaysAgo = Date.now() - 30 * 86400_000;
  const recent = prs.filter((pr) =>
    new Date(pr.updated_at).getTime() > thirtyDaysAgo,
  );

  const metrics = {
    total: recent.length,
    authoredByCopilot: recent.filter((pr) =>
      pr.user?.login === 'copilot-swe-agent' ||
      pr.head?.ref?.startsWith('copilot/'),
    ).length,
    medianTimeToMerge: median(
      recent
        .filter((pr) => pr.merged_at)
        .map((pr) =>
          (new Date(pr.merged_at) - new Date(pr.created_at)) / 3600_000,
        ),
    ),
    revertRate: 0,
  };

  // 回滚PR识别
  const reverts = recent.filter((pr) =>
    /revert|rollback/i.test(pr.title),
  );
  metrics.revertRate = +(reverts.length / recent.length * 100).toFixed(2);

  // 评论中的AI评审覆盖率
  const reviews = await Promise.all(
    recent.slice(0, 50).map((pr) =>
      octokit.rest.issues.listComments({
        owner: org, repo, issue_number: pr.number,
      }).catch(() => ({ data: [] })),
    ),
  );
  metrics.aiReviewCoverage = reviews.filter((r) =>
    r.data.some((c) => c.user?.login === 'github-actions' &&
      /copilot/i.test(c.body ?? '')),
  ).length / Math.min(recent.length, 50);

  return metrics;
}

function median(values) {
  if (!values.length) return 0;
  const sorted = [...values].sort((a, b) => a - b);
  return +sorted[Math.floor(sorted.length / 2)].toFixed(2);
}

6.3 分角色推广策略

推广阶段化:先在工具链成熟的团队试点(TypeScript/Python等主流栈效果最好),用试点数据说服保守团队;针对不同角色定制场景——前端团队主打"组件与样式生成"、后端主打"测试生成与重构"、SRE主打"日志分析与runbook生成"、数据团队主打"SQL与转换脚本";建立内部提示词库(把团队验证过的高质量提示词沉淀到仓库),降低使用门槛;明确红线清单(涉密仓库禁用、Agent模式需团队评审PR),让安全团队背书而不是阻碍。

七、进阶:自定义Copilot扩展

7.1 VS Code扩展API

对深度定制需求,Copilot Chat的扩展API允许注册自定义参与者与工具:

// extensions/copilot-acme/src/extension.ts - 自定义Chat参与者
import * as vscode from 'vscode';
import * as chat from './copilot-api';

export function activate(context: vscode.ExtensionContext) {
  const handler: chat.ChatRequestHandler = async (
    request: chat.ChatRequest,
    context: chat.ChatContext,
    stream: chat.ChatResponseStream,
    token: vscode.CancellationToken,
  ) => {
    // @acme 标签聊天入口
    const prompt = request.prompt;

    // 检索内部API文档(模拟RAG)
    const docs = await searchInternalDocs(prompt);
    for (const doc of docs) {
      stream.reference({
        uri: vscode.Uri.parse(doc.uri),
        range: new vscode.Range(0, 0, 0, 0),
      });
    }

    // 用语言模型流式生成
    const messages = [
      {
        role: vscode.LanguageModelChatMessage.Role.System,
        content: `你是ACME平台的架构助手。基于以下内部文档回答:
${docs.map((d) => d.content).join('\n---\n')}`,
      },
      { role: vscode.LanguageModelChatMessage.Role.User, content: prompt },
    ];

    const model = await vscode.lm.selectChatModels({
      vendor: 'copilot', family: 'gpt-4o',
    });
    const response = await model[0].sendRequest(messages, {}, token);

    for await (const fragment of response.text) {
      stream.markdown(fragment);
    }
  };

  const participant = vscode.chat.createChatParticipant(
    'acme.architect', handler,
  );
  participant.iconPath = vscode.Uri.joinPath(
    context.extensionUri, 'assets/icon.png',
  );
  participant.followupProvider = {
    provideFollowups(result, token) {
      return [{
        prompt: '生成对应的TypeScript类型定义',
        label: vscode.l10n.t('生成类型'),
      }];
    },
  };
  context.subscriptions.push(participant);
}

async function searchInternalDocs(query: string) {
  // 调用内部知识库API
  const res = await fetch(
    `https://docs.acme.internal/api/search?q=${encodeURIComponent(query)}`,
    { headers: { Authorization: `Bearer ${process.env.DOCS_TOKEN}` } },
  );
  return res.json();
}

总结

GitHub Copilot的企业级实践已进入"治理深水区":技术上,从行内补全到Agent模式的四层能力各有其用——补全降低击键成本,Chat加速理解,Edits支撑跨文件演进,Agent接管完整任务循环;工程上,自定义指令体系(仓库/目录/语言/会话四级)把团队规范注入AI行为,Agent的终端权限分级在自主性与安全间取得平衡,MCP让Agent连接企业内部数据与工具链,Actions中的API调用把AI嵌入CI做评审与flaky诊断;治理上,数据边界、公共代码过滤、审计日志满足合规底线,采纳率与PR度量验证投入产出。成功的组织把Copilot当作"需要培训的新员工"而非"即插即用的外挂"——为它写好onboarding文档(指令文件),给它合适的权限(Agent白名单),定期review它的产出(AI评审+人工把关),用数据持续校准。当AI编程从个人效率工具演进为组织级研发基础设施,胜负手不在于是否采用了最新模型,而在于工程化治理的深度——这正是传统软件工程方法论在AI时代的新生命力。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。