ChatSDK的介绍,封装和测试以及编译成静态库
1.ChatSDK:
1.SDK的介绍:
SDK就是程序员的⼯具箱,Software Develop Kit的缩写,⼀套帮开发者⽅便开发特定功能的⼯具包。
⽐如:
•
微信⽀付SDK:你只要接⼊SDK,就能在程序中⽀持微信⽀付,不⽤⾃⼰研究⽀付安全、加密、银
⾏对接等。
•
相机SDK:使⽤⼚商提供的SDK,就能让APP调⽤收集摄像头拍照、录像
SDK中通常包含:
•
库⽂件:被⼈已经写好的功能,需要实现什么功能直接调⽤即可。
•
API接⼝:告诉你该怎么和平台打交道。
•
⽂档:说明书,告诉你怎么⽤
•
⽰例代码:相当于菜谱,照这些就能跑通
•
调试⼯具:出错时能帮你查问题
也就是说:SDK就是⼚商打包好的⼀套"现成⼯具+说明书",让开发者可以更快、更安全、更省⼼地在 ⾃⼰的软件中实现特定功能。
2.ChatSDK的封装:
相当于再提供一个接口把会话管理和数据管理连接在一起。
1.头文件的实现:

#pragma once
#include<memory>
#include <unordered_map>
#include<map>
#include <string>
#include <vector>
#include<functional>
#include"common.h"
#include"LLMManager.h"
#include"SessionManager.h"
namespace ai_chat_sdk{
//ChatSDK类
class ChatSDK{
public:
//初始化大模型
bool initModels(const std::vector<std::shared_ptr<Config>>& configs);//初始化大模型
//创建会话
std::string createSession(const std::string& modelName);
//获取指定会话的引用器
std::shared_ptr<SessionInfo> getSession(const std::string& sessionId);
//获取所有会话列表
std::vector<std::string> getSessionLists() const ;
//删除指定会话
bool deleteSession(const std::string& sessionId);
//获取可用的模型信息
std::vector<ModelInfo> getAvailableModels() const ;
//发送消息 全量返回
std::string sendMessage(const std::string& sessionId, const std::string& message);//只需要这两个参数 初始化时通过传模型的信息创建会话时会自动选择模型 会话内可以切换模型
//发送消息 流式返回
std::string sendMessageStream(const std::string& sessionId, const std::string& message,std::function<void(const std::string&,bool)> callback);//需要传入回调函数 回调函数参数为 消息内容 是否是最后一条消息
private:
bool _isInitialized=false;//是否初始化
std::unordered_map<std::string, std::shared_ptr<Config>> _modelConfigs;//大模型映射表 存储已初始化的大模型配置 KEY为模型名称 VALUE为模型配置信息
LLMManager _llmManager;//LLM管理器 管理大模型的调用
SessionManager _sessionManager;//会话管理器 管理会话的创建和销毁
};
}//end namespace ai_chat_sdk
2.源文件的实现:
1.大模型的初始化:
这里初始化可以去直接调用LLMManager实现的初始化模型的方法:

这里跟LLMManager保持一致一个注册一个初始化 所以这里头文件还要加上这两个私有方法

2.注册所有的模型:
这里要注意一下 这个deepseekprovider是用唯一指针管理起来的


这里注册deep seek /chatgpt/Gemini 是差不多的因为都是云端大模型

而通过Ollama接入本地大模型时有一些区别因为这些配置信息都是用户自己配置进来的 具体要接入什么模型由用户自己传进来就行 所以这里要循环看看到底调用的什么模型

所以这里我们要去实现遗漏下来的common.h了 这里把接入Ollama的方式实现一下。

这里我们还要去修改一下 因为通过云端调用模型的话 我们只需要传api key所以这里我们可以将base url给写好 例如deepseek的:

这里你调用不同的模型传过来不同的参数这些都继承为模型的信息只是你接入云端大模型多了一个
apikey的调用 而ollama需要你自己传模型的名字 而这里我们初始化ollama调用的模型时不需要传APIkey 所以我们要验证这个Config是不是ollama的Config


而dynamic_cast的使用需要你是虚函数而先在我们没有虚函数 所以还要在common中实现一个虚函数

这样有虚函数 整个继承体系就有虚函数 这样我们代码的动态继承就正确了。

configs是模型的一些配置信息

3.初始化所有的模型提供者:
首先先遍历我们现有的所有模型 然后判断是不是API模型或者是ollama模型 不同的模型来用不同的初始化方法 如果是API模型还要判断是不是我们所支持的模型

所以这里我们再加上两个发放用于初始化不同的模型 这里要传模型的名称 因为最后还是要通过LLM来初始化指定模型 所以要传模型名称
4.云端模型的初始化:

