艾莉丝努力练剑头像
关注
【AI大模型接入SDK】Ollama大模型接入架构对比与实现封面图

【AI大模型接入SDK】Ollama大模型接入架构对比与实现


头像


🎬 个人主页艾莉丝努力练剑

专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平

🎬 艾莉丝的简介:

在这里插入图片描述



在这里插入图片描述


1 ~> 大模型接入架构对比

1.1 远程接入 DeepSeek 架构

1.1.1 架构组成

  • 本地端:自研 LLMManager 模块,封装请求发送逻辑
  • 传输层:公网网络链路
  • 服务端:DeepSeek 官方服务器,包含 deepseekServer 网关与大模型推理引擎

1.1.2 调用流程

  1. 本地 LLMManager 构造推理请求
  2. 请求通过公网发送至 DeepSeek 官方服务器
  3. deepseekServer 解析请求,转发至对应大模型
  4. 大模型执行推理计算,生成响应内容
  5. 响应沿原路返回至本地 LLMManager

1.1.3 核心特征

  • 依赖公网传输,存在网络延迟与带宽开销
  • 需要 API 密钥进行身份鉴权
  • 模型算力与运维由第三方厂商承担

1.2 Ollama 本地接入架构

1.2.1 前置依赖

  • 本地安装 Ollama 工具,启动 OllamaServer 后台服务
  • 通过ollama pull命令从 Ollama 官方模型仓库下载目标模型(如 deepseek-r1:1.5b)到本地

1.2.2 架构组成

  • 本地端:自研 LLMManager 客户端模块
  • 中间层:本地 OllamaServer 服务,负责模型管理、请求转发、生命周期管控
  • 模型层:本地存储的大模型文件,按需加载到内存

1.2.3 部署形态

  • 单机本地部署:OllamaServer 运行在本机,全程通过本地环路通信,无网络开销
  • 局域网部署:OllamaServer 部署在局域网服务器,内网内多终端共享调用
  • 私有云部署:OllamaServer 部署在企业自有云服务器,通过私有网络访问

1.2.4 核心特征

  • 无需 API 密钥鉴权,通过 HTTP 接口与 OllamaServer 交互
  • 用户不直接对接大模型,所有交互由 OllamaServer 代理
  • 模型数据与推理全链路可控,适合数据敏感场景

1.3 两种接入模式核心差异

  • 部署位置:远程接入依赖第三方官方服务器;Ollama 接入可部署在本机、局域网、私有云
  • 鉴权方式:远程接入必须使用 API 密钥;Ollama 本地接入默认无鉴权,可通过网络配置控制访问
  • 网络依赖:远程接入必须依赖公网;Ollama 单机部署无网络依赖
  • 模型管理:远程接入模型由厂商管理;Ollama 接入可自主选择、管理模型版本

2 ~> Ollama 核心运行原理与模型生命周期

2.1 首次请求(冷启动)流程

  1. LLMManager 向 OllamaServer 发送 HTTP 推理请求,请求中携带目标模型名称
  2. OllamaServer 解析请求参数,提取模型名称
  3. 校验模型文件是否存在,若模型未加载到内存,则执行模型加载操作
  4. OllamaServer 将完整请求参数转发给已加载的大模型
  5. 大模型执行推理计算,生成响应结果
  6. OllamaServer 接收结果并返回给 LLMManager

2.2 二次请求(热加载)流程

  1. 若模型处于内存存活期内,OllamaServer 直接将请求转发给已加载的模型
  2. 跳过模型加载步骤,大幅降低响应延迟
  3. 每次请求会重置模型的存活计时器

2.3 模型内存生命周期机制

  • 默认存活时长:5 分钟(5m)
  • 超时策略:超过存活时长无请求,模型自动从内存卸载,释放硬件资源
  • 可配置性:通过环境变量自定义存活时长,支持永久存活、请求后立即卸载等策略

3 ~> Ollama 核心环境变量配置

3.1 配置总览

Ollama 通过系统环境变量控制服务行为、模型管理、并发策略等核心特性,所有配置均在服务启动时生效。

3.2 详细配置项

环境变量名功能说明默认值配置建议
OLLAMA_MODELS模型文件的本地存储目录Windows:%USERPROFILE%.ollama\models建议迁移至非系统盘,避免占用系统盘空间,如D:\ApplyTool\ProgramTool\ollama\models
OLLAMA_HOSTOllama 服务监听的网络地址127.0.0.1仅本地访问保持默认;需局域网 / 内网访问时设置为0.0.0.0
OLLAMA_PORTOllama 服务监听的 TCP 端口11434端口冲突时可修改为其他可用端口,如 8080
OLLAMA_ORIGINS允许的 HTTP 请求来源,多个来源用半角逗号分隔无限制本地开发场景可设置为*;生产环境建议配置明确的域名 / IP 白名单
OLLAMA_KEEP_ALIVE模型加载到内存后的存活时长5m(5 分钟)高频调用场景建议设置为24h;设为0表示单次请求结束后立即卸载;设为负数表示模型永久驻留内存
OLLAMA_NUM_PARALLEL同时处理的并发请求数量1(串行处理)根据 CPU/GPU 算力与业务并发需求调整,避免并发过高导致推理性能下降
OLLAMA_MAX_QUEUE请求等待队列的最大长度512根据业务峰值并发量调整,超出队列长度的请求将被直接丢弃
OLLAMA_DEBUGDebug 详细日志输出开关关闭(0)开发调试与问题排查阶段设置为1,输出详细运行日志
OLLAMA_MAX_LOADED_MODELS同时加载到内存中的最大模型数量1根据显存 / 内存容量与多模型业务场景调整

4 ~> OllamaLLMProvider 类设计与初始化实现

4.1 类设计思路

