一个开源的 VS Code 大模型聊天插件:Light-at

这篇文章是一个开发杂谈。对于有经验的开发者来说,可能这个项目并不算特别复杂或者高技术,只是对我个人来说算一个里程碑,因此写篇杂谈文章记录一下。也许也能给起步者一些参考。


项目地址:https://github.com/HiMeditator/light-at

插件下载:Light At - Visual Studio Marketplace

背景

最近组里在做相关项目,学了些 VS Code 插件开发,就想着自己做一个插件。花了一个月,终于做出一款个人还算满意的插件,这也是第一次一个人做原创项目,下面介绍一下。

自从大模型出现后,开发就越来越依赖大模型了。再后来以 Copilot 为首的 IDE 内智能代码助手更是让 IDE 内开发更加方便。这些智能代码插件重点关注代码功能,比如代码补全、代码生成、错误修复。对于 IDE 内聊天也侧重于代码相关的内容。作为 VS Code 重度用户,有时候觉得这些智能代码助手在通用聊天上有些不足,于是我准备自己做一个大模型聊天插件,着重关注聊天功能(还没做代码功,能主要是技术难度要高得多)。

如图,流行的智能助手基本不渲染数学公式

目前主流的智能助手插件(不代表全部)在聊天上可能的缺点有:

  1. 不渲染数学公式(这个没太大技术壁垒,可能是觉得没必要)
  2. 模型选择有限,一般只支持自家模型和开源模型(自己不做模型的Continue不在其中)
  3. 缺少多模态交互(这个我也没做😂,现在有多模态大模型API,技术上可行)

插件介绍

Light-at(轻亮)插件主要是为了解决问题1和问题2。数学渲染使用了开源的库,为了同时能正确渲染 markdown(marked库)、代码(highlight.js库)和数学公式(katex库)调了好久。

公式渲染和代码高亮

模型支持本地 Ollama 模型和云端的支持 OpenAI 接口的模型,直接配置好需要的模型调接口就行了。自己电脑有条件的可以搞几个 Ollama 本地模型玩玩,离线模型回答会更自由一些。云端模型主要测试了通义千问 API、DeepSeek API 和 OpenAI API,均可以正常使用。

我目前的模型列表

另一个优点是可以配置 System Prompt(系统提示词),这样可以基于一个模型衍生出多个满足特定需求的分支,用于完成不同的任务。

添加系统提示词,apiKey 可以使用环境变量

然后是支持选择打开过的文本文件作为聊天上下文。主流的智能助手在这方面往往有更强大的支持,比如包含文件夹、代码块检索等。不过对于单纯聊天来说,现在的上下文选择功能也基本上够了。现在我的技术积累还不足,后面再考虑提升吧。

聊天上下文选择

还有一些其他基本功能,比如支持多语言(中文、英语、日语)、聊天记录保存、删除聊天条目、回答内容快速复制、对模型推理内容的单独展示等。更多内容可以参考Light-at用户手册。

聊天记录管理,右边是插件设置

开发过程

功能介绍得差不多了,再讲讲开发过程吧。这个插件可以分为前端和插件端。

前端开发

前端主要显示用户界面,获取用户输入并展示反馈内容。前端刚开始我是用原生(html+css+js)写的,随着项目内容逐渐增加,前端维护越来越越痛苦,各种全局变量和 DOM 操作乱飞。因此我决定重构前端。

本科学了 Vue2,因此决定使用 Vue 开发前端。学了整整三天 Vue3,然后开始重写项目。我放弃了之前写的Light-assistant项目,重开了一个仓库,取名为Light-at。

VS Code 插件中前端界面比较特殊,是通过 Webview 展示的,有很多限制,比如只能加载 VS Code 处理过的本地资源,页面跳转难以实现等。

我在网上查了一天资料,各种试错,才终于搞定了在 VS Code 插件中嵌入 Vue 前端页面的问题。我现在插件的架构基本上是按照_code_bear的帖子构建的,采用 monorepo 的开发范式,使用 pnpm 在同一个仓库中同时管理前端子项目和插件子项目。

