loyep.com avatar loyep
  • ai lowcodeDecember 16, 2024

    开源 AI 助手的企业级定制:Continue 深度实践

    分享使用 Continue 开源插件构建企业级自定义 AI 代码助手的完整实践,包括配置优化、功能扩展和团队部署策略。

    Continue开源工具企业级应用AI助手定制开发

    开源 AI 助手的企业级定制:Continue 深度实践

    虽然 GitHub Copilot 等商业 AI 编程助手已经很成熟,但在企业环境中往往面临一些限制:数据安全、定制需求、成本控制等。

    Github Copilot

    基于这些考虑,我开始探索开源替代方案,最终发现了 Continue 这个优秀的开源项目。这篇文章分享我的实践经验。

    GitHub Copilot 的使用体验

    1. 全程陪伴,安全感满满

    Copilot 陪伴编程

    就连写这篇文章,也是在它的陪伴下完成的。

    2. 从此成为了注释、回车、Tab 工程师

    Copilot 代码补全

    我承认,我已经离不开它了。

    作为一个通用的 AI 辅助开发工具,Github Copilot 的确已经做得很好了。

    但是,我的欲望远不止于此。

    更强大的自定义需求

    我想要一个更强大的 Copilot,一个能够结合业务、深入场景来客制化自定义的 Copilot。

    比如能够:

    • 调度任意 LLM Model
    • 选择任意上下文代码
    • 封装任意 prompt 命令
    • 甚至自定义 Agent 工作流的 Copilot

    下面,开始介绍 Continue,玩转自定义 Copilot。

    Continue 介绍

    Continue Logo

    项目地址: https://github.com/continuedev/continue

    Slogan: Open-source autopilot - build your own AI software development system(开源自动驾驶 - 构建您自己的 AI 软件开发系统)

    一句话介绍: Continue 使您能够在 IDE 中创建自己的 AI 代码助手。使用可以连接到任何模型、任何上下文和任何其他您需要的内容的开源 VS Code 和 JetBrains 扩展。

    安装方式

    直接在 VS Code 插件市场搜索 Continue,安装即可,后续步骤 Continue 插件会有使用引导。

    Continue 安装

    基础功能

    Continue 提供了丰富的基础功能:

    1. 快速理解代码段
    2. 自动补全代码建议
    3. 重构函数
    4. 向代码库提问
    5. 快速使用文档作为上下文
    6. 使用斜杠命令执行操作
    7. 将类、文件等添加到上下文
    8. 立即理解终端错误

    详见:https://docs.continue.dev/how-to-use-continue

    实际应用案例

    Coding 时,用最好的 LLM 沉浸式查阅资料

    沉浸式查阅资料

    基于 IDE 的任意上下文沉浸式生成代码

    上下文生成代码

    高级功能(核心价值)

    下面介绍一下 Continue 的高级功能,也是我认为最有价值的地方:

    1. 调度任意 LLM Model

    支持的 LLM 模型

    几乎所有主流的 LLM 都支持,包括商业的以及开源的:

    • 商业模型:GPT-4o、Claude-3-Opus、Gemini Pro
    • 开源模型:Llama3 系列、Mistral、CodeLlama
    • 本地部署:通过 Ollama 部署本地模型

    企业级应用场景: 比如很多公司对于信息安全有要求,不允许使用 Github Copilot,那么可以选择 Continue + Ollama 搭建私有化本地 Copilot。

    2. 选择任意上下文

    可以选择任意上下文代码,比如选择任意文件、任意函数、任意类。

    跟 GitHub Copilot 不同,Continue 能够直观地感受到你所选择的上下文。

    实际案例

    比如,我要迭代某个 React 组件,加一个 title props:

    组件的目录结构如下:

    StorybookExample
    ├── index.ts
    ├── interface.ts
    ├── StorybookExample.stories.tsx
    ├── StorybookExample.tsx
    └── styles.less

    操作步骤:

    1. 选中 StorybookExample.tsxinterface.ts 代码
    2. 使用快捷键添加到上下文:cmd+L (MacOS) / ctrl+L (Windows)
    3. 输入需求描述

    上下文选择示例

    在复杂场景下,你可以组装多个代码片段、文件、或者文件夹,来生成更复杂的代码。

    3. 自定义任意命令

    通过自定义命令,可以将一些常用的操作,抽象封装为快捷的命令,方便使用。

    斜杠命令

    你可以通过斜杠命令,来执行一些自定义的操作,比如:share、cmd、commit 等。

    命令列表

    详见:https://docs.continue.dev/customization/slash-commands

    方式一:基于配置文件自定义命令

    示例: 生成 Storybook 文档命令

    打开 ~/.continue/config.json 文件,添加如下配置:

    {
      "customCommands": [
        {
          "name": "storybook",
          "prompt": "{{{ input }}}\n\n 请基于这份interface帮我生成一份业务组件的storybook文档。要求如下:\n\n- 组件的每一个props都需要提供数据\n\n- storybook中使用@storybook/react进行文档的生成\n\n- 绝对不能回答跟storybook文档生成不相关的内容\n\n- 不需要安装任何包,直接生成stories文件即可",
          "description": "基于interface生成storybook文档"
        }
      ]
    }

    使用方法:

    1. 选择 interface.ts 文件
    2. 输入 /storybook 命令

    Storybook 命令使用

    方式二:基于 TypeScript 配置文件自定义命令

    示例: 生成 commit message 命令

    打开 ~/.continue/config.ts 文件,添加如下配置:

    export function modifyConfig(config: Config): Config {
      config.slashCommands?.push({
        name: "commit",
        description: "Write a commit message",
        run: async function* (sdk) {
          const diff = await sdk.ide.getDiff();
          for await (const message of sdk.llm.streamComplete(
            `${diff}\n\nWrite a commit message for the above changes. Use no more than 20 tokens to give a brief description in the imperative mood (e.g. 'Add feature' not 'Added feature'):`,
            {
              maxTokens: 20,
            }
          )) {
            yield message;
          }
        },
      });
      return config;
    }

    方式二的优势:

    • 更加灵活的控制命令逻辑
    • 可以调用 IDE API(如 getDiff 方法)
    • 支持执行任意 Node.js 代码
    • 可以调用外部接口、读取文件等

    使用方法: 输入 /commit 命令:

    Commit 命令使用

    4. 自定义任意 Context Providers

    Context Providers,故名思义,就是提供上下文的服务。

    Context Providers

    你可以通过 @ 操作符,来选择任意的 Context Providers 来提供不同的上下文。

    内置 Context Providers

    选择文件作为上下文:

    文件上下文

    选择文档作为上下文:

    文档上下文

    自定义 Context Providers

    示例: 创建一个 RAG 上下文提供程序

    1. 创建 RagContextProvider

    定义一个自定义的上下文提供程序,该提供程序将查询发送到内部服务器,并从向量数据库中获取结果。

    ~/.continue/config.ts 文件:

    const RagContextProvider: CustomContextProvider = {
      title: "rag",
      displayTitle: "RAG",
      description: "Retrieve snippets from our vector database of internal documents",
      getContextItems: async (
        query: string,
        extras: ContextProviderExtras
      ): Promise<ContextItem[]> => {
        const response = await fetch("https://internal_rag_server.com/retrieve", {
          method: "POST",
          body: JSON.stringify({ query }),
        });
        const results = await response.json();
        return results.map((result) => ({
          name: result.title,
          description: result.title,
          content: result.contents,
        }));
      },
    };

    2. 修改配置文件

    config.ts 中添加 RagContextProvider 以使其生效:

    export function modifyConfig(config: Config): Config {
      if (!config.contextProviders) {
        config.contextProviders = [];
      }
      config.contextProviders.push(RagContextProvider);
      return config;
    }

    前端研发应用场景

    通过 Context Providers,可以提供:

    • 公司内部的文档
    • 组件库文档和示例
    • 代码库的最佳实践
    • 业务规范和编码标准

    这样可以生成更符合公司规范的代码。

    5. 基于 Model Provider 接入 Agent

    Model Provider:顾名思义,就是模型提供者。

    Model Provider

    官方支持多种 Model Provider:

    • OpenAI
    • Anthropic (Claude)
    • Google (Gemini)
    • Hugging Face
    • 本地模型 (Ollama)

    详见:https://docs.continue.dev/reference/Model%20Providers/openai

    Agent 集成示例

    场景: 我想要一个能够结合公司私有组件库来生成业务组件的 Agent。

    问题背景: 如下图,现有的 LLM 不包含最新的 @mui/x-tree-view 知识,所以生成的代码是错误的。

    错误的代码生成

    解决方案:

    Agent 工作流程

    1. 开发 Agent

    开发一个 Agent 能够召回最新的 @mui/x-tree-view 组件知识来生成代码。

    2. 接入 Model Provider

    ~/.continue/config.json 文件中,添加如下配置:

    {
      "models": [
        {
          "title": "Mui Business Component Agent",
          "provider": "openai",
          "model": "gpt-4o",
          "apiBase": "http://localhost:3000/api/v1"
        }
      ]
    }

    配置说明:

    • provider: "openai":选择 OpenAI 格式是因为 Agent 接口返回的流数据格式与 OpenAI 一致
    • model: "gpt-4o":可以任意选择一个 OpenAI 系列 Model,仅为了适配 Continue 的数据格式
    • apiBase重点 - 填写我们的 Agent 接口地址

    使用 Agent:

    Agent 使用示例

    选择了 Mui Business Component Agent 作为 Model Provider,输入需求,即可生成正确的业务组件代码。

    总结

    Continue 的核心优势:

    1. 完全开源:可以自由定制和扩展
    2. 模型无关:支持任意 LLM 模型
    3. 高度可配置:命令、上下文、模型都可自定义
    4. 企业友好:支持私有化部署
    5. 开发者体验:与 IDE 深度集成

    通过 Continue,我们可以构建真正属于自己的 AI 代码助手,不再受限于商业产品的限制。

    下一步

    后续篇章,我们将继续探索:

    • 自定义 Command 的高级用法
    • Context Providers 的企业级应用
    • Agent 开发和集成的完整案例
    • Continue 与 RAG 系统的结合

    让我们一起探索 Copilot 和 Agent 的更多可能性!

    Last updated on