Bootstrap

告别付费 API!使用 Ollama 和 MATLAB 玩转本地大模型

在“当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 一起使用,首先要克隆该存储库。

  1. 在系统命令提示符下,运行下述命令将LLMs with MATLAB库克隆至本地工作路径。
git clone https://github.com/matlab-deep-learning/llms-with-matlab.git

  1. 打开 MATLAB 并导航到克隆存储库的目录。

  1. 将使用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提取论文
  • 生成图像

同时官方提供了包括上文提到的的各类应用案例,方便学习和使用。

;