搭建自己的GPT

news/2024/9/19 18:39:08/ 标签: gpt, javascript, vue

搭建自己的GPT

    • 文章说明
    • 核心代码
    • 效果展示
    • 源码下载

文章说明

目前GPT的使用比较主流,现有开源大模型,可以拉取到本地进行部署,搭建属于自己的GPT对话工具;主要用于熟悉大模型的本地搭建;本文采用开源的Ollama进行服务提供,官网已提供控制台版本的提问方式,也有采用docker部署Web ui的功能;我选择本地自己搭建一个简单的对话ui,进行简单使用;该模型部署在本机消耗的资源较大,且模型的回答能力不如千问、文心一言等;

采用md-editor-v3,将返回的内容进行markdown格式展示,效果感觉还不错

同时采用indexDB存储对话记录,部署起来也非常便捷

Ollama大模型下载在官网下载即可

核心代码

App.vue代码

<script setup>javascript">
import {nextTick, onBeforeMount, reactive, watch} from "vue";
import {dbOperation} from "@/DbOperation";
import "@/config.js"
import {openDb} from "@/config";
import {confirm, message} from "@/util";
import {MdPreview} from 'md-editor-v3';
import 'md-editor-v3/lib/preview.css';const data = reactive({content: "",messageList: [],
});let isReplying = false;
let container;function getMaxHeight() {container = document.getElementsByClassName("container")[0];container.scrollTo({top: container.scrollHeight,behavior: "smooth"});
}onBeforeMount(() => {openDb(() => {dbOperation.getAllData((res) => {data.messageList = res.data;nextTick(() => {getMaxHeight();});});});
});watch(() => data.content, () => {if (data.content.length > 500) {data.content = String(data.content).slice(0, 500);}
});const avatarRobot = require("@/image/1.jpg");
const avatarUser = require("@/image/2.jpg");function question() {if (isReplying) {message("正在对话中", "warning");return;}isReplying = true;const messageItem = {question: data.content,reply: "",createTime: new Date(),};data.messageList.push(messageItem);setTimeout(() => {const height = container.scrollHeight;container.scrollTo({top: height,behavior: "smooth"});}, 0);fetch(new Request('http://localhost:11434/api/chat', {method: 'post',mode: "cors",body: JSON.stringify({"model": "llama3.1","messages": [{"role": "user","content": data.content}],}),})).then(response => {data.content = "";const reader = response.body.getReader();read();function read() {reader.read().then(({done, value}) => {if (done) {isReplying = false;dbOperation.add(messageItem, () => {message("对话成功", "success");});return;}const readContent = new Uint8Array(value);const content = JSON.parse(Uint8ArrayToString(readContent)).message.content;data.messageList[data.messageList.length - 1].reply += content;read();}).catch(error => {message(error, "error");});}}).catch(error => {message(error, "error");});
}function Uint8ArrayToString(fileData) {const decoder = new TextDecoder('utf-8');return decoder.decode(fileData);
}function editQuestion(item) {data.content = item.question;
}function copy(item) {navigator.clipboard.writeText(item.reply).then(() => {message("复制到剪切板", "success");});
}function deleteItem(item) {confirm("确认要删除该消息吗?", () => {data.messageList = data.messageList.filter(message => message.id !== item.id);dbOperation.delete(item.id, () => {message("删除成功", "success");});});
}
</script><template><div class="container"><div class="message-container"><div v-for="item in data.messageList" :key="item.id" class="message-item"><div class="create-time">{{ item.createTime }}</div><div class="user"><img :src="avatarUser" alt=""/><p><MdPreview v-model="item.question"/></p><i class="iconfont icon-edit" @click="editQuestion(item)"></i></div><div class="robot"><img :src="avatarRobot" alt=""/><p><MdPreview v-model="item.reply"/></p><i class="iconfont icon-copy" @click="copy(item)"></i><i class="iconfont icon-delete" @click="deleteItem(item)"></i></div></div></div><div class="input-container"><textarea v-model="data.content"/><p class="tip">{{ data.content.length }}/500</p><i class="iconfont icon-send" @click="question"></i></div></div>
</template><style lang="scss">
* {padding: 0;margin: 0;box-sizing: border-box;
}.container {min-width: 20rem;width: 100vw;height: 100vh;background-color: #eaedf6;overflow: auto;position: relative;user-select: none;.message-container {max-width: 70rem;width: 100%;height: fit-content;min-height: calc(100vh - 8rem);position: absolute;top: 0;left: 50%;transform: translateX(-50%);padding: 0 1rem 8rem;overflow: auto;.message-item {margin: 1.5rem 0;.create-time {height: 1rem;line-height: 1rem;font-size: 0.6rem;color: #999;margin-bottom: -0.5rem;margin-left: 0.5rem;}.user, .robot {margin: 1rem 0;display: flex;position: relative;&:hover .icon-edit, &:hover .icon-copy, &:hover .icon-delete {display: block;}img {border-radius: 50%;width: 2.5rem;height: 2.5rem;}p {flex: 1;display: flex;align-items: center;margin-left: 0.5rem;.md-editor-preview-wrapper {padding: 0 1rem;}}.icon-edit {position: absolute;right: 0.5rem;bottom: 0;transform: translateY(-50%);display: none;}.icon-copy {position: absolute;right: 1.8rem;bottom: 0;transform: translateY(-50%);display: none;}.icon-delete {position: absolute;right: 0.5rem;bottom: 0;transform: translateY(-50%);display: none;}}}}.input-container {max-width: 70rem;width: 80%;height: 6rem;position: fixed;bottom: 1rem;left: 50%;transform: translateX(-50%);background-color: #fff;border-radius: 1rem;&:focus-within {box-shadow: 0 0 1rem 0.1rem #888888;}textarea {outline: none;border: none;padding: 0.6rem;font-size: 1.2rem;resize: none;width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 1rem;}.tip {font-size: 0.6rem;position: absolute;right: 1rem;bottom: 0.5rem;}.icon-send {font-size: 1.5rem;position: absolute;right: 1rem;bottom: 2rem;cursor: pointer;}}
}
</style>

