搭建自己的AI 辅助编程助手

840 阅读9分钟

这篇文章是使用公司服务器和显卡,使用ollama部署 deepseek-coder,如果想本地尝试,可以跳过服务器相关的,Ollama 下载其他版本

image.png

前言

最近deepseek大模型很火,对于大多数人来说门槛比较高,作为一个稍懂点AI的前端开发,我就以非专业视角,来搭建一个AI 辅助编程。

准备

内存和显卡是跟模型相关的,下面配置仅做参考

服务器内存:48g

显卡:a30

服务器下载 ollama

curl -fsSL https://ollama.com/install.sh | sh
#也许需要相应的权限才能安装,可以使用命令
sudo curl -fsSL https://ollama.com/install.sh | sh
# 设置开机启动
sudo systemctl enable ollama  
# 查看服务状态
sudo systemctl status ollama
# 启动服务
sudo systemctl start ollama

可能用到的命令

#查看日志
journalctl -u ollama -n 20
# 停止ollama
sudo systemctl stop ollama
# 修改 服务 “/etc/systemd/system/ollama.service”
Environment="OLLAMA_HOST=0.0.0.0:11434"
# 加载配置,重启
systemctl daemon-reload
systemctl restart ollama
# 指定 GPU
#本地有多张 GPU,如何用指定的 GPU 来运行 Ollama? 在Linux上创建如下配置文件,并配置环境变量 CUDA_VISIBLE_DEVICES 来指定运行 Ollama 的 GPU,再重启 Ollama 服务即可【测试序号从0还是1开始,应是从0开始】
sudo vi /etc/systemd/system/ollama.service
Environment="CUDA_VISIBLE_DEVICES=0,1"
# 显示CPU架构信息。
lscpu
#显示内存使用情况
free -h
# 显示磁盘使用情况
df -h
# 查看运行的shell 脚本
ps -ef | grep test1.sh

下载模型

ollama run deepseek-coder-v2

# 下载模型时会越来越慢,重启之后会恢复速度
# 创建加速脚本 touch  dolwnload.sh

#!/bin/bash

while true; do
  ollama run deepseek-coder-v2 &
  CMD_PID=$!
  echo $CMD_PID
  sleep 60
  kill -9 $CMD_PID
  wait $CMD_PID 2>/dev/null
done

vs code 或JetBrains 安装 continue

在插件市场中搜索 continue,并安装

image.png

点击自定义配置

image.png

我这里用了两模型,一个千问的聊天模型,一个deepseek-coder 模型,可以情况自选。

PS:模型越大使用的资源越多,如果是尝试,可以选用小点的模型。

image.png

image.png

至此,你就可以愉快的探索AI辅助编程了🎉🎉🎉

扩展continue 配置

continue核心功能详解

1. 聊天功能(Chat)

Continue的聊天功能允许开发者通过自然语言与AI进行交互,帮助理解复杂的代码逻辑、解决问题或生成代码片段。例如,开发者可以在侧边栏中提问"如何优化这段代码?"并获得详细的建议。

2. 自动补全(Autocomplete)

自动补全功能通过实时分析开发者正在编写的代码,提供智能的补全建议。这一功能特别适合需要快速编写标准化代码或重复性代码的场景。

3. 代码编辑(Edit)

代码编辑功能允许用户直接在当前文件中修改代码,而无需切换到其他文件或窗口。例如,用户可以通过简单的命令要求AI重构某段代码。

4. 快捷操作(Actions)

快捷操作功能提供了一系列预设的快捷方式,帮助用户快速完成常见任务,例如格式化代码、生成注释或执行测试。

AI模型配置指南

