vue3怎么和大模型交互?

打印 上一主题 下一主题

主题 932|帖子 932|积分 2796

弁言

平常我们都是用的在线的AI工具,直接输入题目,然后AI回答我们,那么怎么把AI接入项目中呢?
这个题目问得好。


  • 方案一:引入第三方已封装好的UI库
  • 方案二:自己写
对于方案一,市面上已有一些,大家可自己搜刮,雷同于Ant Design X(React/Vue)等,本日主讲方案二。
封装

   本组件示例仅提供交互思路,样式啥的自己封装。
  先看下结果图

可以看到,我们输入了一个题目,然后AI就会不断地给我们推送消息,消息是流式的stream,我们要做的就是把这些流式消息不断地渲染在页面上。
假如等返回后只渲染一次,那么用户等候时间太长了,体验感欠好,你懂得~
由于返回的内容是markdown格式的,所以我们还要引入markdown-it组件来美化显示。
  1. pnpm add markdown-it
复制代码
还要安装openai来请求
  1. pnpm add openai
复制代码
完整的组件在最下方,大家可以可以自己填入大模型的API地址和KEY值
   但是这样做会有风险,那就是API地址和KEY值容易泄露,所以最好还是封装在后端,改为直接请求后端API地址
  

同时你还可以给系统设定角色,可以这样写(role: ‘system’,是角色参数,需要放在第一位):
  1. const stream = await client.chat.completions.create({
  2.   model: MODEL_NAME,
  3.   messages: [
  4.     {
  5.       role: 'system',
  6.       content: '你是一个经验丰富的历史老师,可以引经据典给学生讲解各种历史知识'
  7.     },
  8.     {
  9.       role: 'user',
  10.       content: inputText.value
  11.     }
  12.   ],
  13.   // 设为流式
  14.   stream: true,
  15. });
复制代码
完整组件代码如下:
  1. <template>
  2.   <div class="app-container">
  3.     <input v-model="inputText" placeholder="请输入你的问题" />
  4.     <button @click="sendMessage">发送</button>
  5.     <div class="main-content" v-if="responseText" v-html="renderedMarkdown"></div>
  6.   </div>
  7. </template>
  8. <script setup>
  9. import { ref, computed } from 'vue';
  10. import MarkdownIt from 'markdown-it';
  11. // 配置 API Key,这里可以根据实际情况进行修改
  12. const API_KEY = '你的API key值';
  13. const API_URL = '你的API 请求地址';
  14. // 模型名称,如果API和KEY可以确定模型,那么这个模型不生效
  15. const MODEL_NAME = 'qwq-32b';
  16. // 定义输入框内容和响应文本的响应式变量
  17. const inputText = ref('');
  18. const responseText = ref('');
  19. import OpenAI from "openai";
  20. const client = new OpenAI({
  21.   baseURL: API_URL,
  22.   apiKey: API_KEY,
  23.   dangerouslyAllowBrowser: true,
  24. });
  25. // 创建 markdown-it 实例
  26. const md = new MarkdownIt();
  27. // 计算属性,将 responseText 转换为 HTML
  28. const renderedMarkdown = computed(() => {
  29.   return md.render(responseText.value);
  30. });
  31. // 发送消息封装
  32. async function sendMessage() {
  33.   try {
  34.     const stream = await client.chat.completions.create({
  35.       model: MODEL_NAME,
  36.       messages: [
  37.         {
  38.           role: 'user',
  39.           content: inputText.value
  40.         }
  41.       ],
  42.       // 设为流式
  43.       stream: true,
  44.     });
  45.     for await (const chunk of stream) {
  46.       console.log('chunk', chunk)
  47.       responseText.value += chunk.choices[0]?.delta?.content || '';
  48.     }
  49.   } catch (error) {
  50.     console.log('请求出错', error)
  51.   }
  52. }
  53. </script>
  54. <style scoped>
  55. /* 可以根据需要添加样式 */
  56. .app-container {
  57.   padding: 20px;
  58. }
  59. .main-content {
  60.   background-color: #f9fafb;
  61.   border: 1px solid #e5e7eb;
  62.   border-radius: 8px;
  63.   padding: 20px;
  64. }
  65. input {
  66.   margin-right: 10px;
  67. }
  68. </style>
复制代码
附Ant Design X的UI界面,确实好看些


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表