【AI大模型接入SDK】Provider分析与实现

发布时间:2026/10/27 12:02:58

【AI大模型接入SDK】Provider分析与实现 个人主页艾莉丝努力练剑❄专栏传送门《C语言》《数据结构与算法》《C/C干货分享学习过程记录》《Linux操作系统编程详解》《笔试/面试常见算法从基础到进阶》《Python干货分享》⭐️为天地立心为生民立命为往圣继绝学为万世开太平 艾莉丝的简介文章目录1 ~ LLMProvider1.1 业务背景与需求分析1.1.1 业务场景1.1.2 模型调用原始操作步骤1.1.3 Provider 必须实现的能力集合1.1.4 共性与差异分析1.2 C 继承、多态与抽象类设计1.2.1 问题直接硬编码各个模型类的弊端1.2.2 解决方案抽取顶层抽象基类 LLMProvider1.2.3 C 多态调用1.3 底层设计模式策略模式1.3.1 策略模式核心定义1.3.2 通俗示例代码出行策略1.3.3 映射到本项目1.4 LLMProvider 抽象基类完整头文件实现1.5 派生实现类工作逻辑例如 DeepSeekProvider1.6 整体架构分层总览1.7 架构优势总结1.8 面试 / 考试易错考点结尾1 ~ LLMProvider基于 C 策略模式实现多大模型统一接入 SDK。1.1 业务背景与需求分析1.1.1 业务场景需要接入多款大模型DeepSeek、ChatGPT、Gemini、Ollama 本地模型等对外提供统一 SDK上层业务不需要感知底层模型厂商 API 差异。 前期已完成公共数据结构、日志库封装现在完成模型接入层架构设计。1.1.2 模型调用原始操作步骤获取模型厂商 API‑Key阅读厂商 HTTP API 文档程序内部发起 HTTP 请求调用模型接口1.1.3 Provider 必须实现的能力集合每一个模型接入实现类都必须具备以下功能模型初始化加载配置apikey、endpoint 等初始化状态检测判断模型是否配置合法、可用非流式消息发送streamfalse全量一次性返回完整应答流式消息发送streamtrue增量分片返回流式回调输出获取模型名称获取模型描述信息使用场景前端页面展示可用模型列表展示每个模型名称、简介、能力标签。1.1.4 共性与差异分析公共部分初始化、可用性检测、发送消息接口定义、持有 apikey/endpoint/ 可用状态标记差异部分每个模型的 base‑url (endpoint) 不同模型名称、描述文本不同HTTP 请求体参数结构不同HTTP 响应 JSON 解析逻辑不同1.2 C 继承、多态与抽象类设计1.2.1 问题直接硬编码各个模型类的弊端如果每个模型独立写一套完整类会出现大量重复代码业务层调用需要大量if‑else分支判断模型类型// 糟糕的if‑else写法 if(modelName deepseek) { DeepSeekProvider dp; dp.sendMessage(...); } else if(modelName chatgpt) { ChatGPTProvider gp; gp.sendMessage(...); } // 新增模型必须修改此处业务判断代码违反开闭原则1.2.2 解决方案抽取顶层抽象基类LLMProvider将所有模型公共接口抽至顶层基类将接口声明为纯虚函数virtual 函数签名 0;使LLMProvider成为抽象类。抽象类禁止实例化基类不绑定任何具体大模型实例化无业务意义只定义接口规范由子类完成全部业务实现。各个厂商模型实现类继承该抽象基类重写全部纯虚函数。继承关系基类LLMProvider抽象类 / 接口类只定义契约派生实现类DeepSeekProvider/ChatGPTProvider/GeminiProvider/OllamaDeepSeekProvider1.2.3 C 多态调用基类引用 / 基类指针可以指向派生类对象。业务函数只依赖抽象基类运行时传入不同子类对象自动调用对应子类实现消除大量 if‑else。// 业务层统一发送消息函数只依赖抽象基类 void SendMessage(LLMProvider provider) { // 根据传入对象的实际类型自动调用子类重写的sendMessage provider.sendMessage(...); }1.3 底层设计模式策略模式1.3.1 策略模式核心定义定义一系列算法 / 行为将每一套行为封装为独立类各个实现类可以互相替换通过抽象接口隔离调用方与具体实现运行时动态选择策略消除 if‑else 分支符合开闭原则。抽象策略抽象基类定义统一接口具体策略各个派生子类实现具体逻辑上下文业务调用方只操作抽象策略不感知底层实现1.3.2 通俗示例代码出行策略#include iostream // 抽象策略 class TransportStrategy{ public: virtual void go() 0; }; // 具体策略走路 class WalkStrategy : public TransportStrategy{ public: void go() override{ std::cout 走路去往目的地\n; } }; // 具体策略自行车 class BikeStrategy : public TransportStrategy{ public: void go() override{ std::cout 骑自行车去往目的地\n; } }; // 具体策略巴士 class BusStrategy : public TransportStrategy{ public: void go() override{ std::cout 坐巴士去往目的地\n; } }; // 上下文使用者 class Student{ private: TransportStrategy* m_strategy; public: void setStrategy(TransportStrategy* s){ m_strategy s; } void goToLab(){ m_strategy-go(); } }; int main() { Student me; me.setStrategy(new WalkStrategy()); me.goToLab(); me.setStrategy(new BusStrategy()); me.goToLab(); return 0; }1.3.3 映射到本项目抽象策略LLMProvider抽象基类定义所有模型必须实现的接口契约具体策略DeepSeekProvider、ChatGPTProvider等每一个模型实现类上下文SDK 上层、LLMManager管理器只和抽象基类交互运行时切换不同模型策略开闭原则新增模型只需要新增派生类不需要修改原有上层业务代码1.4 LLMProvider 抽象基类完整头文件实现文件路径sdk/include/LLMProvider.h#ifndef LLM_PROVIDER_H #define LLM_PROVIDER_H #include string #include map #include vector #include functional namespace ai_chat_sdk { // 消息结构体对话历史单元前置公共数据结构 struct Message{ std::string role; std::string content; }; /** * brief LLMProvider 大模型抽象基类(抽象接口) * 所有大模型接入都继承该类实现全部纯虚函数 * 不允许实例化定义统一的模型访问契约 */ class LLMProvider { public: // 虚析构多态继承场景必须提供虚析构保证子类析构被正确调用 virtual ~LLMProvider() default; /** * brief 初始化模型传入模型配置键值对 * param modelConfig key‑value配置apikey、endpoint等 */ virtual void initModel(const std::mapstd::string, std::string modelConfig) 0; /** * brief 检测模型是否初始化完成、可用 * return true可用false不可用 */ virtual bool isAvailable() const 0; /// brief 获取模型名称 virtual std::string getModelName() const 0; /// brief 获取模型描述信息 virtual std::string getModelDesc() const 0; /** * brief 发送消息非流式全量一次性返回结果 * param messages 完整对话上下文 * param requestParam 模型请求参数 temperature/max_tokens等 */ virtual void sendMessage(const std::vectorMessage messages, const std::mapstd::string, std::string requestParam) 0; /** * brief 发送消息流式增量返回 * param messages 对话上下文 * param requestParam 请求参数 * param callback 回调函数参数1分片字符串参数2是否为最后一块数据 * bool参数true代表还有后续分片false代表流式结束 */ virtual void sendMessageStream(const std::vectorMessage messages, const std::mapstd::string, std::string requestParam, std::functionvoid(const std::string, bool) callback) 0; protected: // 基类保护成员派生类可以直接访问 bool m_isAvailable false; /// 标记模型是否初始化可用 std::string m_apiKey; /// 模型厂商API密钥 std::string m_endpoint; /// API base‑url请求端点 }; } // namespace ai_chat_sdk #endif关键修正点说明增加虚析构函数virtual ~LLMProvider() default;多态继承场景必不可少防止子类析构不执行内存泄漏将成员变量修改为protected子类可以直接访问原文档写 private 子类无法读取配置修正原文档多处拼写笔误initodel → initModel、getodelDesc → getModelDesc回调std::function参数 const 引用避免不必要拷贝补充头文件保护宏#ifndef / #define / #endif。1.5 派生实现类工作逻辑例如 DeepSeekProviderDeepSeekProvider : public LLMProvider ├─ initModel从map读取apikey、endpoint赋值给继承而来的m_apiKey/m_endpoint设置m_isAvailable状态 ├─ isAvailable返回 m_isAvailable ├─ getModelName返回固定字符串 deepseek‑chat ├─ getModelDesc返回该模型的描述文本 ├─ sendMessage组装DeepSeek HTTP请求体发起HTTP调用解析完整JSON响应 └─ sendMessageStream组装请求开启stream读取SSE流式响应分片调用callback回调1.6 整体架构分层总览┌─────────────── LLMManager管理器───────────────┐ │ 业务层只操作抽象基类LLMProvider不感知具体模型 │ └───────────────────────┬──────────────────────────┘ ↓ ┌────────── LLMProvider(抽象基类) ──────────┐ │ 纯虚接口定义initModel / sendMessage / ...│ └───┬───────────────┬───────────────┬──────┘ ↓ ↓ ↓ DeepSeekProvider ChatGPTProvider GeminiProvider 实现厂商HTTP交互细节封装API差异1.7 架构优势总结消除大量 if‑else依靠 C 多态策略模式运行时动态切换模型实现。开闭原则新增大模型只需要新增继承LLMProvider的派生类原有上层代码不需要修改。统一 SDK 对外接口第三方使用者只需要依赖抽象接口不需要关心每家模型 HTTP 细节。接口强制约束抽象类纯虚函数强制派生类必须实现全部规定能力不会出现遗漏功能。兼容云端 API 模型、本地 Ollama 部署模型同一套框架复用。1.8 面试 / 考试易错考点抽象类含有纯虚函数不能实例化对象多态继承必须写虚析构函数否则 delete 基类指针时子类析构不会执行纯虚函数语法virtual 返回类型 函数名(参数) 0;策略模式核心封装可变行为运行时替换隔离调用方与具体实现protected 访问限定符基类成员希望子类可以访问、外部不能访问时使用不能设置为 private。结尾uu们本文的内容到这里就全部结束了艾莉丝在这里再次感谢您的阅读艾莉丝努力练剑C/C Linux 底层探索者 | 一个正在努力练剑的技术博主【关注】跟随我一起深耕技术领域见证每一次成长。❤️【点赞】让优质内容被更多人看见让知识传递更有力量。⭐【收藏】把核心知识点存好在需要时随时查、随时用。【评论】分享你的经验或疑问评论区一起交流避坑不要忘记给博主“一键四连”哦“今日练剑达成”“技术之路难免有困惑但同行的人会让前进更有方向。”结语希望对学习Linux相关内容的uu有所帮助不要忘记给博主“一键四连”哦往期回顾【AI大模型接入SDK】spdlog日志库封装博主在这里放了一只小狗大家看完了摸摸小狗放松一下吧૮₍ ˶ ˊ ᴥ ˋ˶₎ა
延伸阅读

