分类 默认分类 下的文章

这篇文章翻译自Ollama的博客文章,而文章内容则也是转载,最原始的文章没找到,因此就直接翻译了转载。

文章主要讲通过在 VS Code 或者 JetBrains 中使用 Continue 插件,并配合 Ollama 本地运行的大语言模型,实现在编辑器内使用的 AI 代码助手。主要内容包括1)代码自动补全和聊天、使用嵌入模型实现 @codebase 的 RAG 功能、微调模型并推送 Ollama 以及使用 @docs 功能引用网络内容

注意:文章发表于2024年5月31日,翻译该文的时候 Ollama 和 Continue 以及文章中引用的相关大模型都有不少升级。建议参考文章思路进行有益的尝试。


这是 Continue 联合创始人 Ty Dunn 的一篇客座文章,介绍了如何设置、探索以及找出将 Continue 与 Ollama 结合使用的最佳方法。

ollama-continue.png

Continue 可让您使用开源 LLM 直接在 Visual Studio Code 和 JetBrains 中轻松创建自己的编码助手。所有这些都可以完全在您自己的笔记本电脑上运行,也可以将 Ollama 部署在服务器上,以根据您的需求远程支持代码完成和聊天体验。

您需要安装下列软件以能够继续配置:

一旦您下载并安装好 Continue 和 Ollama,我们建议您探索以下内容

(上面的链接包含安装配置教程,可以参考教程安装,未来可能会有专门文章详细介绍,本文仅限原文翻译)

尝试 Mistral AI 的 Codestral 22B 模型进行自动完成和聊天

到目前为止,Codestral 是我们目前最喜欢的模型,它既能自动完成,又能聊天。该模型展示了 LLM 在编程任务方面的改进。但是,由于它有 22B 参数和非生产许可证,因此需要相当多的 VRAM,只能用于研究和测试目的,因此它可能不是日常本地使用的最佳选择。

  1. 在终端中下载并运行 Codestral 模型:
ollama run codestral
  1. 进入 VS Code,点击 Continue 右下角的齿轮图标打开你的 config.json 并添加

    {
      "models": [
     {
       "title": "Codestral",
       "provider": "ollama",
       "model": "codestral"
     }
      ],
      "tabAutocompleteModel": {
     "title": "Codestral",
     "provider": "ollama",
     "model": "codestral"
      }
    }

    continue-settings-vscode.png

使用 DeepSeek Coder 6.7B 进行自动完成,使用 Llama 3 8B 进行聊天

根据您机器上的 VRAM 容量,您可能能够利用 Ollama 运行多个模型和处理多个并发请求的能力,方法是使用 DeepSeek Coder 6.7B 进行自动完成,使用 Llama 3 8B 进行聊天。如果您的机器无法同时处理这两者,请分别尝试,然后决定您是喜欢本地自动完成还是本地聊天体验。然后,您可以使用远程托管或 SaaS 模型来获得另一种体验。

  1. 在终端中下载并运行 DeepSeek Coder 6.7B,运行方式如下:
ollama run deepseek-coder:6.7b-base
  1. 在另一个终端窗口中下载并运行 Llama 3 8B,运行:
ollama run llama3:8b
  1. 进入 VS Code,点击 Continue 右下角的齿轮图标打开你的 config.json 并添加:
{
  "models": [
    {
      "title": "Llama 3 8B",
      "provider": "ollama",
      "model": "llama3:8b"
    }
  ],
  "tabAutocompleteModel": {
    "title": "DeepSeek Coder 6.7B",
    "provider": "ollama",
    "model": "deepseek-coder:6.7b-base"
  }
}

使用 nomic-embed-text 嵌入和 Ollama 为 @codebase 提供支持

Continue 内置了 @codebase 上下文提供程序,可让您自动从代码库中检索最相关的代码片段。假设您已经设置了聊天模型(例如 Codestral、Llama 3),那么您可以通过 Ollama 和 LanceDB 的嵌入将整个体验保持在本地。截至目前,我们建议使用 nomic-embed-text 嵌入。

  1. 通过运行下面命令,在终端中下载 nomic-embed-text
ollama pull nomic-embed-text
  1. 进入 VS Code,点击 Continue 右下角的齿轮图标打开你的 config.json 并添加:
{
  "embeddingsProvider": {
    "provider": "ollama",
    "model": "nomic-embed-text"
  }
}
  1. 根据代码库的大小,可能需要一些时间进行索引,然后您可以提出问题,重要的代码库部分会自动被找到并在答案中使用(例如“@codebase Llama 3 的默认上下文长度是多少?”)

根据您的开发数据对 StarCoder 2 进行微调并将其推送到 Ollama 模型库

使用 Continue 时,您会自动生成有关如何构建软件的数据。默认情况下,此开发数据会保存到本地计算机上的 .continue/dev_data。当与您最终提交的代码结合时,它可用于改进您或您的团队使用的 LLM(如果您允许)。例如,您可以使用团队接受的自动完成建议来微调 StarCoder 2 等模型,以便为您提供更好的建议。

  1. 将“已接受的标签建议”提取并加载到 Hugging Face 数据集中
  2. 使用 Hugging Face 监督微调训练器对 StarCoder 2 进行微调
  3. 将模型推送到 Ollama 模型库,供您的团队使用并衡量您的接受率如何变化

