调用本地大模型API 以ollama为例子 技术栈node.js koa2 vite

news2025/1/11 10:16:48

首先在官方下载ollama大模型

https://ollama.com/

在cmd中查看版本 ollama -v 看到有版本号,说明安装完成。

在这里插入图片描述
下载合适的大模型 运行内存16g 建议 7b 左右的大模型,16g以上自己合理安排 点击官网模型下载合适的大模型 复制粘贴到cmd中 下载完成后 ollama list 查看版本
在这里插入图片描述
在这里插入图片描述
命令 ollama run llama3.1 现在可以在控制台对话了

第二部 调用ollama的本地IP 可以查看官网
主要参数:

curl http://localhost:11434/api/chat -d '{
  "model": "llama3",
  "messages": [
    {
      "role": "user",
      "content": "why is the sky blue?"
    }
  ],
  "stream": false
}'

这是koa2的主要中间件

{
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js"
  },
  "dependencies": {
    "axios": "^1.7.4",
    "koa": "^2.15.3",
    "koa-bodyparser": "^4.4.1",
    "koa-router": "^12.0.1",
    "nodemon": "^3.1.4"
  }
}


在这里插入图片描述

完整代码

const koa = require("koa");
const app = new koa();

const Router = require("koa-router");
const router = new Router();
const axios = require("axios");

const bodyParser = require("koa-bodyparser");
app.use(bodyParser());

router.post("/chatai", async (ctx) => {
  const { message } = ctx.request.body;
  console.log(message);

  const data = {
  // 你应运行那个模型参数 就用哪个模型参数
    model: "llama3",
    messages: [
      {
        role: "user",
        content: message,
      },
    ],
    stream: false,
  };

  const response = await axios
    .post("http://localhost:11434/api/chat", data)
    .then((response) => {
      console.log(response.data.message.content);
      ctx.body = response.data.message.content;
    })
    .catch((error) => {
      console.error(error);
    });
});

app.use(router.routes());

app.listen(3001, () => {
  console.log("Server is running on port http://localhost:3001");
});


前端实现代码:
在这里插入图片描述

<template>
  <div class="chat-container" v-loading="loading">
    <p class="chat-title">我是本地大模型 套壳ai</p>
    <div
      v-for="(item, index) in conversation"
      :key="index"
      class="chat-message"
    >
      <div class="chat-question">
        <el-tag size="large">me:</el-tag>{{ item.question }}
      </div>

      <div class="chat-answer">
        {{ item.answer }}<el-tag size="large">ai:</el-tag>
        <el-tag
          size="large"
          type="success"
          @click="readAnswer"
          style="cursor: pointer"
          >朗读</el-tag
        >
      </div>
    </div>
    <div class="chat-input">
      <el-input
        type="text"
        v-model="question"
        @keyup.enter="askQuestion"
      ></el-input>
      <el-button @click="askQuestion">提交</el-button>
    </div>
    <div v-if="loading" class="loading-container">
      <p>加载中...</p>
    </div>
  </div>
</template>

<script setup>
import { ChatApi } from "../utils/api";
import { ref, onMounted } from "vue";

const question = ref("");
const conversation = ref([]);
const loading = ref(false);

async function askQuestion() {
  if (!question.value.trim()) {
    return; // 如果问题为空,则不执行任何操作
  }

  // 将用户的问题添加到对话历史中
  conversation.value.push({ question: question.value, answer: "等待回答..." });

  try {
    loading.value = true; // 开始加载
    const message = `你是一个聪明的机器人,我想知道:${question.value}`;
    const response = await ChatApi({ message });
    console.log("Ollama response:", response.data);
    // 更新对话历史中的答案
    conversation.value[conversation.value.length - 1].answer = response.data;
    // 将更新后的对话存储在localStorage中
    localStorage.setItem("conversation", JSON.stringify(conversation.value));
  } catch (error) {
    console.error("Error invoking Ollama:", error);
    // 在对话历史中显示错误信息
    conversation.value[conversation.value.length - 1].answer =
      "发生错误,请重试。";
  } finally {
    loading.value = false; // 加载完成
    question.value = "";
  }
}

