1. 引言

之前我们玩的都是一些网上的大模型,注册充值麻烦、Token 成本也不可控。因此,很多企业都会在企业内部部署一套私有的大模型,不光减少调用大模型的成本,还可以进一步保护数据安全。在这些众多的开源大模型中,使用 Ollama 部署 Meta 公司(原 Facebook)开源的 Llama 模型,就成了很多企业的首选。

Llama 系列模型于 2023 年 2 月首次发布,到 2024 年发布了 Llama3 系列模型。这个开源模型在众多关键的基准测试中都表现得非常强大,号称是目前业界最强的开源大模型。

本文将带你一步步使用 Ollama、LangChain4j、One-API 和 FastGPT 等开源项目,从零搭建一套完整的本地知识库系统。

2. 使用 Ollama 本地运行 Llama 模型

Ollama 是一个让本地运行大模型变得极其简单的工具。它支持多种主流开源模型,包括 Llama、Mistral、Gemma 等。

2.1 安装 Ollama

访问 Ollama 官网,进入下载页面,选择对应平台的应用程序,安装即可。

2.2 下载并运行模型

安装完成后,可以去下载一些 Ollama 上的大模型。进入 Ollama 的 Models 页面,就能看到目前 Ollama 支持的开源大模型。在这些大模型中,最亮眼的当然是 Llama3.2 模型。

在本地执行对应的安装指令即可运行模型:

ollama run llama3.2:1b

Ollama 会帮我们去下载模型到本地,并运行。第一次拉取大模型过程会比较长,喝杯咖啡吧。

注意

  • 本地运行大模型,对机器配置要求会高一点。
  • Llama 模型并没有针对中文进行重点训练,因此对中文的理解没有那么好。

3. LangChain4j 调用本地 Ollama 模型

LangChain4j 是一个 Java 版本的 LangChain 框架,可以方便地集成各种大模型。

3.1 引入依赖

首先需要引入 LangChain4j 对 Ollama 的支持依赖:

<dependency>
  <groupId>dev.langchain4j</groupId>
  <artifactId>langchain4j-ollama</artifactId>
  <version>${langchain4j.version}</version>
</dependency>

3.2 编写调用代码

接下来就可以使用 Ollama 的实现类,快速调用本地部署的大模型:

import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.ollama.OllamaChatModel;

public class OllamaDemo {
    public static void main(String[] args) {
        ChatLanguageModel model = OllamaChatModel.builder()
                .baseUrl("http://localhost:11434/")
                .modelName("llama3.2:1b")
                .build();
        System.out.println(model.generate("你好,你是谁?可以帮我解决什么问题?"));
    }
}

3.3 使用 OpenAI 兼容 API

Ollama 也兼容了 OpenAI 的 API,所以也可以直接使用 OpenAiChatModel

ChatLanguageModel model = OpenAiChatModel.builder()
        .baseUrl("http://localhost:11434/v1/")
        .modelName("llama3.2:1b")
        .apiKey("123") // 当前版本 baseurl 和 Ollama 原生 API 地址不同,apikey 随便写
        .build();

3.4 使用本地向量化模型

如果要做 RAG 智能问答系统,也可以选择部署 Ollama 的向量化模型。例如使用以下指令将 nomic-embed-text 向量化模型拉取到本地:

ollama pull nomic-embed-text

然后在 LangChain4j 中,就可以使用这个本地的向量化模型了:

import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.ollama.OllamaEmbeddingModel;

public class OllamaEmbeddingDemo {
    public static void main(String[] args) {
        EmbeddingModel model = OllamaEmbeddingModel.builder()
                .baseUrl("http://localhost:11434")
                .modelName("nomic-embed-text:latest")
                .build();
        Embedding embedding = model.embed("hello world").content();
        System.out.println(embedding);
        System.out.println(embedding.vector().length);
    }
}

4. Spring AI 调用本地 Ollama 模型

Spring AI 框架同样提供了 Ollama 的扩展。

4.1 引入依赖

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>

4.2 配置文件

在配置文件中增加 Ollama 的相关配置:

spring.ai.ollama.base-url=http://127.0.0.1:11434
spring.ai.ollama.chat.model=llama3.2:1b
spring.ai.ollama.embedding.model=nomic-embed-text:latest

配置完成后,之前演示过的各种 Spring AI 的功能,都可以自行尝试了。

注意:Ollama 只提供了 ChatModel 和 EmbeddingModel 的实现,并没有 ImageModel 实现,所以是无法进行图像生成的。

5. One-API 搭建本地知识库网关

对接多种大模型确实很香,但是各种大模型管理也确实麻烦。这时 One-API 项目就可以登场了。One-API 可以认为是一个本地知识库网关,它提供了一套遵循 OpenAI 标准的统一 API,访问多个不同的大模型产品。

项目地址:https://github.com/songquanpeng/one-api

5.1 Docker 部署

# 并发量小,用 SQLite
docker run --name one-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v /Users/roykingw/docker/one-api:/data justsong/one-api

# 并发量大,用 MySQL,添加 `-e SQL_DSN="root:123456@tcp(localhost:3306)/oneapi"` 指向 MySQL

启动完成后,访问 localhost:3000