通过使用 @docs 在 Continue 的帮助下提问,了解有关 Ollama 的更多信息

Continue 还内置了 @docs 上下文提供程序,可让您索引和检索来自任何文档站点的片段。假设您已经设置了聊天模型(例如 Codestral、Llama 3),您可以通过提供 GitHub 上的 Ollama README 链接并提出问题以了解更多信息,从而将整个体验保持在本地。

  1. 在聊天侧栏中输入 @docs,选择“添加文档”,将“https://github.com/ollama/ollama”复制并粘贴到 URL 字段中,然后在标题字段中输入“Ollama”
  2. 它应该可以快速索引 Ollama README,然后您可以向它提问,它会自动找到重要部分并将其用于答案中(例如“@Ollama 我如何运行 Llama 3?”)

由于众所周不知的原因,docker hub已经不能从国内正常访问。这时我们可以通过访问正常访问的docker hub镜像网站,实现正常拉取镜像。

本文介绍如何通过在Cloudflare中部署一个镜像页面,并合理配置服务器或者Windows/MacOS中的Docker引擎,实现曲线救国。

一、前提

二、GitHub CF-Workers-docker.io 项目

docker-hub-01.png

CF-Workers-docker.io 是一个 Docker 仓库镜像代理工具。官方描述为:

这个项目是一个基于 Cloudflare Workers 的 Docker 镜像代理工具。它能够中转对 Docker 官方镜像仓库的请求,解决一些访问限制和加速访问的问题。

仓库地址 https://github.com/cmliu/CF-Workers-docker.io 仓库说明中也包含了其他已经部署的镜像,如果不想自己部署Cloudflare,也可以直接跳过第三部分,直接拿来进入第四部分的配置进行操作。

注册登陆GitHub并进入该仓库后,Fork到自己的仓库。

三、在Cloudflare部署代理工具

  1. 登录Cloudflare
  2. 点击 Worker和Pages 再点 概述(Overview) 再点 新建(Create)
    docker-hub-02.png
  3. 新界面中切换到 Pages 页签,点击 连接到Git(Connect to Git)
    docker-hub-03.png
  4. 选择 GitHub 页签,并选择自己的github账户。注意:如果之前没有关联,可能需要通过添加账户(Add Account)先行添加。之后在下方选择之前fork到自己仓库的项目,名称应该为 CF-Workers-docker.io,最后点击右下角的开始设置(Begin Setup)按钮。
    docker-hub-04.png
  5. 确认页面不用修改,直接点击保存并部署(Save and Deploy),等待部署完成。
    docker-hub-05.png
  6. 点击继续处理项目(Continue to Process Project)
  7. 最后得到一个域名,类似cf-workers-docker-io-xxx.pages.dev。点击页面右上角的访问(Visit),打开就是docker hub的搜索页面。

四、设置docker守护进程配置中的 registry-mirrors 属性

  • 原理:通过设置docker守护进程配置docker-daemon.json文件中的registry-mirrors顶级属性,可以让Docker直接访问docker hub的镜像站点。与Ubuntu的镜像软件中心、Node.js npm的源地址、Python pipy的源地址等是一个道理。
  • 注意:编辑docker-daemon.json文件时,务必遵守JSON格式规则,否则会引起Docker崩溃。

Linxu 服务器上使用代理

  1. 使用ssh或者类似工具登陆服务器。修改 /etc/docker/daemon.json 文件,(如果没有则直接新建),添加registry-mirrors 顶级属性"registry-mirrors" : [ "https://刚刚得到的域名" ]。最后看起来应该类似:
{
  "debug": false,
  "registry-mirrors" : [ "https://cf-workers-docker-xxx.pages.dev" ]
}
  1. 重启启动docker服务(通过systemctl reload或者直接重启服务器),之后便可以使用

MacOSWindows 中使用代理

MacOSWindows 一般都使用Docker Desktop管理Docker,可以非常方便的配置Docker引擎

  1. 打开docker desktop,依次点击右上角⚙️(齿轮),设置界面中的Docker Engine, 并在左侧的json文本编辑器中添加registry-mirrors 顶级属性"registry-mirrors" : [ "https://刚刚得到的域名" ]。最后看起来类似:

    {
      "builder": {
     "gc": {
       "defaultKeepStorage": "20GB",
       "enabled": true
     }
      },
      "debug": true,
      "experimental": false,
      "registry-mirrors" : [ "https://cf-workers-docker-xxx.pages.dev" ]
    }

    docker-hub-06.png

  2. 点击右下角 应用并重启(Apply and Restart) 之后便可以使用代理拉取镜像!

延伸:更多的容器仓库需要镜像/代理怎么办?

使用国内开源镜像加速服务

比如南京大学镜像 官网南京大学开源镜像 GHCR

还是使用Cloudflare Worker进行路由转发:

可以使用GitHub上的cloudflare-docker-proxy这个项目来实现对 docker hub, gcr.io, ghcr.io, k8s.gcr.io, quay.io 等容器仓库的代理和流量转发。具体可以参考其主页文档。

