LMClient 从何而来
国内的大模型厂家百花齐放,国外也是层出不穷。但不同平台之间的信息格式,调用方式,推理参数也是五花八门,缺少统一。如果你想要在业务或者应用中支持不同的平台,你需要安装各种 SDK,再开发不同的适配代码!这样的工作,繁琐,易错,也很无聊。
那么,开源社区中有没有现成的工具来解决这个问题呢?经过一番调研之后,只找到了一个没有活跃开发的项目 LLM-Fusion_API ,以及一个只覆盖了国外主流大模型平台的项目 litellm。
litellm
看起来相当不错,那直接给 litellm 提几个 PR 来覆盖国内的大模型平台吧!但是当我看到 litellm.completion 这个 function 包含 1000+ 行代码后,我放弃了这个天真的想法 😄。
现在只剩下最后一条路了,既然目前开源社区中没有满足我需求的项目,那我自己写一个吧!
LMClient 由此诞生 🎉
LMClient 设计
在决定自己写 LMClient 后,面对的第一个问题,就是要搞清楚一个好用的 大语言模型客户端 应该具备哪些性质?
我简单的罗列一下:
- 简单:无需关心细节,只需要一个统一的接口
- 易用:提供开箱即用的功能,如 ChatEngine, CompletionEngine, function call 等
- 高效:支持流式/非流式推理,以及异步/同步推理
- 灵活:支持模型参数,functions,system prompt 等设置
- 可靠:输入检查,参数检查,异常处理
- 丰富:尽可能多的支持各种平台
LMClient 的设计也由此展开~
简单
LMClient 提供的模型都使用统一的 chat_completion
进行调用,LMClient 在内部统一了不同平台之间的消息格式,推理参数,接口封装,返回解析等!
现在,你可以写出像下方一样的代码,是不是很简单?
from lmclient import MinimaxChat, MinimaxProChat, OpenAIChat, WenxinChat, ZhiPuChat, HunyuanChat, BaichuanChat, ZhiPuCharacterChat
chat_models = [
MinimaxChat(),
MinimaxProChat(),
OpenAIChat(),
WenxinChat(),
ZhiPuChat(),
ZhiPuCharacterChat(),
HunyuanChat(),
BaichuanChat(),
]
for model in chat_models:
model_response = model.chat_completion('你好,你是谁?请介绍一下你自己', temperature=0)
print(f'{model.model_id}: {model_response.reply}')
输出
minimax/abab5.5-chat: 你好!有什么我可以帮助你的吗?
minimax_pro/abab5.5-chat: 你好!有什么我可以帮助你的吗?
openai/gpt-3.5-turbo: 你好!有什么我可以帮助你的吗?
wenxin/ERNIE-Bot: 你好,很高兴和你交流。有什么我可以帮助你的吗?
zhipu/chatglm_turbo: " 你好👋!我是人工智能助手智谱清言,可以叫我小智🤖,很高兴见到你,欢迎问我任何问题。"
zhipu-character/characterglm: "(有点尴尬)你好,不好意思,我好像走错化妆间了\n"
hunyuan/v1: 你好!很高兴见到你。请问有什么我可以帮助你的?
zhipu/Baichuan2-53B: 你好!很高兴和你交流。请问有什么问题我可以帮助你解决吗?
易用
LMClient 提供了开箱即用的功能,如 ChatEngine, CompletionEngine, function 等
- ChatEngine: 聊天引擎,
chat_completion
是无状态的,即每次调用都是独立的,不会记住上一次的对话内容。而 ChatEngine 则添加了管理对话历史,处理 function call ,流式打印等功能 - CompletionEngine: 补全引擎,在
chat_completion
的功能之上,添加了异步并发控制,每分钟最大请求控制,进度条等功能 - function: 一个装饰器,可以将任意 Python 函数转换为的 jsonschema ,方便 function call 的使用
- ...
高效
LMClient 支持流式/非流式推理,以及异步/同步推理,注意这里的 api 名称有所变化,而命名是非常规律的。async 前缀代表异步,stream 前缀代表流式。
-
非流式同步推理
from lmclient import MinimaxChat
model = MinimaxChat()
response = model.chat_completion('你好')
print(response.reply) -
流式同步推理
from lmclient import MinimaxChat
model = MinimaxChat()
stream_responses = model.stream_chat_completion('你好')
for stream_response in stream_responses:
print(stream_response.stream.delta, end='', flush=True)
if stream_response.is_finish:
response = stream_response -
非流式异步推理
import asyncio
from lmclient import MinimaxChat
model = MinimaxChat()
co_response = model.async_chat_completion('你好')
response = asyncio.run(co_response)
print(response) -
流式异步推理
import asyncio
from lmclient import MinimaxChat
model = MinimaxChat()
async def async_chat():
async for stream_response in model.async_stream_chat_completion('你好'):
if stream_response.is_finish:
response = stream_response
return response
else:
print(stream_response.stream.delta, end='', flush=True)
response = asyncio.run(async_chat())
print(response)