更多相关文章

2026/10/27 11:38:34

XAMPP 与 HBuilder X 搭建 PHP 开发环境:从零到 Hello World

PHP简介 PHP 是一款开源的服务器端脚本语言,专为 Web 开发而生,可嵌入 HTML 快速实现动态网页功能。 当前全球超七成网站仍由 PHP 驱动,凭借 WordPress 等 CMS 系统占据庞大存量市场,是中小建站、电商场景的主流选择CSDN。 随着 P…

2026/10/26 5:28:35

制造业eHR系统怎么解决复杂人力管理?汇通软件的产品、实施与案例

对于多工厂、多班次、复杂工时和薪资规则并存的制造企业,选择eHR系统时,真正需要判断的不是“模块够不够多”,而是系统能否把组织、人事、排班、考勤、工时、薪资以及MES、ERP、OA等外围系统连接起来,并且能够完成长期实施与运维。…

2026/10/24 6:52:04

9,000张真菌感染图像分类数据集:设计与训练实践

简介:本资源是面向医学图像分析与计算机视觉初学者的真菌感染微生物图像分类数据集,适用于深度学习图像分类模型训练与验证。数据集共约9000张已标注图像,涵盖5类真菌感染样本,标签信息完整存储于JSON文件中,训练集与测…

2026/10/27 12:00:54