Continue的强大功能离不开其背后的多样化AI模型支持。作为一个开源的AI编程助手,Continue构建了完整的模型生态系统,包括聊天模型(Chat Model)、自动补全模型(Autocomplete Model)、重排序模型(Reranking Model)和嵌入模型(Embeddings Model)。这些模型各司其职,又相互配合,为用户提供全方位的智能编程体验。更重要的是,Continue支持灵活配置各类模型,用户可以根据自己的需求选择不同的模型提供商,打造个性化的AI编程环境。

聊天模型(Chat Model)

聊天模型是一种专为对话场景设计的大型语言模型(LLM),通常包含405B+参数,能够回答复杂问题并生成高质量代码。在Continue中,聊天模型被广泛用于聊天、编辑和快捷操作功能。

推荐的聊天模型包括:

  • Claude 3.5 Sonnet

  • GPT-4

  • Gemini 1.5 Pro

自动补全模型(Autocomplete Model)

自动补全模型专为"中间填充"(Fill-In-The-Middle,FIM)任务设计,能够根据代码的前缀和后缀预测中间的内容。相比聊天模型,自动补全模型的参数量更小(通常为3B),但在特定任务上表现更优。

推荐的自动补全模型包括:

  • Codestral配合Mistral或Vertex AI

  • 本地运行的Qwen2.5-Coder 1.5B配合Ollama

DeepSeek模型配置示例

DeepSeek是目前最火的开源模型之一,既然是全开源方案,自然是要支持配置开源的聊天模型和自动补全模型。下面是DeepSeek的配置示例:

配置聊天模型:

{
  "models": [
    {
      "title": "DeepSeek Chat",
      "provider": "deepseek",
      "model": "deepseek-chat",
      "apiKey": "[API_KEY]"
    }
  ]
}

配置自动补全模型:

{
  "tabAutocompleteModel": {
    "title": "DeepSeek Coder",
    "provider": "deepseek",
    "model": "deepseek-coder"
  }
}

重排序模型(Reranking Model)

重排序模型是一种专门训练用于评估文本相关性的模型。它接收两段文本(通常是用户问题和文档)作为输入,返回一个0到1之间的相关性分数,用于估计该文档对回答问题的帮助程度。与LLM相比,重排序模型通常体积更小、运行速度更快、成本也更低。

在Continue中,重排序模型主要用于@Codebase功能,帮助筛选向量搜索后最相关的代码片段。

推荐的重排序模型包括:

  • Voyage AI的rerank-2模型:目前最佳的代码重排序模型

  • Cohere的rerank-english-v3.0:优秀的通用重排序模型

  • LLM作为重排序器:虽然可行但不推荐,因为成本高且准确度较低

配置示例(使用 Voyage AI):

{
  "reranker": {
    "name": "voyage",
    "params": {
      "model": "rerank-2",
      "apiKey": "<VOYAGE_API_KEY>"
    }
  }
}

嵌入模型(Embeddings Model)

嵌入模型是专门用于将文本转换为向量表示的AI模型,这些向量可以快速比较以确定文本之间的相似度。与LLM相比,嵌入模型同样具有体积小、速度快、成本低的特点。

在Continue中,嵌入模型在索引过程中生成向量,并被@Codebase功能用于对代码库进行相似度搜索。

推荐的嵌入模型包括:

  • Voyage AI的voyage-code-3:最佳的在线嵌入模型

  • Ollama的nomic-embed-text:推荐的本地部署选项

  • Transformers.js:VSCode默认的嵌入模型,使用all-MiniLM-L6-v2

配置示例(使用 Voyage AI):

{
  "embeddingsProvider": {
    "provider": "voyage",
    "model": "voyage-code-3",
    "apiKey": "<VOYAGE_API_KEY>"
  }
}

此外,Continue还支持多种其他嵌入模型提供商,如 OpenAI、Cohere、Gemini、Vertex AI、Mistral 等,用户可以根据需求选择合适的模型。

Continue扩展功能详解

Continue的扩展性是其一大亮点,主要体现在上下文提供器(Context Providers)和斜杠命令(Slash Commands)两个方面。