效果展示

安装启动Ollama
在这里插入图片描述

问答演示1
在这里插入图片描述

问答演示2
在这里插入图片描述

问答演示3
在这里插入图片描述

源码下载

搭建自己的GPT


http://www.ppmy.cn/news/1516687.html

相关文章

Docker Desktop镜像路径修改一直报错

一 点击Apply & Restart报错 [Window Title] Docker Desktop[Main Instruction] Error migrating WSL disk[Content] An error occurred while migrating the Docker Desktop WSL data disk to its new location:moving disk file: rename C:\Users\Lenovo\AppData\Local\D…

equals ,hashcode ,== ,三者之间的关系与区别

为什么要重写 equals 和hashcode 在Java中&#xff0c;重写equals方法和hashCode方法是为了确保对象在逻辑上相等时&#xff0c;它们在集合&#xff08;如HashMap、HashSet&#xff09;中的行为也是一致的。 以下是详细解释&#xff1a; 为什么要重写 equals 方法 默认行为&a…

博弈论(Nim游戏的扩展)

公平组合游戏ICG 若一个游戏满足: 1.由两名玩家交替行动; 2.在游戏进程的任意时刻&#xff0c;可以执行的合法行动与轮到哪名玩家无关; 3.不能行动的玩家判负; 则称该游戏为一个公平组合游戏。 NIM博弈属于公平组合游戏&#xff0c;但城建的棋类游戏&#xff0c;比如围棋&…

Python算法工程师面试整理-概率与统计

1. 概率论 ● 基本概念: ○ 样本空间:所有可能结果的集合。 ○ 事件:样本空间的子集。 ○ 概率:事件发生的可能性,值在[0,1]之间。

【机器学习】实验设计之一次一因子方法(OFAT)、全因子设计方法(FFD)响应面方法(RSM)和插值方法以及如何选择控制因子的概念

引言 “一次一因子”&#xff08;One-Factor-At-a-Time&#xff0c;OFAT&#xff09;是一种经典的实验设计方法&#xff0c;用于分析模型中的每个输入因子&#xff08;特征或变量&#xff09;对响应变量&#xff08;目标或结果&#xff09;的影响 全因子设计&#xff08;Full F…

前端面试题 webpack的工作流程

一、流程图 二、重要概念 1.entry入口&#xff1a; Webpack 从配置的入口点开始&#xff0c;分析应用程序的依赖关系 2.output出口&#xff1a; 定义了打包后的文件如何输出&#xff0c;包括文件名和输出路径。 3.loader加载器&#xff1a; Webpack 本身只能处理 JavaScr…

扁形电容器与圆柱形电容器的性能区别

在现代电子设备中&#xff0c;电容器的角色不可或缺。它们不仅用于存储电能&#xff0c;还担负着过滤、耦合和阻抗匹配等多重功能。市场上主要有扁形电容器和圆柱形电容器两种类型&#xff0c;各自具备独特的优势和应用场景。 扁形电容器和圆柱形电容器在性能上存在显著差异&am…

Adobe Illustrator矢量绘图软件win/mac软件下载安装

一、软件概述 1.1 Adobe Illustrator简介 Adobe Illustrator是一款由Adobe Systems开发的强大矢量绘图软件&#xff0c;专为设计师、艺术家及图形专家设计。它广泛应用于平面设计、插画、UI设计、图标设计、排版及数字媒体制作等领域。Illustrator以其独特的矢量图形处理能力…

