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:1bOllama 会帮我们去下载模型到本地并运行。第一次拉取大模型过程会比较长喝杯咖啡吧。注意本地运行大模型对机器配置要求会高一点。Llama 模型并没有针对中文进行重点训练因此对中文的理解没有那么好。3. LangChain4j 调用本地 Ollama 模型LangChain4j 是一个 Java 版本的 LangChain 框架可以方便地集成各种大模型。3.1 引入依赖首先需要引入 LangChain4j 对 Ollama 的支持依赖dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-ollama/artifactIdversion${langchain4j.version}/version/dependency3.2 编写调用代码接下来就可以使用 Ollama 的实现类快速调用本地部署的大模型importdev.langchain4j.model.chat.ChatLanguageModel;importdev.langchain4j.model.ollama.OllamaChatModel;publicclassOllamaDemo{publicstaticvoidmain(String[]args){ChatLanguageModelmodelOllamaChatModel.builder().baseUrl(http://localhost:11434/).modelName(llama3.2:1b).build();System.out.println(model.generate(你好你是谁可以帮我解决什么问题));}}3.3 使用 OpenAI 兼容 APIOllama 也兼容了 OpenAI 的 API所以也可以直接使用OpenAiChatModelChatLanguageModelmodelOpenAiChatModel.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 中就可以使用这个本地的向量化模型了importdev.langchain4j.data.embedding.Embedding;importdev.langchain4j.model.embedding.EmbeddingModel;importdev.langchain4j.model.ollama.OllamaEmbeddingModel;publicclassOllamaEmbeddingDemo{publicstaticvoidmain(String[]args){EmbeddingModelmodelOllamaEmbeddingModel.builder().baseUrl(http://localhost:11434).modelName(nomic-embed-text:latest).build();Embeddingembeddingmodel.embed(hello world).content();System.out.println(embedding);System.out.println(embedding.vector().length);}}4. Spring AI 调用本地 Ollama 模型Spring AI 框架同样提供了 Ollama 的扩展。4.1 引入依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-ollama-spring-boot-starter/artifactId/dependency4.2 配置文件在配置文件中增加 Ollama 的相关配置spring.ai.ollama.base-urlhttp://127.0.0.1:11434 spring.ai.ollama.chat.modelllama3.2:1b spring.ai.ollama.embedding.modelnomic-embed-text:latest配置完成后之前演示过的各种 Spring AI 的功能都可以自行尝试了。注意Ollama 只提供了 ChatModel 和 EmbeddingModel 的实现并没有 ImageModel 实现所以是无法进行图像生成的。5. One-API 搭建本地知识库网关对接多种大模型确实很香但是各种大模型管理也确实麻烦。这时 One-API 项目就可以登场了。One-API 可以认为是一个本地知识库网关它提供了一套遵循 OpenAI 标准的统一 API访问多个不同的大模型产品。项目地址https://github.com/songquanpeng/one-api5.1 Docker 部署# 并发量小用 SQLitedockerrun--nameone-api-d--restartalways-p3000:3000-eTZAsia/Shanghai-v/Users/roykingw/docker/one-api:/data justsong/one-api# 并发量大用 MySQL添加 -e SQL_DSNroot:123456tcp(localhost:3306)/oneapi 指向 MySQL启动完成后访问localhost:3000。5.2 登录与配置登录默认的用户名是root密码是123456。登录后会建议你修改默认密码。添加渠道类型里可以选择默认的一些开源大模型例如国内的智谱 AI然后填入自己的密钥。配置本地 Ollama 模型模型中填入在 Ollama 中部署的模型密钥随便填。如果是用 Docker 部署的 One-API 镜像而 Ollama 部署在宿主机时需要注意配置一个可以访问宿主机的代理地址例如http://host.docker.internal:11434Mac 下可以是http://docker.for.mac.host.internal:11434。生成令牌生成令牌后就可以使用 OpenAI 的 API 来调用 One-API 上的大模型了。5.3 调用示例publicclassHelloWorld{publicstaticvoidmain(String[]args){ChatLanguageModelmodelOpenAiChatModel.builder().modelName(glm-3-turbo)// one-api 中支持的 model.baseUrl(http://localhost:3000/v1/)// one-api 访问地址.apiKey(sk-xxxxx)// one-api 中分配的令牌.build();UserMessageuserMessage1UserMessage.userMessage(你好你是谁);ResponseAiMessageresponse1model.generate(userMessage1);System.out.println(response1.content().text());}}6. FastGPT 搭建本地知识库FastGPT 是一个基于 LLM 的知识库问答系统可以快速将 Ollama 和 One-API 整合成一个 RAG 知识问答系统。项目地址https://github.com/labring/FastGPT6.1 Docker 部署mkdirfastgptcdfastgptcurl-Ohttps://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json# pgvector 版本测试推荐简单快捷curl-odocker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-pgvector.ymldocker-composeup-d6.2 配置基础环境配置 One-API 渠道和令牌访问 One-API默认端口 3001配置渠道和令牌。修改 docker-compose.yml将 FastGPT 的CHAT_API_KEY修改为 One-API 中生成的令牌然后重启 FastGPT。配置模型在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 运行dockerrun-d--namem3e-p6008: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-composedowndocker-composeup-d6.3 配置知识库FastGPT 默认访问端口 3000默认用户名root密码在docker-compose.yml中配置。选择知识库新建一个通用知识库索引模型选择m3e文本模型选择llama3.2:1b。创建完成后选择新建导入手动数据集上传本地知识库文件。上传之后FastGPT 就会自动完成 RAG 的索引阶段工作将文本内容进行拆分转成文本向量后保存到向量数据库中。6.4 创建 RAG 应用进入 FastGPT 的工作台新建应用选择知识库 对话引导应用。创建完成后进入应用选择 AI 模型和关联知识库就可以用知识库中的内容跟 AI 进行愉快聊天了。7. 使用总结这样我们通过一些开源项目快速搭建起了本地的大模型以及围绕大模型的一些简单应用。在这个过程中应该要重点去学习的是这些开源项目将大模型一步步落地构建应用的思想和方法。例如One-API 中对渠道和资源的管控方式基本都是模拟的一些开源大模型产品的管控方式。熟悉这些规则是我们真正开发企业级大模型应用时必须要了解的。在此基础上我们才能知道如何控制大模型应用的成本。另外FastGPT 中还提供了工作流这也是结合大模型的一种使用经验。这些工作流并不难理解例如 FastGPT 中一个默认的工作流就是先判断用户的问题和产品是否相关不相关直接拒绝相关问题再去调用大模型。这些问题并不一定都需要大模型来解决。例如判断问题是否和产品相关这是个典型的二分类问题一些简单的机器学习算法就足够应对。但是通过良好的提示词工程就可以结合 AI 大模型设计出更完善的业务流程。如何把传统工具和 AI 大模型串联起来这或许是后面很长一段时间内业界探索的主要问题。还有从这个过程中可以看到对于大模型的调优其实最重要的就是优化提示词。这是一个需要反复打磨的经验。对于普通人来说或许只能通过不断吸收自己或者别人的试错经验慢慢调整。但是对于程序员来说各种框架当中组装优化的提示词是对这些试错经验的更高级总结。
Sping AI 使用 Ollama 快速搭建本地知识库
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:1bOllama 会帮我们去下载模型到本地并运行。第一次拉取大模型过程会比较长喝杯咖啡吧。注意本地运行大模型对机器配置要求会高一点。Llama 模型并没有针对中文进行重点训练因此对中文的理解没有那么好。3. LangChain4j 调用本地 Ollama 模型LangChain4j 是一个 Java 版本的 LangChain 框架可以方便地集成各种大模型。3.1 引入依赖首先需要引入 LangChain4j 对 Ollama 的支持依赖dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-ollama/artifactIdversion${langchain4j.version}/version/dependency3.2 编写调用代码接下来就可以使用 Ollama 的实现类快速调用本地部署的大模型importdev.langchain4j.model.chat.ChatLanguageModel;importdev.langchain4j.model.ollama.OllamaChatModel;publicclassOllamaDemo{publicstaticvoidmain(String[]args){ChatLanguageModelmodelOllamaChatModel.builder().baseUrl(http://localhost:11434/).modelName(llama3.2:1b).build();System.out.println(model.generate(你好你是谁可以帮我解决什么问题));}}3.3 使用 OpenAI 兼容 APIOllama 也兼容了 OpenAI 的 API所以也可以直接使用OpenAiChatModelChatLanguageModelmodelOpenAiChatModel.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 中就可以使用这个本地的向量化模型了importdev.langchain4j.data.embedding.Embedding;importdev.langchain4j.model.embedding.EmbeddingModel;importdev.langchain4j.model.ollama.OllamaEmbeddingModel;publicclassOllamaEmbeddingDemo{publicstaticvoidmain(String[]args){EmbeddingModelmodelOllamaEmbeddingModel.builder().baseUrl(http://localhost:11434).modelName(nomic-embed-text:latest).build();Embeddingembeddingmodel.embed(hello world).content();System.out.println(embedding);System.out.println(embedding.vector().length);}}4. Spring AI 调用本地 Ollama 模型Spring AI 框架同样提供了 Ollama 的扩展。4.1 引入依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-ollama-spring-boot-starter/artifactId/dependency4.2 配置文件在配置文件中增加 Ollama 的相关配置spring.ai.ollama.base-urlhttp://127.0.0.1:11434 spring.ai.ollama.chat.modelllama3.2:1b spring.ai.ollama.embedding.modelnomic-embed-text:latest配置完成后之前演示过的各种 Spring AI 的功能都可以自行尝试了。注意Ollama 只提供了 ChatModel 和 EmbeddingModel 的实现并没有 ImageModel 实现所以是无法进行图像生成的。5. One-API 搭建本地知识库网关对接多种大模型确实很香但是各种大模型管理也确实麻烦。这时 One-API 项目就可以登场了。One-API 可以认为是一个本地知识库网关它提供了一套遵循 OpenAI 标准的统一 API访问多个不同的大模型产品。项目地址https://github.com/songquanpeng/one-api5.1 Docker 部署# 并发量小用 SQLitedockerrun--nameone-api-d--restartalways-p3000:3000-eTZAsia/Shanghai-v/Users/roykingw/docker/one-api:/data justsong/one-api# 并发量大用 MySQL添加 -e SQL_DSNroot:123456tcp(localhost:3306)/oneapi 指向 MySQL启动完成后访问localhost:3000。5.2 登录与配置登录默认的用户名是root密码是123456。登录后会建议你修改默认密码。添加渠道类型里可以选择默认的一些开源大模型例如国内的智谱 AI然后填入自己的密钥。配置本地 Ollama 模型模型中填入在 Ollama 中部署的模型密钥随便填。如果是用 Docker 部署的 One-API 镜像而 Ollama 部署在宿主机时需要注意配置一个可以访问宿主机的代理地址例如http://host.docker.internal:11434Mac 下可以是http://docker.for.mac.host.internal:11434。生成令牌生成令牌后就可以使用 OpenAI 的 API 来调用 One-API 上的大模型了。5.3 调用示例publicclassHelloWorld{publicstaticvoidmain(String[]args){ChatLanguageModelmodelOpenAiChatModel.builder().modelName(glm-3-turbo)// one-api 中支持的 model.baseUrl(http://localhost:3000/v1/)// one-api 访问地址.apiKey(sk-xxxxx)// one-api 中分配的令牌.build();UserMessageuserMessage1UserMessage.userMessage(你好你是谁);ResponseAiMessageresponse1model.generate(userMessage1);System.out.println(response1.content().text());}}6. FastGPT 搭建本地知识库FastGPT 是一个基于 LLM 的知识库问答系统可以快速将 Ollama 和 One-API 整合成一个 RAG 知识问答系统。项目地址https://github.com/labring/FastGPT6.1 Docker 部署mkdirfastgptcdfastgptcurl-Ohttps://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json# pgvector 版本测试推荐简单快捷curl-odocker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-pgvector.ymldocker-composeup-d6.2 配置基础环境配置 One-API 渠道和令牌访问 One-API默认端口 3001配置渠道和令牌。修改 docker-compose.yml将 FastGPT 的CHAT_API_KEY修改为 One-API 中生成的令牌然后重启 FastGPT。配置模型在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 运行dockerrun-d--namem3e-p6008: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-composedowndocker-composeup-d6.3 配置知识库FastGPT 默认访问端口 3000默认用户名root密码在docker-compose.yml中配置。选择知识库新建一个通用知识库索引模型选择m3e文本模型选择llama3.2:1b。创建完成后选择新建导入手动数据集上传本地知识库文件。上传之后FastGPT 就会自动完成 RAG 的索引阶段工作将文本内容进行拆分转成文本向量后保存到向量数据库中。6.4 创建 RAG 应用进入 FastGPT 的工作台新建应用选择知识库 对话引导应用。创建完成后进入应用选择 AI 模型和关联知识库就可以用知识库中的内容跟 AI 进行愉快聊天了。7. 使用总结这样我们通过一些开源项目快速搭建起了本地的大模型以及围绕大模型的一些简单应用。在这个过程中应该要重点去学习的是这些开源项目将大模型一步步落地构建应用的思想和方法。例如One-API 中对渠道和资源的管控方式基本都是模拟的一些开源大模型产品的管控方式。熟悉这些规则是我们真正开发企业级大模型应用时必须要了解的。在此基础上我们才能知道如何控制大模型应用的成本。另外FastGPT 中还提供了工作流这也是结合大模型的一种使用经验。这些工作流并不难理解例如 FastGPT 中一个默认的工作流就是先判断用户的问题和产品是否相关不相关直接拒绝相关问题再去调用大模型。这些问题并不一定都需要大模型来解决。例如判断问题是否和产品相关这是个典型的二分类问题一些简单的机器学习算法就足够应对。但是通过良好的提示词工程就可以结合 AI 大模型设计出更完善的业务流程。如何把传统工具和 AI 大模型串联起来这或许是后面很长一段时间内业界探索的主要问题。还有从这个过程中可以看到对于大模型的调优其实最重要的就是优化提示词。这是一个需要反复打磨的经验。对于普通人来说或许只能通过不断吸收自己或者别人的试错经验慢慢调整。但是对于程序员来说各种框架当中组装优化的提示词是对这些试错经验的更高级总结。