AI Agent缓存设计实战:Redis四类状态管理与一致性保障

1. 为什么AI Agent必须自己管缓存,而不是交给框架或中间件 AI Agent不是传统Web服务里的一个API接口,它是一套有状态、有记忆、能自主决策的运行时系统。你用LangChain搭个Chain,调个OpenAI API,跑通了demo——这连Agent的门槛都没…

2026/10/27 12:00:54

动态规划求解最长公共连续子序列问题

1. 题目背景与核心需求解析这道来自IXOI比赛的题目"永远在一起!"乍看像是一道浪漫的算法题,实则考察了字符串处理与动态规划的经典组合。题目要求我们找到两个字符串的最长公共子序列(LCS),但加入了特殊的"永远"约束条件…

2026/10/27 12:00:54

DVWA High级别暴力破解实战与防御策略

1. DVWA暴力破解High难度实战解析 在Web安全测试领域,暴力破解(Brute Force)是最基础却最有效的攻击手段之一。DVWA(Damn Vulnerable Web Application)作为经典的渗透测试练习平台,其Brute Force模块在High安全级别下设置了多重防御机制。我最近在复现这…

2026/10/27 12:00:54

Linux文本处理利器:cut命令详解与应用

1. 初识cut命令:Linux文本处理的瑞士军刀在Linux系统日常运维和数据处理中,文本处理占据了工程师80%以上的工作场景。而cut命令就像一把精巧的解剖刀,能够从复杂的文本数据中精准提取所需字段。我第一次真正体会到它的威力是在处理服务器日志…