但是根据教程也是遇到了一些问题,比如某些实现有些复杂、插件打包会报错。经过多次修改,总结了自己的开发流程,这是对我这个插件开发入门者一个比较宝贵的经验。以后有时间专门开一个帖细说:用 Vue3 开发 VS Code 插件的前端页面

本次开发没有使用前端组件库,大部分样式都是手搓的,因为有点强迫症,经常一个样式调好久。

插件端开发

插件端开发要简单一些,不了解的内容就问大模型或者查 VS Code 插件文档,功能实现注意模块化,尽量降低耦合,不然后面开发容易出现牵一发动全身的问题。

为了做国际化(多语言支持)还是花了一些功夫,插件端配置文件需要 package.nls.*.json 国际化、插件内的内容需要 l10n 国际化,前端界面使用 i18n 国际化。内容不多但搞了三个方案才全部支持多语言。最近在学日语,就把日语支持也做进去了,内容基本上是大模型翻译的,我就主要能看懂片假名,语法是否正确就不知道了。

总结

总的来说算是一次不错的开发经历,自己做出来的东西也自己用着也挺舒服的,后面如果有新的需求还能继续改进。

项目目前代码量并不高,并不算复杂,欢迎感兴趣的同学参考:Github - Light At。

最后贴一张项目结构图:

标看上去很长,但是代码量不多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL121 创建索引

-- 普通索引 CREATE INDEX idx_duration ON examination_info(duration);-- 唯一索引 CREATE UNIQUE INDEX uniq_idx_exam_id ON examination_info(exam_id);-- 全文索引 CREATE FULLTEXT INDEX full_idx_tag ON examination_info(tag);描述 现有一张试卷信息表examination_in…

【Pandas】pandas DataFrame set_flags

Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于获取 DataFrame 的行索引DataFrame.columns用于获取 DataFrame 的列标签DataFrame.dtypes用于获取 DataFrame 中每一列的数据类型DataFrame.info([verbose, buf, max_cols, …])用于提供 Dat…

Linux终止进程(kill process)的一些玩法

经常运行一个程序时,表面上已经终止了,实际上还在后台运行。一来呢,它可能占据端口,导致端口复用的时候报错。二来呢,它可能占用GPU,让你显存直接少一块。 尤其是在多进程程序,假如运行“python…

《比特城传奇:公钥、私钥与网络安全的守护之战》

点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 第一章:双钥之谜 比特城的清晨总是笼罩着一层薄雾,仿佛这座城市本身就是由无数个0和1编织而成的幻境。在这里,信息如同空气般无处不在,但…

BGP路由协议之属性1

公认属性是所有 BGP 路由器都必须能够识别的属性 公认必遵 (Well-known Mandatory) : 必须包括在每个 Update 消息里公认任意 (Well-known Discretionary) : 可能包括在某些 Update 消息里。 可选属性不需要都被 BGP 路由器所识别 可选过渡(OptionalTransitive) : BGP 设备不…

Pr视频剪辑 Premiere Pro 2024 for Mac

Pr视频剪辑 Premiere Pro 2024 for Mac 文章目录 Pr视频剪辑 Premiere Pro 2024 for Mac一、介绍二、效果三、下载 一、介绍 Premiere Pro 2024 for Mac是一款专业的视频编辑软件,广泛应用于电影、电视、广告等领域。它为Mac用户提供了强大的剪辑、调色、音频处理等…

oracle 包的管理

在PL/SQL程序开发中,为了方便实现模块化程序的管理,可以将PL/SQL元素(如存储过程、函数、变量、常量、自定义数据类型、游标等)根据模块的程序结构组织在一起,存放在一个包中,称为一个完整的单元&#xff0…

LINUX 5 cat du head tail wc 计算机拓扑结构 计算机网络 服务器 计算机硬件

计算机网络 计算机拓扑结构 计算机按性能指标分:巨型机、大型机、小型机、微型机。大型机、小型机安全稳定,小型机用于邮件服务器 Unix系统。按用途分:专用机、通用机 计算机网络:局域网‘、广域网 通信协议’ 计算机终端、客户端…

从零开始的图论讲解(1)——图的概念,图的存储,图的遍历与图的拓扑排序

