前端项目如何引入大语言模型

引言

关于前端项目引入大语言模型,需分为4步
注意:⚠️ 此方式会将 API Key 暴露在浏览器中,任何人都可以通过开发者工具查看,所以请勿将项目部署到公网,仅供本地开发使用。

步骤

一、创建 api key

在模型官网上面注册账号并创建api key

  1. 什么是api key? -- 它是程序访问某个服务器的"钥匙",发送请求时要带上它
  2. 如何创建? -- 可直接搜索"大模型名字+api key"

二、创建.env文件

  1. 在哪里创建? -- 项目根目录下

  2. 为什么要创建.env文件? -- 添加api key

  3. 怎么写.env文件? -- VITE_平台名_KEY=api key,如VITE_DEEPSEEK_KEY

    (1)将api key换成我们生成的api key,通常以sk-开头

    (2) VITE_平台名_KEY=api key不一定适用,需查对应构建工具的写法

三、发送请求

javascript 复制代码
await fetch("/api/compatible-mode/v1/chat/completions", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${import.meta.env.VITE_平台名_KEY}`,
    },
    body: JSON.stringify(params),
  });
  1. 为什么用fetch发送请求? -- fetch原生支持流式读取,代码更直观。用axios不方便,需要添加其他配置项

  2. params需根据官方资料写,博主见到的一般是这种

    css 复制代码
    {
        messages: [{ role: "user", content: "Hello" }],
        model: 所使用模型的完整名称
    }
    ​
    // 还需自查所使用的大模型的开启流式输出的写法
解决跨域问题

设置代理服务器,以下是前端构建工具为vite时的写法

javascript 复制代码
// 在vite.config.js文件中
// 添加如下配置项
  server: {
    proxy: {
      '/api': { // 检测到有以/api开头的请求地址才会开启代理
        // 所以baseUrl写成'/api'即可,以下代码会将/api去掉再指向target
        target: 'https://dashscope.aliyuncs.com',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^/api/, '')
      }
    }
  }

🚩改变vite的配置项后,需要重启才能生效

四、如何接收流式数据

arduino 复制代码
  // fetch ReadableStream
​
  const stream=res.body
  const reader = stream.getReader(); // 后续通过read()方法返回读取流的结果
  const decoder = new TextDecoder(); // 将二进制转为字符串,为JS内置API
​
  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
​
    const str = decoder.decode(value); // str是读取结果,是字符串
​
    // step1:按换行分割,可能有多行
    const lines = str.split("\n");
​
      // 因为一次read到的结果就可能是以下样子,也就是多个data: JSON格式,所以应先改为数组,接下来通过for依次对每一行的结果进行处理
      // data: {"choices":[{"delta":{"content":"你"}}]}
      // data: {"choices":[{"delta":{"content":"好"}}]}
      // data: {"choices":[{"delta":{"content":"!"}}]}
      
    // step2:遍历每一行
    for (const line of lines) {
      // step3:跳过空行和 [DONE]
      if (!line.startsWith("data: ") || line.includes("[DONE]")) continue;
​
      // step4:去掉 'data: ' 前缀,再JSON.parse
      const obj = JSON.parse(line.slice(6));
​
      // step5:取内容
      const content = obj.choices[0].delta.content;
      if (content) console.log(content); // 加这行,null 和空字符串都跳过
    }
  }
相关推荐
锋行天下5 分钟前
DeepSeek写Langgraph就是个大傻逼,一本正经胡说八道
前端·人工智能·后端
jktantan20 分钟前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
计算机魔术师43 分钟前
Anthropic官方插件被「寄生」,背后是同一类攻击又来了
前端
我命由我123451 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
key_3_feng1 小时前
评估与对齐:Agent 自我进化的护栏
前端·数据库·agent
LaughingZhu2 小时前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
Lank_M2 小时前
抠图结果缩放后边缘发脏,该怪的不是插值
前端
jerrywus2 小时前
Skill、MCP、Workflow、Rules、Memory 有什么区别?拿几次真实开发任务讲清楚
前端·agent·claude
补码缩写2 小时前
canvas 与 sharp 缩放透明图:默认预乘,非预乘得拆通道
前端
静默回滚2 小时前
抠图 PNG 缩小再放大,边缘又糊又白是两件事
前端