探索AI的无限可能,体验智能对话的未来,大模型 API 演示

news2025/4/21 14:24:54

探索AI的无限可能,体验智能对话的未来,大模型 API 演示

效果展示:

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

项目概述

这是一个基于 Vue 3 + TypeScript + Vite 构建的 Vista AI 演示项目,旨在提供一个简洁易用的界面来展示 Vista AI 大语言模型的能力。项目包含 API 演示和交互式游戏两个主要功能模块,同时支持两种不同风格的 API 调用方式。

📢 最新更新

  • 2025.03.25: 游戏UI全面升级,添加游戏结束机制

    • 实现了游戏进度达到100%时的结束机制,展示成就消息
    • 全新设计的场景描述和对话内容卡片,采用渐变背景和动态效果
    • 优化了游戏界面的视觉层次和用户体验
    • 添加了响应式UI元素,确保在各种设备上都有良好表现
    • 完善了文档说明,便于开发者进行二次开发
  • 2025.03.23: 优化自动滚动机制,提升聊天体验

    • 实现了智能自动滚动机制,新消息到达时自动滚动至底部
    • 当用户手动滚动查看历史消息时,暂停自动滚动功能
    • 当用户滚动回底部后,自动恢复滚动功能
    • 添加平滑滚动效果,优化视觉体验
    • 修复了在某些情况下滚动失效的问题
  • 2025.03.21: 添加了文本生成终止功能,增强用户控制

    • 实现了在AI生成回答过程中随时终止生成的功能
    • 添加了明显的视觉标识,被手动终止的消息会显示"回答已被手动停止"
    • 使用AbortController API实现请求中断,确保资源释放
    • 优化了用户界面,在AI生成内容时显示"停止生成"按钮
    • 完善了相关API文档和使用说明
  • 2025.03.20: 修复了消息重复发送问题,优化了用户体验

    • 修复了消息重复发送的问题,确保每次点击发送按钮只会发送一次消息
    • 改进了示例问题功能,使其只设置输入内容而不自动发送,增强用户控制
    • 添加了防重复点击机制,避免用户多次点击导致的重复请求
    • 为输入框添加了ID标识,优化了DOM元素的可访问性
    • 优化了消息发送过程中的UI反馈,提供更好的视觉提示
  • 2025.03.19: 修复了消息重复发送问题,优化了API调用逻辑

    • 修复了每次发送消息时会重复发送数据的bug
    • 统一了消息管理机制,确保每条消息只被添加一次
    • 提高了API响应速度和资源利用率
    • 增强了用户界面的流畅度和稳定性

🚀 功能特性

  • 🛑 终止生成:支持在AI生成回答过程中随时终止,保留已生成内容
  • ✨ 流式输出:实时展示 AI 生成内容,提供更好的用户体验
  • 🤔 思维链展示:查看模型的推理过程,深入了解模型如何思考
  • 🔌 双风格 API:支持 OpenAI 兼容格式和 ai.createModel 风格的接口
  • ⚙️ 完全可配置:支持调整各种参数,如温度、最大生成长度等
  • 🎮 互动游戏:基于大语言模型的交互式游戏演示
  • 🎨 精美 UI:基于 Tailwind CSS 构建的现代化 UI 界面
  • 📱 智能滚动:优化的自动滚动机制,提供更自然的对话体验
  • 🏆 游戏目标:多维进度系统,任一指标达到100%时触发游戏结束

🏗 项目结构

vue-blog-demo/
├── public/             # 静态资源
├── src/
│   ├── assets/         # 项目资源文件
│   │   ├── DeepseekDemo.vue  # Deepseek API 演示组件
│   │   ├── GiaoGame.vue      # 交互式游戏组件
│   │   ├── HomePage.vue      # 主页组件
│   │   └── ...
│   ├── docs/           # 文档文件
│   ├── examples/       # 示例代码
│   ├── hooks/          # 自定义 Vue Hooks
│   ├── router/         # 路由配置
│   ├── services/       # 服务层
│   │   ├── DeepseekClient.ts   # OpenAI 风格客户端
│   │   ├── DeepseekAdapter.ts  # 适配器风格接口
│   │   └── ...
│   ├── stores/         # Pinia 状态管理
│   ├── views/          # 页面视图组件
│   │   ├── HomeView.vue       # 首页视图
│   │   ├── ApiDemoView.vue    # API 演示视图
│   │   └── GameView.vue       # 游戏演示视图
│   ├── App.vue         # 应用入口组件
│   └── main.ts         # 应用入口文件
├── index.html          # HTML 入口文件
├── vite.config.ts      # Vite 配置文件
├── tailwind.config.js  # Tailwind CSS 配置
└── ...