上下文提供器(Context Providers)

上下文提供器允许用户通过输入@来选择需要提供给AI的上下文内容。每个上下文提供器都是一个插件,用户可以根据需求添加或自定义。以下是一些常见的上下文提供器及其用途:

  • @File:引用当前工作区中的文件,适合需要快速查看和处理具体文件内容的场景

  • @Git Diff:引用当前分支的代码修改内容,便于总结更改或请求代码审查

  • @Terminal:引用终端中最近运行的命令及其输出,非常适合调试和运行脚本时使用

  • @Docs:引用文档站点的内容,帮助用户快速获取相关文档信息

  • @Web:引用从互联网上检索的相关页面,适合查找外部资源

  • @Codebase:引用代码库中最相关的代码片段,帮助AI更好地理解项目上下文

  • @Search:引用代码库搜索结果,与VSCode的搜索功能类似

配置示例:

{
  "contextProviders": [
    {
      "name": "file"
    },
    {
      "name": "git-diff"
    },
    {
      "name": "terminal"
    },
    {
      "name": "web",
      "params": { "n": 5 }
    }
  ]
}

用户可以根据项目需求添加更多上下文提供器,例如 @Tree(工作区结构)、@Problems(文件问题)或 @Debugger(调试器内容)。

斜杠命令(Slash Commands)

斜杠命令是Continue的另一大特色,用户可以通过输入/激活这些快捷指令。例如,内置的/edit命令可以直接将编辑内容流式传输到编辑器中。

内置的斜杠命令包括:

  • /cmd:生成shell命令并自动粘贴到终端

  • /commit:根据当前的git diff生成提交信息

  • /onboard:分析项目结构,帮助用户快速熟悉新项目

  • /http:调用自定义API

  • /issue:生成GitHub问题草稿

  • /share:导出当前会话的Markdown副本

Continue提供了两种自定义斜杠命令的方式:

  1. 使用自然语言提示(推荐)

这是最简单的自定义方式,只需要在config.json中添加customCommands配置。例如,创建一个用于检查代码错误的命令:

{
  "customCommands": [{
    "name": "check",
    "description": "检查代码中的错误",
    "prompt": "{{{ input }}}\n\n请检查高亮代码中的以下问题:\n- 语法错误\n- 逻辑错误\n- 安全漏洞\n- 性能问题\n- 其他潜在问题\n\n发现错误后请简明扼要地说明,每个错误用一个要点列出。"
  }]
}

这种方式支持使用Handlebars模板语法,可用的变量包括:

input:命令输入的额外文本和高亮的代码块

文件名:可以引用工作目录中的文件内容

  1. 使用自定义函数(高级)

对于需要更复杂功能的场景,可以使用config.ts编写自定义函数。这种方式可以完全访问ContinueSDK的功能。例如,创建一个生成提交信息的命令:

export function modifyConfig(config: Config): Config {
  config.slashCommands?.push({
    name: "commit",
    description: "生成Git提交信息",
    run: async function* (sdk) {
      const diff = await sdk.ide.getDiff(false);
      for await (const message of sdk.llm.streamComplete(
        `${diff}\n\n为上述更改生成一个简短的提交信息,使用祈使语气(如"添加功能"而不是"添加了功能"),不超过20个token:`,
        new AbortController().signal,
        {
          maxTokens: 20,
        },
      )) {
        yield message;
      }
    },
  });
  return config;
}

自定义斜杠命令的应用场景非常广泛,例如,可以创建以下自定义命令来提升开发效率:

  • 通过/check命令快速检查代码质量

  • 通过/test命令自动生成单元测试

  • 通过/doc命令生成代码文档

  • 通过/pr命令创建拉取请求描述

  • 通过/refactor命令获取代码重构建议

总结

以上就是我搭建的AI辅助编程的经历,希望对AI编程感兴趣你有所帮助。不当之处,可以在评论里打出,我会学习改进。