这里的配置参数也要和云端大模型的查找是一致的

5.ollama模型的初始化:



这个配置参数是和ollama模型的实现时查找是一致的要不然找不到
这两个方法实现完之后实现初始化所有的模型就可以去调用上面这两个方法了。

6.创建会话的实现:

7.获取指定会话:

8.获取所有会话列表:

9.删除指定会话:

10.发送消息 全量返回的实现:

这里发送消息时我们还要把请求参数给构造好


在头文件构造的时候我们就定义了一个变量用来存储 这个相关的配置信息

整体实现

11.发送消息 流式返回的实现:
跟前面的实现是一样的只是最后调用LLM提供的方法时调用的是流式返回的方法即可

3.ChatSDK的测试
这里测试SDK相当于测试了会话管理和数据管理
这里测试时需要创建ChatSDK的对象 Message对象

将配置好的参数放到一个vector容器中去 因为要创建ChatSDK时要传的参数就是vector类型的


这里我们先用deepseek做测试

这里我们还要去修改编译的文件因为这里使用到了数据库管理 所以我们要加上这个sqlit3库的链接
测试deepseek时

这里出现的问题是因为我的SQL语句出现了错误 通过AI修复后已经能正常使用了

测试通过ollama本地接入的deepseek模型:

这个是因为我一开始把模型的名称赋值给了会话id导致找不到这字段导致错误。
4.ChatSDK的静态库生成:
编写完静态库这样别人在使用后 就之间包含这个头文件即可。不需要下载这么多执行文件。
实际上就是对整个sdk下的头文件进行编写 然后生成一个静态库
1.CMakeLists的编写
也就是包整个实现的文件打包。

因为是对include下的文件进行编写 所以这里必须和include下的文件持平。

实现的原理其实和测试的CMakeLists.txt的编写差不多

这里file是指获取SDK目录下后缀为cpp的所有文


获取头文件与源文件生成静态库


这个的做法是使用那些库时像使用include的库一样不需要包含复杂的路径了 直接包就能使用
CMakeLists的代码:
# CMake的最低版本要求
cmake_minimum_required(VERSION 3.10)
#设置SDK名称 相当于定义了一个变量 变量名是SDK_NAME 变量值是ai_chat_sdk
set(SDK_NAME "ai_chat_sdk")
#设置c++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#设置构建类型Release
set(CMAKE_BUILD_TYPE Release)
#收集源文件
file(GLOB_RECURSE SDK_SOURCES "src/*.cpp")
#收集头文件
file(GLOB_RECURSE SDK_HEADERS "include/*.h")
#生成静态库 库名是ai_chat_sdk
add_library(${SDK_NAME} STATIC ${SDK_SOURCES} ${SDK_HEADERS})
#设置输出目录 输出到当前目录的build文件夹
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/build)
#定义httplib的CPPHTTPLIB_OPENSSL_SUPPORT宏 用于开启httplib的openssl支持
target_compile_definitions(${SDK_NAME} PUBLIC CPPHTTPLIB_OPENSSL_SUPPORT)
#设置头文件搜索路径 用于在编译时找到头文件
target_include_directories(${SDK_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
#设置静态库的链接目录
link_directories(/usr/local/lib)
find_package(OpenSSL REQUIRED)#查找OpenSSL库 如果没有找到 则会报错
include_directories(${OPENSSL_INCLUDE_DIR})#添加OpenSSL头文件搜索路径
#添加编译定义
target_compile_definitions(${SDK_NAME} PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
#链接库 链接jsoncpp fmt spdlog OpenSSL::SSL OpenSSL::Crypto sqlite3
target_link_libraries(${SDK_NAME} jsoncpp fmt spdlog OpenSSL::SSL OpenSSL::Crypto sqlite3)
#安装规则 拷贝静态库到 /usr/local/lib 目录
install(TARGETS ${SDK_NAME}
ARCHIVE DESTINATION lib
)
#安装规则 拷贝头文件到系统目录下 /usr/local/include
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/
DESTINATION include/ai_chat_sdk
FILES_MATCHING PATTERN "*.h"
)
2.静态库的生成:


在编译之前我们要把我之前测试安装的静态库代码给删除掉然后重新安装我直接写的静态库代码。
现在我们要编译sdk所以现在退出到sdk目录下

然后进入sdk目录创建一个build目录

然后cd到build目录下 进行编译 对上一级整体目录进行编译

这样生成编译需要的文件就没问题了 然后现在对项目sdk进行编译

这样编译就完成了

这样我们的静态库就生成好了
3.静态库的安装:

执行安装命令 这样就把我们所以的库全部安装完成了

已经安装到指定目录下面了
这样以后我们使用的时候直接去gitee上把我们实现的静态库拉取下来就能使用了
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)