目录 前言 图的概念 1. 顶点和边 2. 图的分类 3. 图的基本性质 图的存储 邻接矩阵存图 邻接表存图 图的基本遍历 拓扑排序 拓扑排序是如何写的呢? 1. 统计每个节点的入度 2. 构建邻接表 3. 将所有入度为 0 的节点加入队列 4. 不断弹出队头节点,更新其…

强化学习Q-Learning:DQN

强化学习Q-Learning/DQN 本文是一篇学习笔记,主要参考李宏毅老师的强化学习课程。 目前主流的强化学习方法大致可以分为 policy-based 和 value-based 两大类。之前我们介绍的 policy gradient 策略梯度,就是 policy-based 的方法。本文要介绍的 Q-learn…

W公司云安全解决方案

1 安全理念DevOpvSec 统一安全运营 2 安全责任分层模型 3 云安全产品线 4 云安全解决方案/部署架构 5 安全能力 6 信创云平台适配 7 统一化安全运营 利用云安全平台实现统一的安全运维 8 安全资源池的统一纳管 9 案例分享:私有云 10 云安全解决方案的衍生特点 11 …

python中的in关键字查找的时间复杂度

列表(List) 对于列表来说, in 运算符的复杂度是 O(n),其中n是列表的长度。这意味着如果列表中有n个元素,那么执行 in 运算符需要遍历整个列表来查找目标元素。 以下是一个示例,演示了在列表中使用 in 运算…

MySQL基础 [一] - Ubuntu版本安装

目录 预安装 先查看自己操作系统的版本 添加MySQL APT下载源 下载 安装 正式安装 查看MySQL状态 打开MySQL 预安装 先查看自己操作系统的版本 lsb_release -a 添加MySQL APT下载源 下载 下载发布包 下载地址 : https://dev.mysql.com/downloads/repo/apt/ 这里下…

Springboot整合Mybatis+Maven+Thymeleaf学生成绩管理系统

前言 该系统为学生成绩管理系统,可以当作学习参考,也可以成为Spirng Boot初学者的学习代码! 系统描述 学生成绩管理系统提供了三种角色:学生,老师,网站管理员。主要实现的功能如下: 登录 &a…

操作系统之文件系统

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

AG32:MCU和CPLD如何交互?

本文档介绍了AG32开发中,MCU与CPLD交互的具体方式以及例子。如需了解AG32更多资料可发邮件:salesagm-micro.com 一、MCU和CPLD直接交互 cpld工程创建及编译的操作流程,参考文档《AG32下fpga和cpld的使用入门》 在工程中,用户逻辑…

机器人轨迹跟踪控制——CLF-CBF-QP

本次使用MATLAB复现CLF-CBF-QP算法,以实现机器人轨迹跟踪同时保证安全性能 模型 使用自行车模型来进行模拟机器人的移动动态,具体的模型推导参考车辆运动学模型-自行车模型 采用偏差变量 p ~ = p − p r e f u ~ = u − u r e f \tilde{p} = p - p_{ref} \\ \tilde{u} = …

009_抽象类和接口

抽象类和接口 final关键字常量 单例模式(设计模式)枚举类抽象类抽象类的注意事项、特点使用抽象类的好处模版方法设计模式 接口接口的好处接口的注意事项 final关键字 final关键字是最终的意思,可以修饰类、方法、变量。 修饰类:…

新潮透明液体水珠水滴失真故障扭曲折射特效海报字体标题设计ps样机动作素材 Bubble Photoshop Templates

只需单击几下即可创建引人注目的视觉效果!您需要做的就是将您的文本或图像放入智能对象中并应用作。 包中包含: 15 个静态 Photoshop 模板(PS 2019 及更高版本) 01-05 垂直布局 (22504000)06-10 水平布局…

Android DiaLog全屏设置,带有叉号的弹窗,这个弹窗分为两个部分,一个是主体,另一个是关闭部分。自定义布局弹窗

1.先上图。要实现的效果图。 2.这是我自己实现的效果图,是不是跟效果图一摸一样 来看看整体效果 3.我把自己实现的效果图的代码写出来。如下就是我的代码 3.1首先是MainActivity类 import androidx.appcompat.app.AppCompatActivity;import android.app.Alert…