💡 技术亮点

1. 双重 API 设计模式

项目提供了两种风格的 API 调用方式,使开发者可以根据自己的喜好选择:

DeepseekClient:OpenAI 兼容格式
import DeepseekClient from './services/DeepseekClient';

// 创建客户端
const client = new DeepseekClient({
  apiKey: 'your-api-key',
  baseURL: 'your-api-endpoint',
  model: 'deepseek-r1'
});

// 创建聊天完成请求
const stream = await client.chat.completions.create({
  messages: [
    { role: 'user', content: '请介绍一下李白' }
  ],
  stream: true
});

// 处理流式响应
for await (const chunk of stream) {
  // 处理思维链内容
  const reasoning = chunk.choices?.[0]?.delta?.reasoning_content;
  if (reasoning) console.log('思考:', reasoning);

  // 处理生成内容
  const content = chunk.choices?.[0]?.delta?.content;
  if (content) console.log('回答:', content);
}
DeepseekAdapter:ai.createModel 风格
import ai from './services/DeepseekAdapter';

// 创建模型
const aiModel = ai.createModel("deepseek", {
  apiKey: 'your-api-key',
  baseURL: 'your-api-endpoint'
});

// 流式文本生成
const res = await aiModel.streamText({
  model: "deepseek-r1",
  messages: [
    { role: "user", content: "你好,请介绍一下李白" },
  ],
});

// 流式处理响应
for await (let data of res.dataStream) {
  // 打印思维链内容
  const think = data?.choices?.[0]?.delta?.reasoning_content;
  if (think) console.log('思维过程:', think);

  // 打印生成文本内容
  const text = data?.choices?.[0]?.delta?.content;
  if (text) console.log('生成内容:', text);
}

2. 精细的流式输出处理

项目实现了高效的流式输出处理机制,能够区分普通输出内容和思维链内容,并通过优雅的UI界面展示:

// DeepseekClient.ts 中的流式处理示例
private processStreamPart(json: any): any {
  try {
    // 处理特殊字段,包括思维链
    if (json.choices && json.choices[0].delta) {
      const delta = json.choices[0].delta;
      
      // 识别并处理思维链内容
      if (delta.reasoning_content !== undefined) {
        // 这里是思维链内容的处理
        // ...
      }
      
      // 处理普通输出内容
      if (delta.content !== undefined) {
        // 这里是普通内容的处理
        // ...
      }
    }
    
    return json;
  } catch (e) {
    console.error('处理流部分时出错:', e);
    return json;
  }
}

3. 精美的 UI 动效实现

项目中的 UI 动效设计精良,特别是 HomePage 组件中的卡片悬停效果实现:

<!-- 悬停动效示例 -->
<div @click="goToDemo" class="group cursor-pointer relative overflow-hidden">
  <div class="absolute inset-0 bg-gradient-to-r from-purple-500/20 to-blue-500/20 opacity-0 group-hover:opacity-100 transition-all duration-500 ease-out rounded-2xl"></div>
  <div class="relative bg-white p-8 rounded-2xl shadow-lg border border-gray-100 group-hover:translate-y-[-2px] group-hover:shadow-purple-100/50 group-hover:shadow-xl group-hover:border-purple-100 transition-all duration-500 ease-out">
    <div class="absolute top-0 left-0 w-full h-1 bg-gradient-to-r from-purple-500 to-blue-500 transform scale-x-0 group-hover:scale-x-100 transition-transform duration-500 ease-out"></div>
    <!-- 内容 -->
  </div>
</div>

这种实现使用了 Tailwind CSS 的 group 功能和复合动画,创建了多层次的视觉效果:

  1. 背景渐变效果从透明渐变为可见
  2. 卡片微妙上移并增加阴影
  3. 顶部彩色条从左到右延展
  4. 文字颜色平滑变换

4. 高级游戏逻辑实现

GiaoGame 组件中的游戏逻辑采用了基于大语言模型的状态管理,通过结构化游戏状态和 AI 响应解析实现复杂交互:

// 游戏状态接口
interface GameState {
  player: {
    health: number;
    energy: number;
    inventory: string[];
    location: string;
  };
  environment: {
    description: string;
    availableActions: string[];
  };
  gameProgress: number;
  events: GameEvent[];
}