4.1.1 继承关系

继承自基类LLMProvider,遵循统一的大模型接入抽象接口,实现 Ollama 平台的具体接入逻辑。

4.1.2 核心成员变量

  • _modelName:目标模型的名称标识,与 Ollama 模型名一致
  • _modelDesc:模型的文本描述信息,用于上层展示
  • _endpoint:Ollama 服务的 HTTP 接口根地址
  • _isAvailable:模型初始化状态与可用性标记

4.1.3 设计原则

配置与代码解耦:所有模型相关参数通过外部配置文件传入,切换模型仅需修改配置,无需改动业务代码。

4.2 头文件定义(OllamaLLMProvider.h)

#ifndef OLLAMA_LLM_PROVIDER_H
#define OLLAMA_LLM_PROVIDER_H

#include "LLMProvider.h"
#include <string>
#include <map>
#include <vector>
#include <functional>

namespace ai_chat_sdk {

class OllamaLLMProvider : public LLMProvider {
public:
    // 初始化模型
    virtual bool initModel(const std::map<std::string, std::string>& modelConfig) override;

    // 检测模型是否可用
    virtual bool isAvailable() const override;

    // 获取模型名称
    virtual std::string getModelName() const override;

    // 获取模型描述
    virtual std::string getModelDesc() const override;

    // 发送消息 - 全量同步返回
    virtual std::string sendMessage(const std::vector<std::string>& messages,
                                    const std::map<std::string, std::string>& requestParam) override;

    // 发送消息 - 流式增量返回
    virtual std::string sendMessageStream(const std::vector<std::string>& messages,
                                          const std::map<std::string, std::string>& requestParam,
                                          std::function<void(const std::string&, bool)> callback) override;

protected:
    std::string _modelName;   // 模型名称
    std::string _modelDesc;   // 模型描述
    std::string _endpoint;    // Ollama服务端点地址
    bool _isAvailable = false;// 模型可用性标记
};

} // namespace ai_chat_sdk

#endif // OLLAMA_LLM_PROVIDER_H

4.3 初始化函数实现(OllamaLLMProvider.cpp)

4.3.1 初始化执行步骤

  1. 校验配置中是否存在model_name字段,缺失则打印错误日志并返回失败
  2. 读取model_name赋值给成员变量_modelName
  3. 校验配置中是否存在model_desc字段,缺失则打印错误日志并返回失败
  4. 读取model_desc赋值给成员变量_modelDesc
  5. 校验配置中是否存在endpoint字段,缺失则打印错误日志并返回失败
  6. 读取endpoint赋值给成员变量_endpoint
  7. 标记_isAvailable为 true,返回初始化成功

4.3.2 实现代码

#include "../include/OllamaLLMProvider.h"
#include "../include/util/myLog.h"

namespace ai_chat_sdk {

bool OllamaLLMProvider::initModel(const std::map<std::string, std::string>& modelConfig) {
    // 1. 初始化模型名称
    if (modelConfig.find("model_name") == modelConfig.end()) {
        ERR("OllamaLLMProvider::initModel: model_name is not found in modelConfig");
        return false;
    }
    _modelName = modelConfig.at("model_name");

    // 2. 初始化模型描述
    if (modelConfig.find("model_desc") == modelConfig.end()) {
        ERR("OllamaLLMProvider::initModel: model_desc is not found in modelConfig");
        return false;
    }
    _modelDesc = modelConfig.at("model_desc");

    // 3. 初始化服务端点
    if (modelConfig.find("endpoint") == modelConfig.end()) {
        ERR("OllamaLLMProvider::initModel: endpoint is not found in modelConfig");
        return false;
    }
    _endpoint = modelConfig.at("endpoint");

    // 4. 标记模型可用
    _isAvailable = true;
    return true;
}

bool OllamaLLMProvider::isAvailable() const {
    return _isAvailable;
}

std::string OllamaLLMProvider::getModelName() const {
    return _modelName;
}

std::string OllamaLLMProvider::getModelDesc() const {
    return _modelDesc;
}

// 全量消息接口占位实现
std::string OllamaLLMProvider::sendMessage(const std::vector<std::string>& messages,
                                           const std::map<std::string, std::string>& requestParam) {
    // TODO 实现Ollama HTTP全量请求逻辑
    return "";
}

// 流式消息接口占位实现
std::string OllamaLLMProvider::sendMessageStream(const std::vector<std::string>& messages,
                                                 const std::map<std::string, std::string>& requestParam,
                                                 std::function<void(const std::string&, bool)> callback) {
    // TODO 实现Ollama HTTP流式请求逻辑
    return "";
}

} // namespace ai_chat_sdk

5 ~> 消息交互接口规范

5.1 全量响应接口

  • 接口形式:同步调用
  • 返回值:完整的模型推理结果字符串
  • 适用场景:短文本推理、对实时性要求不高的场景

5.2 流式响应接口

  • 接口形式:异步回调模式
  • 回调参数:
    • 第一个参数:当前增量返回的文本片段
    • 第二个参数:bool 类型,标记是否为最后一段响应(结束标识)
  • 适用场景:长文本生成、对话类场景,提升用户体验

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

艾莉丝努力练剑

C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主


👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。
❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。
【收藏】 把核心知识点存好,在需要时随时查、随时用。
💬 【评论】 分享你的经验或疑问,评论区一起交流避坑!

不要忘记给博主“一键四连”哦!

“今日练剑达成!”
文章配图

“技术之路难免有困惑,但同行的人会让前进更有方向。”

结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

往期回顾

【AI大模型接入SDK】Ollama跨平台部署与运维指南

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡
૮₍ ˶ ˊ ᴥ ˋ˶₎ა

在这里插入图片描述

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2401_89899187/article/details/164824439

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--