在“当MATLAB遇见ChatGPT?”一文中介绍了名为MatGPT的插件,该插件通过调用ChatGPT的API,实现了在MATLAB中与Chat GPT对话的功能。
虽然Open AI的GPT3.5和GPT4o可以免费使用,但调用API却需要收费,因此使用MatGPT这类插件的成本还是略显高昂。
随着开源大模型的发展,其综合性能已经不逊色于传统的商业模型,借助ollama这样的框架可以将各类开源模型部署在本地,可以不受网络于账号的限制随时随地的免费使用。
在“如何在本地一键配置最强国产大模型”中介绍了使用ollama在本地个人电脑部署国产Qwen2大模型的方法。借助MATLAB官方推出的“Large Language Models (LLMs) with MATLAB”库,可以实现在MATLAB中调用通过ollama部署的本地模型,这样就可以解决ChatGPT等商业模型的API需要付费的问题。
LLMs with MATLAB库介绍
Large Language Models (LLMs) with MATLAB库可以实现将 MATLAB 连接到 OpenAI Chat Completions API(支持 ChatGPT)、OpenAI Images API(支持 DALL·E)、Azure OpenAI 服务和本地 Ollama模型的代码,可以实现直接在 MATLAB 环境中利用大型语言模型的自然语言处理功能。
LLMs with MATLAB库对MATLAB及大模型服务有一定的限制要求。
对MATLAB的要求:
- 需要 MATLAB R2024a 或更高版本。
- 一些示例需要 Text Analytics Toolbox。
对大语言模型服务的要求:
- 对于OpenAI的连接:需提供有效的 OpenAI API 订阅和 API 密钥。
- 对于 Azure OpenAI 服务:需要具有OpenAI访问、部署和 API 密钥的有效 Azure 订阅。
- 对于 Ollama:需要本地安装的Ollama。目前仅支持 localhost 上的连接,即 Ollama 和 MATLAB 必须在同一台计算机上运行。
配置方法
要将LLMs with MATLAB库与本地安装的 MATLAB 一起使用,首先要克隆该存储库。
- 在系统命令提示符下,运行下述命令将LLMs with MATLAB库克隆至本地工作路径。
git clone https://github.com/matlab-deep-learning/llms-with-matlab.git
- 打开 MATLAB 并导航到克隆存储库的目录。
- 将使用
addpath
将目录添加到 MATLAB 路径。
addpath('路径/llms-with-matlab');
如果不方便使用git clone
也可以直接在github或MATLAB File Exchange下载压缩包后解压至本地使用。
本地调用Ollama
在下载并配置完成LLMs with MATLAB库后,可以调用ollamaChat
类创建与本地ollama的连接。
通过下面的命令创建一个基于本地模型的聊天,这里以Qwen2为例:
chat = ollamaChat("qwen2:7b")
可以看到MATLAB实例化了一个ollamaChat
对象,包含以下几种属性:
-
Model:模型
-
TopK:考虑用于输出的tokens的最大数量。默认值为Inf,允许所有tokens。较小的值减少了输出的多样性。
-
Temperature:温度值,用于控制输出的随机性。较高的数值会增加输出的随机性(在某种意义上,“创造性”),较低的数值则会减少它。设置为0完全消除了输出的随机性。
-
TopP:控制输出多样性的最高概率质量值。默认值为1,也被称为top-p抽样。
-
StopSequences:触发停止生成的字符串向量。
-
TimeOut:连接超时时间(秒)。默认值是120。
-
ResponseFormat:模型返回的响应格式。
通过chat
对象的generate
方法,已经可以与模型进行对话,例如:
>> chat.generate('你是谁?')
ans =
"我是阿里云开发的一款超大规模语言模型,我叫通义千问。作为一个AI助手,我的目标是帮助用户获得准确、有用的信息,解决他们的问题和疑惑。无论是关于学术知识、技术问题、日常建议还是其他各种主题,我都尽力提供高质量的回答。请随时向我提问,我会尽全力给予支持和协助!"
设置聊天循环
要实现连续对话就需要建立聊天循环,官方给出了一个案例:
%%配置模型
%设置每次聊天会话允许的最大字数,并定义关键字,当用户输入该关键字时,该关键字将结束聊天会话。
wordLimit = 2000;
stopWord = "end";
%创建一个实例ollamaChat来执行聊天,创建一个实例messageHistory来存储会话历史记录。
chat = ollamaChat("qwen2:7b");
messages = messageHistory;
%% 聊天循环
% 开始聊天并保持聊天,直到出现stopWord设置的语句出现
totalWords = 0;
messagesSizes = [];
%%
% 主循环会无限地继续下去,直到输入设置好的stopWord或按下Ctrl+ c
while true
query = input("User: ", "s");
query = string(query);
%dispWrapped("User", query)
%%
% 如果您输入了stopWord,则显示消息并退出循环。
if query == stopWord
disp("AI: Closing the chat. Have a great day!")
break;
end
numWordsQuery = countNumWords(query);
%%
% 如果查询超过字数限制,则显示错误消息并停止执行。
if numWordsQuery>wordLimit
error("Your query should have fewer than " + wordLimit + " words. You query had " + numWordsQuery + " words.")
end
%%
% 跟踪每条消息的大小和到目前为止使用的总字数。
messagesSizes = [messagesSizes; numWordsQuery]; %#ok
totalWords = totalWords + numWordsQuery;
%%
% 如果总字数超过限制,则从会话开始时删除消息,直到不再使用为止。
while totalWords > wordLimit
totalWords = totalWords - messagesSizes(1);
messages = removeMessage(messages, 1);
messagesSizes(1) = [];
end
%%
% 将新消息添加到会话并生成新的响应。
messages = addUserMessage(messages, query);
[text, response] = generate(chat, messages);
dispWrapped("AI", text)
%%
% 计算回复中的字数并更新总字数。
numWordsResponse = countNumWords(text);
messagesSizes = [messagesSizes; numWordsResponse]; %#ok
totalWords = totalWords + numWordsResponse;
%%
% 向会话添加响应。
messages = addResponseMessage(messages, response);
end
%% |Helper Functions|
% 该函数用于计算文本字符串中的单词数
function numWords = countNumWords(text)
numWords = doclength(tokenizedDocument(text));
end
%%
% 该函数显示从前缀挂起缩进的换行文本
function dispWrapped(prefix, text)
indent = [newline, repmat(' ',1,strlength(prefix)+2)];
text = strtrim(text);
disp(prefix + ": " + join(textwrap(text, 70),indent))
end
%%
运行该脚本即可在命令行窗口实现连续对话:
总结
以上介绍了通过LLMs with MATLAB库在MATLAB中调用基于Ollama的本地大模型的方法。
LLMs with MATLAB库提供的各类接口可以帮助我们在MATLAB中实现对大模型的调用或二次开发,其应用包括但不限于:
- 基于各类模板的聊天机器人
- 检索增强生成(RAG:Retrieval-augmented generation)
- 文本摘要
- 从ArXiv提取论文
- 生成图像
同时官方提供了包括上文提到的的各类应用案例,方便学习和使用。