本文主要内容:
1、用最少的代码写个 AI 桌面聊天软件。
2、调用简洁易用的 ChatUI 实现前端界面。
3、自动部署一切,检测到没有 Ollama 自动下载安装,输入未安装的大模型名自动下载安装 —— 实时显示下载进度。
4、一键生成独立 EXE 文件,打包后仅 700 KB。
如果有代理可以开一下,首次下载 Ollama 与模型会快一些。后面使用的时候就不需要了。
打开只有几 MB 的极简开发工具 aardio ,新建工程。在 main.aardio 中输入下面的代码:
import win.ui; /*DSG{{*/ var winform = win.form(text=“Ollama 桌面助理”;right=644;bottom=556) winform.add( cmbModels={cls=“combobox”;left=171;top=520;right=336;bottom=546;db=1;dl=1;edge=1;items={};mode=“dropdown”;z=2}; custom={cls=“custom”;text=“自定义控件”;left=3;top=3;right=638;bottom=504;db=1;dl=1;dr=1;dt=1;z=1}; goLibrary={cls=“syslink”;text=<a href=“https://ollama.com/library?sort=popular”>搜索大模型</a>;left=369;top=523;right=471;bottom=541;color=16729600;db=1;dl=1;dr=1;notify=1;z=4}; static={cls=“static”;text=“请输入或选择模型名称:”;left=9;top=520;right=166;bottom=546;align=“right”;db=1;dl=1;transparent=1;z=3} ) /*}}*/ //导入浏览器控件 import web.view; var wb = web.view(winform.custom); //几句代码创建 Ollama 接口,不需要额外封装库 import web.rest.jsonClient; var client = web.rest.jsonClient(); var ollama = client.api(“http://localhost:11434/api/”) //创建聊天上下文 import web.simpleChatUi.messages; var messages = web.simpleChatUi.messages(); //添加消息 messages.push( //system 角色用来写系统指令提示 role = “system”; content = “你是 Ollama 智能助理,用户的贴心小助手~。现在的时间是 “ + tostring(time()) + “。” ) //导出网页 JavaScript 可以调用的接口 wb.external = {}; wb.external.sendMessage = function(id,prompt){ //启动时 ChatUI 会发一个空消息 if(!id){ //第一次显示欢迎消息 return chatUi.emit( content = 主人好,我是 Ollama 智能助理,您的贴心小助手~; ); } //加入到聊天上下文 messages.push( role = “user”; content = prompt; ) //非阻塞异步调用,让 JavaScript 调用先返回 wb.setTimeout( function(){ //记录应答消息 var content = “”; //发送聊天请求 var ok,err = ollama.chat({ model = winform.cmbModels.text; options = { temperature = 0.7;//模型选项 } messages = messages; },function(result){ //流式响应,每次应答一个字 content = content ++ result.message.content; //逐字发送聊天消息到界面,实现打字效果 chatUi.emit({ id = id; content = content }) } ) if(ok){ //加入到聊天记录 messages.push( role = “assistant”; content = string.trim(content); ) } else{ //如果模型不存在 if(string.indexOf(err,`try pulling it first`)){ //下载模型 var ok,err = ollama.pull({ model = winform.cmbModels.text; },function(result){ //出错了,显示错误信息 if( result.error ){ chatUi.emit({ id = id; content = result.error }) return; } //显示模型下载进度 if(result.completed) { chatUi.emit({ id = id; content = “正在下载模型:” + ..math.round((result.completed / result.total) * 100) + “% “ + ..math.size64(result.completed).format() }) } elseif( result.status ){ //显示下载状态 chatUi.emit({ id = id; content = result.status }) //下载完成 if(result.status == “success”){ wb.external.sendMessage(id,prompt); return; } } } ) //下载成功 if(ok) return ; } //显示错误信息 chatUi.emit({ id = id; content = client.lastResponseError(“error”):err; }) } } ); }; //加载 ChatUI 前端界面 import web.simpleChatUi; chatUi = web.simpleChatUi(wb); chatUi.avatar = https://gw.alicdn.com/tfs/TB1DYHLwMHqK1RjSZFEXXcGMXXa-56-62.svg; //列出已安装的大模型 var ret = ollama.tags.get(); winform.cmbModels.items = table.map(ret.models,lambda(v) v.name ) winform.cmbModels.selIndex = 1; //搜索在线大模型 import process; winform.goLibrary.onHyperlinkClick = function(nmSysLink,url,id){ process.openUrl(url) //打开超链接 } winform.show(); win.loopMessage();点击『保存 』按钮:
然后按『运行 F5 』按钮,就可以自动配置好并启动程序。
运行效果如下:
按 F7 发布为 EXE 文件。就这么简单没有其他复杂的内容。
下面我们写个更简单控制台版本,代码如下:
import console; console.setTitle(“聊天助手”) //创建 Ollama 客户端 import web.rest.jsonClient; var client = web.rest.jsonClient(); var ollama = client.api(“http://localhost:11434/api/”) //循环读取用户输入问题 while( var str = console.getText( “请输入:” ) ) { //调用 Ollama 聊天接口 var ok,err = ollama.chat({ //选择模型,这里选择千问0.5b model = “qwen:0.5b”; //这是聊天消息队列(可用于保存上下文) messages = { { //system 角色用来写系统指令提示 role = “system”; content = “你是 Ollama 智能助理,用户的贴心小助手~。现在的时间是 “ + tostring(time()) + “。” }; { //user 角色代表用户 role = “user”; content = str }; } },function(result){ //这个 API 是流式输出。 console.writeText(result.message.content) } ) //如果出错,输出错误信息 if(!ok){ console.log( client.lastResponseError(“error”) || err ) } } console.pause(true);system 角色用来写系统指令提示。
user 角色代表用户。
assistant 角色表示 AI 模型。
这 3 个角色来回发送的所有消息,一问一答都要记录在 messages 队列中,每次请求都作为聊天上下文发送过去。
看一下运行效果: