大模型使用方式索引
2025 年 03 月 19 日
本文只是一个不完整的索引,用于穿起一些基础概念的理解。
写在前面的部分
对于大模型,我个人的理解是:本质上,大模型就是一个大型的数据库。
任何程序都是处理输入,给出输出。大模型的输入是文字,输出的是文字(多模态会处理音视频,但思路是类似的)。所以大模型的行为,只是根据输入的文字,通过一定的方式,在其数据库中查询并得到输出而已。
注:数据库只是一个简单的比喻。处理文字的大模型总是根据已有输入,通过各种矩阵运算,计算下一个输出的文字,直到获取到结束标记。
大模型的使用方式
上面一段略微有点离题,现在回到主题。
因为大模型本质只是一个类似数据库的数据集,因此使用起来,无非不过就是以下几种方式:
- 推理方式:类似函数库的使用方式,使用推理引擎,引入大模型数据,调用推理引擎接口进行推理,获取结果。
- 服务方式:类似调用远程服务的方式,调用其接口,获取结果。
下面对于几种方式稍稍展开。
推理方式
由于大模型本质只是数据库,因此核心问题是推理引擎的选择。能调用的接口完全受推理引擎的限制,同时模型跟推理引擎也有一定程度的绑定关系,可以参考这个列表:🤗 Transformers。从列表中可以看出,大部分模型都支持 Pytorch。
具体的使用方式,可以参考范例,以下只列出常用的使用方式:
- 文本生成(Text Generation):根据单次对话,生成大段文本。参考范例:Generation with LLMs。
- 聊天(Chat):根据多轮对话历史,模仿人类回复。参考范例:Chatting with Transformers。
除了使用 python 的几种选择,推理引擎还可以使用其他语言,简单举例来说:
需要注意的是,推理引擎支持的大模型往往有所限制。例如:
- 大模型的基础架构。即是说,推理引擎可能只支持特定几个系列的大模型。
- 大模型的存储格式。例如 llama.cpp 支持 gguf,而 pytorch 支持 pt/pth。
- 模型特定 API 的支持。模型推出时,往往会支持特定的推理引擎,因此其他推理引擎为其增加支持时,可能会缺少部分特定 API。
所以,想要使用特定的大模型时,要考虑如何选择对应的推理引擎,才能明确使用方式。
服务方式
本质上,服务方式只是简单的调用 RESTful API。Open-AI 的 OpenAPI 已经是事实标准。基于其 spec,已经有大量 SDK 实现,根据语言选择即可。
以最常用的 chat completions 接口举例,所有的输入输出都已经在文档中说明,但还是需要实际写点代码才能真正理解其细节。
近期我尝试使用了 tool use 方式,这里说明一下 tool use 的最小流程:
- 初次调用 chat completions 接口时,修改 tool_choice 和 tools 参数,在请求中注入可以使用的 tool 列表,发送请求。
- 接到第一次响应后,检查响应中是否有对 tool 的调用请求,如果有,则提取参数。
- 根据响应中的参数,调用 tool(通常是 function),获取结果。然后将结果注入到第二个请求当中,发送请求。
- 从第二个响应的结果,得到输出。
这里就是 rust 的 async-openai 使用 tool 的参考范例。遵循上面的最小流程。实际上,2-4 这个过程可能是一个 loop,llm 可以在接收到请求后,通过多次响应调用 tool。作为请求方,需要在请求中保留整个过程中的 message。
使用 MCP 扩展 tool
关于使用 MCP 的方式,看起来是在上面的 tool use 方式上做进一步的扩展。
注:我看到有一些说法声称可以允许不支持 tool 的 LLM 调用 MCP 功能,但我没见到实际的例子。
从概念上来讲,所谓 host-client-server 模式,可以理解为以下几点:
- host 即是需要添加 MCP 支持的应用,比如自己的程序。
- client 是使用 sdk 创建的 instance,通过 client 可以:
- 获取 tool 描述。
- 生成 tool 响应。
- server 是真正执行功能的应用。
参考 rust-sdk 的例子:
- list_tools 可以获取 tool 描述,这部分可以用于前面写到的 “注入 chat completion 请求”。
- call_tool 可以执行 mcp 功能,获得的响应可以用于前面的 “注入第二个请求”。
明显可以看出这是基于 tool use 的扩展。这个过程基本上如下所示:
- 构建 mcp client。
- 从 mcp client 获取 tool 描述,并将其加入原始请求。
- 接收到 llm 返回的 tool 调用响应时,使用 mcp client 执行并获取结果。
- 将 mcp client 的执行结果加到下一个请求中,再次发给 llm。
明显,上面的过程跟 tool use 并无不同。