2026/10/27 12:00:54

Vue3全屏功能实现与最佳实践

1. 为什么全屏功能在Vue3项目中如此重要? 全屏体验已经成为现代Web应用提升用户沉浸感的关键特性。从数据看板到视频会议,从在线教育到游戏互动,全屏功能能有效聚焦用户注意力,最大化利用有限的屏幕空间。在Vue3生态中实现全屏功能…

2026/10/27 11:55:52

数据库系统概论复习指南:从物理独立性到事务并发的知识地图

简介:这份资源是面向高校计算机专业学生的《数据库系统概论》期末复习试题文档,适用于课程备考、知识点自测与查漏补缺。内容覆盖数据库系统基础知识、关系数据库与关系代数、SQL语言、数据库设计流程、DBMS功能组成、数据安全与事务处理、并发控制及数据…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/27 0:59:21

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式19_“模式选错”的典型代价

“模式选错”的典型代价 摘要 在软件工程中,设计模式、架构模式、并发模式乃至团队协作模式的选择,往往在项目早期就决定了后续的开发效率和维护成本。本文通过多个真实场景,剖析“模式选错”带来的典型代价——包括返工成本、技术债务累积、…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式20_新手推荐路径

新手推荐路径 摘要 在 AI 辅助开发工具快速普及的今天,新手面对最多的困惑往往不是"工具够不够强",而是"我该从哪一步开始用"。本文提出一条经过实践验证的三阶段学习路径:先从 Ask(问答式交互)起…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