如何构建一个Java SpringBoot法律援助平台:从设计到实现全解析

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

完成客户端/浏览器可以请求到控制层

文章目录 1.创建Controller和自定义注解1.目录2.MonsterController.java 怪物控制器3.Controller.java 自定义Controller注解4.RequestMapping.java 自定义RequestMapping注解 2.dom4j解析sunspringmvc.xml1.XMLParser.java2.sunspringmvc.xml3.XMLParserTest.java4.结果 3.开发…

编程学习之路上的挫折:如何在Bug迷宫中找到出口

在编程学习的道路上&#xff0c;每个程序员都会经历挫折。那些无法调试的错误、复杂的算法题、永远跑不通的代码&#xff0c;都像一道道难以逾越的高墙&#xff0c;阻挡着我们的前进。面对这些挫折&#xff0c;很多人感到迷茫、沮丧&#xff0c;甚至产生了放弃的念头。然而&…

Hiprint 打印插件在 Vue3 中的深度剖析

一、Hiprint 打印插件简介 Hiprint 打印插件在 Vue3 项目中具有重要的地位和显著的优势。 首先&#xff0c;它为 Vue3 项目提供了强大且便捷的打印功能。在现代的 Web 应用开发中&#xff0c;打印需求常常存在&#xff0c;而 Hiprint 很好地满足了这一需求&#xff0c;让开发…

RPC 运行时,第二次:发现新的漏洞

介绍 2022 年 4 月 12 日,微软发布了针对远程过程调用 (RPC) 运行时库 (rpcrt4.dll) 中三个漏洞的补丁。这些漏洞的 CVE 编号为:CVE-2022-26809、CVE-2022-24492和CVE-2022-24528。受影响的操作系统包括 Windows 7、8、10 和 11,以及 Windows Server 2008、2012、2019 和 2…

Stm32通过SPI读写W25QXX

Printf的重定向 因为printf是c中的库函数&#xff0c;要使用printf输出到串口&#xff0c;需要重定向&#xff0c;将printf定向到HAL_UART_Transmit。 新建一个retarget.c文件。 #include "stdio.h" #include "stm32f1xx_hal.h" #include "usart.h&…

黄金市场展望:CPI数据引发关注,技术面看涨

亚市现货黄金行情 8月14日周三&#xff0c;亚市盘中现货黄金价格小幅下跌&#xff0c;目前交投在2462美元/盎司附近。投资者将重点关注即将公布的美国消费者物价指数&#xff08;CPI&#xff09;数据&#xff0c;预计这将对黄金市场产生重大影响。 美联储政策预期与CPI数据 市场…

ubuntu 安装opencv(3.4.16)

查看版本&#xff0c;终端 opencv_version卸载 sudo apt-get remove libopencv-dev sudo apt-get autoremove sudo rm -rf /usr/local/include/opencv4 sudo rm -rf /usr/local/lib/libopencv* sudo rm -rf /usr/local/bin/opencv* sudo rm -rf /usr/local/share/opencv4 安…

探索贪心算法:解决优化问题的高效策略

贪心算法是一种在每一步选择中都采取当前最佳选择的算法&#xff0c;以期在整体上达到最优解。它广泛应用于各种优化问题&#xff0c;如最短路径、最小生成树、活动选择等。本文将介绍贪心算法的基本概念、特点、应用场景及其局限性。 贪心算法的基本概念 贪心算法的核心思想是…

centos安装mysql8.0版本,并且实现远程连接

一、 卸载mysql 查看mysql安装情况 rpm -qa | grep -i mysql 删除上图中所有信息 rpm -ev mysql-community-release-el7-5.noarch --nodeps 再次查询&#xff0c;没有数据&#xff0c;则为删除干净 find / -name mysql rm -rf /var/lib/mysql 将机器上的所有mysql相关文…

el-input按回车 界面自动刷新

el-input按回车 界面自动刷新 先解释一下时间冒泡 事件冒泡&#xff08;Event Bubbling&#xff09;是事件处理的一种机制&#xff0c;它描述了事件从最具体的元素&#xff08;如一个按钮或链接&#xff09;开始&#xff0c;然后逐级向上转播至不那么具体的节点的过程。 在事…

mysql的聚簇索引、非聚簇索引、回表

1.聚簇索引和非聚簇索引 聚簇索引&#xff08;聚集索引&#xff09;&#xff1a;数据和索引放在一起&#xff0c;B树的叶子节点存放了整行数据&#xff0c;有且只有一个。 【主键索引和唯一索引&#xff0c;主键唯一&#xff0c;存放的是主键对应的整行数据】非聚簇索引&#…