function readAnswer() {
  

}

onMounted(() => {

  // 从localStorage中读取对话数据
  const storedConversation = localStorage.getItem("conversation");
  if (storedConversation) {
    conversation.value = JSON.parse(storedConversation);
  }
});
</script>

<style lang="css" scoped>
.chat-container {
  position: relative;
  box-sizing: border-box;
  width: 1200px;
  height: 600px;
  margin: 0 auto;
  background-color: #f5f5f5;
  border-radius: 10px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.chat-title {
  text-align: center;
  font-size: 24px;
  font-weight: bold;
  margin-top: 30px;
  margin: 0 auto;
}
.chat-message {
  position: relative;
  margin: 20px auto;
  padding: 10px;
  max-width: 80%;
  border-radius: 10px;
  background-color: #fff;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.chat-question {
  font-size: 16px;
  font-weight: bold;
  margin-bottom: 5px;
}
.chat-answer {
  font-size: 16px;
  font-weight: bold;
  margin-bottom: 5px;
  /* 右对齐 */
  text-align: right;
}
.chat-input {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 60px;
  margin: 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 20px;
  background-color: #fff;
  border-top: 1px solid #eee;
  border-radius: 0 0 10px 10px;
}
.chat-input > * {
  margin: 0 10px;
}
.loading-container {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-size: 24px;
  font-weight: bold;
  color: #999;
}
.el-input__inner {
  width: 100%;
}
</style>


代码还有不足,希望一起diy吧

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

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

相关文章

学习嵌入式入门(十一)电容触摸实验及OLED 显示实验

一、电容触摸实验 1.电容触摸按键简介 电容式触摸按键已经广泛应用在家用电器、消费电子市场&#xff0c;其主要优势有&#xff1a;无机械装置&#xff0c; 使用寿命长&#xff1b;非接触式感应&#xff0c;面板不需要开孔&#xff1b;产品更加美观简洁&#xff1b;防水可以做…

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm&#xff0c;其他软件也是一样操作 1、进入到pycharm的目录&#xff0c;先通过命令行打开pycharm&#xff1a; ./bin/pycharm…

Vscode——如何实现 Ctrl+鼠标左键 跳转函数内部的方法

一、对于Python代码 安装python插件即可实现 二、对于C/C代码 安装C/C插件即可实现

LATTICE进阶篇DDR2--(4)DDR2 IP核总结

一、IP核的时钟框架 1片DDR2的接口是16位&#xff0c;且DDR2是双边沿读取的&#xff0c; 故当DDR2芯片的时钟为200M时&#xff0c;右侧DDR2芯片上的数据吞吐率为200M*2*16b&#xff0c;左侧数据吞吐率为200M*32b&#xff0c;左右两侧数据吞吐量相等。 根据上规律可知&#xf…

Java Spring|day2.SpringMVC

Spring MVC 定义 MVC是一种设计模式&#xff0c;在这种模式下软件被分为三层&#xff0c;即Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09;。 MVC是一种软件架构思想&#xff0c;把软件按照模型&#xff…

CSS设置文本超出显示省略号

一、单行文本显示省略号 <div class"box"><p>测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本…

用于不平衡医疗数据分类的主动SMOTE

一、主动学习如何应用于不平衡数据的处理 首先&#xff0c;主动SMOTE不是像经典的SMOTE那样从训练集中随机选择一个样本作为生成合成样本的轴心点&#xff0c;而是通过不确定性和多样性采样来智能地进行样本选择&#xff0c;这是主动学习的两种技术。 在数据不平衡的情况下&…

2024.8完善版 NineAi-ChatGPT系统源码

Nine AI.ChatGPT是基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代…

Vue2中watch与Vue3中watch对比

上一节说到了 computed计算属性对比 &#xff0c;虽然计算属性在大多数情况下更合适&#xff0c;但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法&#xff0c;来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时&#…

【策略模式】设计模式系列:在Java中实现灵活的行为选择(实战指南)

文章目录 策略模式&#xff1a;在Java中实现灵活的行为选择引言1. 策略模式的组成1.1 抽象策略 (Strategy)1.2 具体策略 (Concrete Strategy)1.3 上下文 (Context)1.4 UML类图和时序图 2. 策略模式在Java中的实现步骤一&#xff1a;定义抽象策略接口步骤二&#xff1a;创建具体…

[LitCTF 2024]exx

输入任意账号密码进行抓包 考查xxe漏洞 我们加入xxe语句并让它回显我们要它会显的东西&#xff1a;先来读取一下用户名和密码 我们可以看到&#xff0c;它已经读取了服务器下的账号密码文件&#xff0c;接着我们直接读取根目录下的flag文件。通常情况下flag文件的位置一般就根…

CompletableFuture——异步编程艺术

目录 1、CompletableFuture是什么&#xff1f; 2、CompletableFuture和Future、CompletionStage的关系&#xff1f; 3、CompletableFuture常用方法 3.1、 创建 CompletableFuture 实例 3.2、完成时触发thenApply、thenAccept、thenRun 3.3、组合多个 CompletableFuture 3…

C语言中的栈

一、栈的定义&#xff1a; 就是只能表的一端操作的顺序表或链表&#xff0c;允许操作的那一端成为栈顶元素&#xff0c;与之相对应的另一端称为栈底元素。 我们向栈里存入元素称为压栈&#xff0c;即最先放入的元素存放在栈底&#xff0c;最后放入的元素存放在栈顶。 我们将…

怿星科技与您相约——2024 Testing Expo

汽车测试及质量监控博览会(中国)Testing Expo China-Automotive 怿星科技展位路线 届时欢迎莅临2057号展台&#xff01;

OpenCV图像滤波(16)应用分离式滤波器函数sepFilter2D()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对图像应用分离式线性滤波器。 该函数对图像应用分离式线性滤波器。首先&#xff0c;src 的每一行都用 1D 内核 kernelX 进行滤波。然后&#x…

爬虫 Web Js 逆向:RPC 远程调用获取加密参数(1)WebSocket 协议介绍

RPC (Remote Procedure Call) 是远程调用的意思。 在 Js 逆向时&#xff0c;本地可以和浏览器以服务端和客户端的形式通过 WebSocket 协议进行 RPC 通信&#xff0c;这样可以直接调用浏览器中的一些函数方法&#xff0c;不必去在意函数具体的执行逻辑&#xff0c;可以省去大量…

计算机网络面试题汇总

文章目录 计算机网络基础计算机网络体系结构(网络分层模型)OSI 七层模型是什么?每一层的作用是什么?TCP/IP 四层模型是什么?每一层的作用是什么?五层体系结构以及对应的协议为什么网络要分层,分层的好处?常见网络协议有哪些,每一层常见协议有哪些?应用层有哪些常见的协…

【网编】——tcp编程

tcp流程 服务器 头文件&#xff1a; #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <errno.h> #include<stdio.h> #include <netinet/in.h> #include <netinet/ip.h> /* superset of previous */ #…

链接Mysql 报错connection errors; unblock with ‘mysqladmin flush-hosts‘错误的解决方法!亲测有效!

文章目录 前言一、使用 mysqladmin flush-hosts 命令解锁 IP 地址二、增加 max_connect_errors 参数三、检查连接错误的原因 前言 今天正常的对各大的测试服进行重启的时候发现每台服务器都启动失败&#xff01;查看日志发现每台服务器都报一下的错误 java.sql.SQLException:…

分布式光伏管理系统具有什么功能?有推荐吗?

1、项目进度管理 分布式光伏管理系统能够全面管理项目的进度&#xff0c;从初步沟通、收资踏勘、设计、施工到并网发电的全流程。系统通过可视化的项目进度管理工具&#xff0c;展示每一步的完成情况&#xff0c;包括员工跟进记录、关键节点时间等&#xff0c;帮助管理者从宏观…