// 发送游戏指令到 AI
async function sendGameAction(action: string) {
  const response = await ai.generateText({
    model: modelName,
    messages: [
      { role: "system", content: gameSystemPrompt },
      { role: "user", content: `游戏状态: ${JSON.stringify(currentGameState)}\n玩家行动: ${action}` }
    ]
  });
  
  // 解析 AI 响应,更新游戏状态
  try {
    const jsonResponse = extractJsonFromResponse(response.choices[0].message.content);
    updateGameState(jsonResponse);
    renderGameInterface();
  } catch (error) {
    console.error("无法解析游戏响应", error);
    showErrorMessage("游戏响应格式错误,请重试");
  }
}

5. 终止生成功能实现

项目实现了灵活的终止生成功能,允许用户在AI输出过程中随时中断,提高了交互的自由度:

// useDeepseekApi.ts 中的终止生成实现
const stopGeneration = () => {
  if (isProcessing.value) {
    isProcessing.value = false;
    isLastMessageStopped.value = true; // 标记消息被手动终止
    
    if (abortController.value) {
      abortController.value.abort(); // 中断网络请求
      abortController.value = null;
    }
    
    streamProgress.value = 100;
    isThinking.value = false;
  }
};

// 在DeepseekClient.ts中集成AbortController
async chatCompletion(params: {
  messages: Array<{role: string; content: string}>;
  stream?: boolean;
  signal?: AbortSignal; // 添加终止信号
}): Promise<any> {
  const { messages, stream = false, signal } = params;
  
  // 构建请求参数
  const requestBody = {
    model: this.model,
    messages,
    temperature: this.temperature,
    max_tokens: this.maxTokens,
    stream
  };
  
  // 发送请求,传递终止信号
  const response = await fetch(`${this.baseURL}`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${this.apiKey}`
    },
    body: JSON.stringify(requestBody),
    signal // 传递AbortSignal
  });
  
  // 处理响应...
}

6. 智能滚动机制

项目实现了智能自动滚动机制,提供更自然的对话体验:

// 滚动处理函数
const handleScroll = () => {
  if (!chatContainer.value) return;
  
  const container = chatContainer.value;
  const isNearBottom = container.scrollHeight - container.scrollTop - container.clientHeight < 100;
  
  // 只有当用户滚动到接近底部时才启用自动滚动
  shouldAutoScroll.value = isNearBottom;
  
  // 清除现有定时器并设置新的定时器
  if (scrollTimer) {
    clearTimeout(scrollTimer);
  }
  
  // 短暂延迟后检查滚动状态
  scrollTimer = setTimeout(() => {
    const isStillNearBottom = container.scrollHeight - container.scrollTop - container.clientHeight < 100;
    shouldAutoScroll.value = isStillNearBottom;
  }, 150);
};

// 防抖处理的滚动到底部函数
const debouncedScrollToBottom = debounce((forceScroll = false) => {
  const container = chatContainer.value;
  if (!container) return;
  
  // 如果强制滚动或者应该自动滚动,则执行滚动
  if (forceScroll || shouldAutoScroll.value || isProcessing.value) {
    container.style.scrollBehavior = 'smooth';
    container.scrollTop = container.scrollHeight;
  }
}, 100);

7. 游戏结束系统

游戏结束系统实现了多维进度管理和成就展示:

// 游戏结束状态管理
const showGameOver = ref(false);
const gameOverTitle = ref('');
const gameOverMessage = ref('');
const gameOverType = ref('');

// 检查游戏进度是否达到结束条件
const checkGameProgress = () => {
  const { gaming, study, social } = progress.value.mainQuests;
  
  if (gaming >= 100) {
    showGameOver.value = true;
    gameOverTitle.value = '游戏达人';
    gameOverMessage.value = '我爸玩游戏得了MVP';
    gameOverType.value = 'gaming';
    return true;
  }
  
  if (study >= 100) {
    showGameOver.value = true;
    gameOverTitle.value = '学霸养成';
    gameOverMessage.value = '成功考入清北,前途无量';
    gameOverType.value = 'study';
    return true;
  }
  
  if (social >= 100) {
    showGameOver.value = true;
    gameOverTitle.value = '社交达人';
    gameOverMessage.value = '成为校园红人,人气爆棚';
    gameOverType.value = 'social';
    return true;
  }
  
  return false;
};

// 在处理选项影响时调用
const processImpact = (impact) => {
  if (impact.quest) {
    const { type, value } = impact.quest;
    progress.value.mainQuests[type] = Math.min(100, progress.value.mainQuests[type] + value);
  }
  
  if (impact.relationship) {
    // 处理关系变化
  }
  
  // 检查游戏是否结束
  checkGameProgress();
};

🔧 快速开始

安装依赖

pnpm install

开发模式

pnpm dev

构建生产版本

pnpm run build

📚 文档

详细的API文档和游戏开发指南可以在 docs 目录下找到:

  • API使用说明.md: Deepseek API 的完整使用文档
  • game-guide.md: 交互式游戏开发指南

用户体验优化

聊天界面体验优化

  • 实时响应显示:聊天消息发送后立即在对话内容区域显示,不再需要等待思考过程完成
  • 流畅滚动效果:新增平滑滚动,确保用户始终能看到最新生成的内容
  • 多重滚动保障:通过多层次滚动机制,解决长文本和复杂格式内容显示问题
  • 内容实时更新:AI回答生成时,内容区域实时更新并自动滚动至最新位置
  • 标签页自动切换:优化消息流转换逻辑,提供更加连贯的用户体验
  • AI思考状态展示:在对话气泡中直接显示AI思考状态,包含动画效果和提示信息
  • 双层思考提示:同时在页面顶部和最新AI消息中显示思考状态,提供清晰的视觉反馈

Deepseek模型支持

  • 流式输出支持:完整支持Deepseek模型的流式响应功能
  • 思维链展示:通过思维标签页查看AI的推理过程
  • 多模型支持:支持多种deepseek模型,包括deepseek-chat、deepseek-coder等
  • API风格选择:支持OpenAI兼容格式和自定义适配器两种调用风格

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

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

相关文章

26考研——图_图的存储(6)

408答疑 文章目录 二、图的存储图的存储相关概念邻接矩阵存储方式邻接矩阵的定义顶点的度计算邻接矩阵的特点邻接矩阵的局限性 应用场景邻接矩阵的幂次意义&#xff08;了解即可&#xff09; 邻接表存储方式邻接表定义邻接表结构邻接表的特点 邻接矩阵和邻接表的适用性差异十字…

datawhale组队学习--大语言模型—task4:Transformer架构及详细配置

第五章 模型架构 在前述章节中已经对预训练数据的准备流程&#xff08;第 4 章&#xff09;进行了介绍。本章主 要讨论大语言模型的模型架构选择&#xff0c;主要围绕 Transformer 模型&#xff08;第 5.1 节&#xff09;、详细 配置&#xff08;第 5.2 节&#xff09;、主流架…

《TCP/IP网络编程》学习笔记 | Chapter 21:异步通知 I/O 模型

《TCP/IP网络编程》学习笔记 | Chapter 21&#xff1a;异步通知 I/O 模型 《TCP/IP网络编程》学习笔记 | Chapter 21&#xff1a;异步通知 I/O 模型同步与异步同步异步对比同步 I/O 的缺点异步 I/O 的优点 理解异步通知 I/O 模型实现异步通知 I/O 模型WSAEventSelect 函数和通知…

Qt6相对Qt5的主要提升(AI总结)

我&#xff1a; Qt 6 相对于5 有哪些新功能&#xff1f; Qt 6 相对于 Qt 5 有诸多新功能和改进&#xff0c;以下是主要的新增特性&#xff1a; 1. 架构和核心库的重构 模块化设计&#xff1a;Qt 6 采用了更加灵活的模块化设计&#xff0c;开发者可以按需引入必要的功能模块&a…

MyBatis操作数据库进阶——动态SQL

动态 SQL 是根据程序运行时的条件灵活生成不同 SQL 语句‌的技术。它的核心目的是在不修改代码‌ 的前提下&#xff0c;通过条件判断、循环等逻辑&#xff0c;动态拼接 SQL 片段&#xff0c;解决传统 SQL 语句死板、难以应对复杂业务场景的问题。 一、<if> 标签 先来观…

使用LLama-Factory的简易教程(Llama3微调案例+详细步骤)

引言&#xff1a;一套快速实现 Llama3 中文微调的教程 主要参考&#xff1a;胖虎遛二狗的 B 站教学视频《【大模型微调】使用Llama Factory实现中文llama3微调》 ✅ 笔者简介&#xff1a;Wang Linyong&#xff0c;西工大&#xff0c;2023级&#xff0c;计算机技术 研究方向&am…

LabVIEW发电平台数据采集系统

本文详细介绍了基于LabVIEW的摇臂式波浪发电平台数据采集系统的设计与实现。通过整合LabVIEW软件与多种传感器技术&#xff0c;本系统能够有效提升数据采集的准确性和效率&#xff0c;为波浪能的利用和发电设备的优化提供科学依据。 ​ 项目背景 随着全球能源需求增长和环境保…

气象可视化卫星云图的方式:方法与架构详解

气象卫星云图是气象预报和气候研究的重要数据来源。通过可视化技术,我们可以将卫星云图数据转化为直观的图像或动画,帮助用户更好地理解气象变化。本文将详细介绍卫星云图可视化的方法、架构和代码实现。 一、卫星云图可视化方法 1. 数据获取与预处理 卫星云图数据通常来源…

【蓝桥杯】每日练习 Day7

目录 前言 领导者 分析 代码 空调 分析 代码 面包店 分析 代码 前言 今天是第一部分的最后一天&#xff08;主打记忆恢复术和锻炼思维&#xff09;&#xff0c;从明天开始主播会逐步更新从位运算到dp问题的常见题型。 领导者&#xff08;分类讨论&#xff09; 分析 …

本地部署Stable Diffusion生成爆火的AI图片

直接上代码 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…

从国家能源到浙江交通投资,全息技术在能源交通领域的创新应用

一、3D全息技术行业应用参数及设计制作要求 全息投影 全息投影技术通过激光器、全息片等设备&#xff0c;将物体的三维信息记录下来&#xff0c;并在特定条件下再现。应用参数包括投影距离、投影面积、投影亮度等。设计制作要求&#xff1a;高清晰度、高亮度、低噪音、稳定性好…

PageHiOffice网页组件(WebOffice文档控件)开发集成技巧专题一

PageHiOffice网页组件作为最新一代的WebOffice文档控件&#xff0c;这是目前市场上唯一能做到在Chrome等最新版浏览器中实现内嵌网页运行的商用文档控件&#xff0c;是OA及ERP等系统处理各种文档的福音。从发布到完善已经超过3年&#xff0c;不管是功能性还是稳定性都已经有了长…

本地安装deepseek大模型,并使用 python 调用

首先进入 ollama 官网 https://ollama.com/点击下载 下载完成后所有都是下一步&#xff0c;就可以 点击搜索 Models &#xff1a; https://ollama.com/search然后点击下载&#xff1a; 选择后复制: ollama run deepseek-r1:32b例如&#xff1a; 让它安装完成后&#xff1…

Android:蓝牙设置配套设备配对

一、概述 在搭载 Android 8.0&#xff08;API 级别 26&#xff09;及更高版本的设备上&#xff0c;配套设备配对会代表您的应用对附近的设备执行蓝牙或 Wi-Fi 扫描&#xff0c;而不需要 ACCESS_FINE_LOCATION 权限。这有助于最大限度地保护用户隐私。使用此方法执行配套设备&am…

Python 变量作用域、global 关键字与闭包作用域深度解析 第三部分

## 三、闭包作用域的存在原因及适用场景 ### 3.1 闭包作用域存在的原因 #### 3.1.1 数据封装与隐藏 闭包可以把数据封装在外部函数的作用域中&#xff0c;只有内部函数能够访问这些数据&#xff0c;这有助于实现数据的隐藏和保护。 python def counter(): count 0 def incre…

zookeeper使用

下载 官网 链接 1. 2. 然后解压&#xff1a; 启动 先复制一份这个文件&#xff0c; 双击启动 默认占用8080&#xff0c;和Tomcat冲突&#xff0c; 解决方法&#xff1a;链接 然后重启

使用BootStrap 3的原创的模态框组件,没法弹出!估计是原创的bug

最近在给客户开发一个CRM系统&#xff0c;其中用到了BOOTSTRAP的模态框。版本是3。由于是刚开始用该框架。所以在正式部署到项目中前&#xff0c;需要测试一下&#xff0c;找到框架中的如下部分。需要说明的是。我用的asp.net mvc框架开发。测试也是在asp.net mvc环境下。 复制…

【Azure 架构师学习笔记】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Networking】系列。 前言 最近公司的安全部门在审计云环境安全性时经常提到service endpoint&#xff08;SE&#xff09;和priavate endpoint&#xff08;PE&#xff09;的术语&#xff0c;为此做了一些研究储备。 云…

Excel第41套全国人口普查

2. 导入网页中的表格&#xff1a;数据-现有链接-考生文件夹&#xff1a;网页-找到表格-点击→变为√-导入删除外部链接关系&#xff1a;数据-点击链接-选中连接-删除-确定&#xff08;套用表格格式-也会是删除外部链接&#xff09;数值缩小10000倍&#xff08;除以10000即可&am…

VUE2导出el-table数据为excel并且按字段分多个sheet

首先在根目录下建一个文件夹export用来存储export.js import * as XLSX from xlsxfunction autoWidthFunc(ws, data) {// 设置每列的最大宽度const colWidth data.map(row > row.map(val > {var reg new RegExp([\\u4E00-\\u9FFF], g) // 检测字符串是否包含汉字if (v…