5.2 登录与配置

  1. 登录:默认的用户名是 root,密码是 123456。登录后会建议你修改默认密码。
  2. 添加渠道:类型里可以选择默认的一些开源大模型,例如国内的智谱 AI,然后填入自己的密钥。
  3. 配置本地 Ollama 模型:模型中填入在 Ollama 中部署的模型,密钥随便填。如果是用 Docker 部署的 One-API 镜像,而 Ollama 部署在宿主机时,需要注意配置一个可以访问宿主机的代理地址,例如 http://host.docker.internal:11434(Mac 下可以是 http://docker.for.mac.host.internal:11434)。
  4. 生成令牌:生成令牌后,就可以使用 OpenAI 的 API 来调用 One-API 上的大模型了。

5.3 调用示例

public class HelloWorld {
    public static void main(String[] args) {
        ChatLanguageModel model = OpenAiChatModel.builder()
                .modelName("glm-3-turbo") // one-api 中支持的 model
                .baseUrl("http://localhost:3000/v1/") // one-api 访问地址
                .apiKey("sk-xxxxx") // one-api 中分配的令牌
                .build();
        UserMessage userMessage1 = UserMessage.userMessage("你好,你是谁?");
        Response<AiMessage> response1 = model.generate(userMessage1);
        System.out.println(response1.content().text());
    }
}

6. FastGPT 搭建本地知识库

FastGPT 是一个基于 LLM 的知识库问答系统,可以快速将 Ollama 和 One-API 整合成一个 RAG 知识问答系统。

项目地址:https://github.com/labring/FastGPT

6.1 Docker 部署

mkdir fastgpt
cd fastgpt
curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
# pgvector 版本(测试推荐,简单快捷)
curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-pgvector.yml
docker-compose up -d

6.2 配置基础环境

  1. 配置 One-API 渠道和令牌:访问 One-API(默认端口 3001),配置渠道和令牌。
  2. 修改 docker-compose.yml:将 FastGPT 的 CHAT_API_KEY 修改为 One-API 中生成的令牌,然后重启 FastGPT。
  3. 配置模型:在 config.json 文件中配置 FastGPT 会去访问的模型。

大语言模型配置示例

"llmModels": [
    {
      "model": "llama3.2:1b",
      "name": "llama3.2:1b",
      "avatar": "/imgs/model/openai.svg",
      "maxContext": 125000,
      "maxResponse": 16000,
      "quoteMaxToken": 120000,
      "maxTemperature": 1.2,
      "charsPointsPrice": 0,
      "censor": false,
      "vision": true,
      "datasetProcess": true,
      "usedInClassify": true,
      "usedInExtractFields": true,
      "usedInToolCall": true,
      "usedInQueryExtension": true,
      "toolChoice": true,
      "functionCall": false,
      "customCQPrompt": "",
      "customExtractPrompt": "",
      "defaultSystemChatPrompt": "",
      "defaultConfig": {},
      "fieldMap": {}
    }
]

向量化模型配置:向量化模型部分,可以采用 M3E 模型。使用 Docker 直接运行 M3E 镜像:

# CPU 运行
docker run -d --name m3e -p 6008:6008 registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api:latest
# GPU 运行可以加上参数 --gpus

然后在 One-API 中配置一个渠道,访问 M3E 模型。配置完成后,修改 config.json 文件当中的向量化模型:

"vectorModels": [
     {
      "model": "m3e",
      "name": "M3E(测试使用)",
      "price": 0.1,
      "defaultToken": 500,
      "maxToken": 1800
    }
]

配置完成后,重启 FastGPT 的镜像:

docker-compose down
docker-compose up -d

6.3 配置知识库

  1. FastGPT 默认访问端口 3000,默认用户名 root,密码在 docker-compose.yml 中配置。
  2. 选择知识库,新建一个通用知识库,索引模型选择 m3e,文本模型选择 llama3.2:1b
  3. 创建完成后,选择新建,导入手动数据集,上传本地知识库文件。
  4. 上传之后,FastGPT 就会自动完成 RAG 的索引阶段工作,将文本内容进行拆分,转成文本向量后,保存到向量数据库中。

6.4 创建 RAG 应用

进入 FastGPT 的工作台,新建应用,选择知识库 + 对话引导应用。创建完成后,进入应用,选择 AI 模型和关联知识库,就可以用知识库中的内容,跟 AI 进行愉快聊天了。

7. 使用总结

这样,我们通过一些开源项目,快速搭建起了本地的大模型,以及围绕大模型的一些简单应用。在这个过程中,应该要重点去学习的是这些开源项目将大模型一步步落地,构建应用的思想和方法。

例如,One-API 中对渠道和资源的管控方式,基本都是模拟的一些开源大模型产品的管控方式。熟悉这些规则,是我们真正开发企业级大模型应用时必须要了解的。在此基础上,我们才能知道如何控制大模型应用的成本。

另外,FastGPT 中还提供了工作流,这也是结合大模型的一种使用经验。这些工作流并不难理解,例如 FastGPT 中一个默认的工作流就是先判断用户的问题和产品是否相关,不相关直接拒绝,相关问题再去调用大模型。

这些问题,并不一定都需要大模型来解决。例如判断问题是否和产品相关,这是个典型的二分类问题,一些简单的机器学习算法就足够应对。但是,通过良好的提示词工程,就可以结合 AI 大模型设计出更完善的业务流程。如何把传统工具和 AI 大模型串联起来,这或许是后面很长一段时间内,业界探索的主要问题。

还有,从这个过程中可以看到,对于大模型的调优,其实最重要的就是优化提示词。这是一个需要反复打磨的经验。对于普通人来说,或许只能通过不断吸收自己或者别人的试错经验慢慢调整。但是对于程序员来说,各种框架当中组装优化的提示词,是对这些试错经验的更高级总结。

Logo

免费领 200 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