2GP Managed Package

Salesforce 第二代管控包(Second-Generation Managed Packages)是Salesforce最新推广的最佳实践。通过Salesforce CLI,我们可以很方便的制作和部署第二代管控包。本文只是简略的将核心步骤展示出来:

涉及的各种环境

整个第二代管控包需要用到4类org:

  1. Dev Hub Org:承载所有二代包。可以将各个命名空间的二代包链接到这个org。最好是PBO
  2. Namespace Org:一般是Developer org,在其中申请相应的命名空间,由于命名空间一旦申请便与该org永久绑定且不可修改,申请时请慎重。
  3. Scratch Orgs:在开发测试中使用。
  4. Production Orgs:按照和使用包的生产环境。

2GP Packages.drawio.svg
相关org关系示意图。

10步完成制作

  1. 创建一个 SFDX 项目

    sfdx force:project:create --outputdir expense-manager-workspace --projectname expenser-app
  2. 授权Dev Hub环境,该环境必须启用Dev Hub功能和未锁定包和第二代管控包功能

    sfdx auth:web:login -d -a devHub
  3. 创建一个草稿环境(scratch org)并在其中开发包

    sfdx force:org:create -f config/project-scratch-def.json -u scratchOrg1
  4. 保证所有要打包的组件都已经在当前的项目文件夹内
  5. sfdx-project.json文件中,使用命名空间属性指定命名空间。例如:“namespace”:“exp-mgr”
  6. 从 SFDX 项目文件夹,直接创建管控包:

    sfdx force:package:create --name "Expense Manager" --path force-app --packagetype Managed
  7. 检查项目文件夹中的sfdx-project.json文件,CLI 会自动更新项目文件,使其包含上一步创建的包的信息:

    {
    "packageDirectories": [
       {
          "path": "force-app",
          "default": true,
          "package": "Expense Manager",
          "versionName": "ver 0.1",
          "versionNumber": "0.1.0.NEXT"
       }
    ],
    "namespace": "exp-mgr",
    "sfdcLoginUrl": "https://login.salesforce.com",
    "sourceApiVersion": "51.0",
    "packageAliases": {
       "Expense Manager": "0Hoxxx"
    }
    }
  8. 创建一个包的版本,Salesforce CLI会自动处理包的版本号等

    sfdx force:package:version:create --package "Expense Manager" --installationkey test1234 --wait 10
  9. 在另一个创建好的草稿环境中,安装并测试这个版本的包:

    sfdx force:package:install --package "Expense [email protected]" --targetusername MyTestOrg1 
    --installationkey test1234 --wait 10 --publishwait 10
  10. 安装包后,打开scratch org查看包:

    sfdx force:org:open --targetusername MyTestOrg1
\frac{a}{b^2}

参考:

  1. Salesforce DX Developer Guide
  2. Link a Namespace to a Dev Hub Org
  3. Create and Register Your Namespace for Second-Generation Managed Packages
  4. Workflow for Second-Generation Managed Packages

有时候我们需要在Salesforce页面下载存放为Attachment的文件;或者我们需要把存成Attachment的图片显示在页面上。

内部站点

如果我们文件为Attachment,在Salesforce Internal (即使用Salesforce账户登录的,非Digital Experience, Site.com),则可以使用

 <a href="{!URLFOR($Action.Attachment.Download, attachmentId)}">File Name</a>

下载文件。

或者使用

<img src="{!URLFOR($Action.Attachment.Download, attachmentId)}" />

显示图片。

如果是File,则可以使用Url.getFileFieldURL(entityId, fieldName)

Site.com

Site.com上的则不能用上面的方法,使用的话会直接报错。这时可以通过Salesforce提供的文件下载api /servlet/servlet.FileDownload?file=xxxx~18,不过要注意,一定要使用Salesorce Internal Url,使用Site.com的相关url肯定也会报错。

  1. 首先在后台获取 Salesforce Instance Url 或 Org Domain Url。例如:
    String orgUrl = Url.getOrgDomainUrl().toExternalForm()
  2. 将其传到前台,拼接成下载地址:
    <a href="{!orgUrl + '/servlet/servlet.FileDownload?file=' + attachment.Id}">File Name</a>

参考文档

  1. Visualforce Developer Guide: $Action
  2. Apex Reference Guide: URLClass
  3. stackexchange: How to get salesforce instance url
  4. Salesforce Developer Forum: Download Attachment from Sites??
  5. Salesforce Developer Forum: How to get downloadable link for attachment?

如果你遇到了诸如

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

的错误,说明内存超标。

可以通过下面方法解决:

  1. 直接在node允许的时候加相关参数:

    $ node --max-old-space-size=4096 yourFile.js

    这里将程序可用的最大内存空间增加到了4GB,一般情况下够用了。也可以根据自己的情况更改。

  2. 将相关参数作为环境变量添加进系统;

a. Linux/macOS:

export NODE_OPTIONS=--max-old-space-size=4096

b. Window

$env:NODE_OPTIONS="--max-old-space-size=8192"