前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
视觉智能开放平台,分割抠图1万点
简介: 本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。

利用大模型开发应用时,我们有时候要第一时间给出用户相应,也就是使用流式调用的方式。这时候前端处理响应,就需要特殊的处理:利用处理可读流的方式从响应中读取数据。

随着大语言模型(LLM)在各种应用中的广泛使用,如何高效地从服务器获取模型生成的长文本响应成为一个重要问题。传统的HTTP请求模式通常等待服务器生成完整的响应内容再返回给客户端。然而,流式调用(streaming)通过分段传输部分响应,能提高实时性和用户体验。在此场景中,HTTP流式调用被广泛应用,尤其是在与LLM(如通义千文等)进行交互时。

本文将介绍LLM的HTTP API流式调用的机制,并深入探讨前端如何处理流式响应,以实现实时的、渐进式的结果呈现。

一、什么是HTTP API流式调用?

HTTP API流式调用(HTTP Streaming)是一种传输方式,服务器不会等待所有的数据生成完毕再返回给客户端,而是将响应数据逐步分段发送。当大语言模型生成内容时,服务器可以通过流式传输,将文本按块传递给前端,前端可以立即呈现这些部分内容,无需等待完整响应。

流式响应的基本流程:

  1. 客户端请求:前端通过HTTP请求向服务器发出调用,通常是POST请求,附带需要生成内容的提示(prompt),以及相关的参数。
  2. 服务器处理并分段响应:服务器开始处理请求,但不等待处理结束,先将部分生成的文本作为响应的一个数据块(chunk)发送给客户端。
  3. 客户端逐步接收并处理数据块:客户端持续监听流式响应,接收每个数据块并实时处理或呈现。
  4. 连接关闭:服务器在生成完毕后关闭连接,客户端停止接收数据。

这种方式特别适合用于大语言模型的文本生成任务,因为大规模模型生成的内容可能会很长,逐步输出可以改善用户的等待体验。

二、如何实现LLM的HTTP API流式调用?

以一个调用LLM的流式HTTP API为例,下面是一个使用fetch来发起流式调用的典型前端实现流程。国内的各个大模型,调用方式差不多,参数也类似,甚至还会有openai兼容的openapi接口

const fetchStreamData = async (prompt) => {
   
  const response = await fetch('https://api.openai.com/v1/completions', {
   
    method: 'POST',
    headers: {
   
      'Content-Type': 'application/json',
      'Authorization': `Bearer YOUR_API_KEY`
    },
    body: JSON.stringify({
   
      model: 'gpt-4',
      prompt: prompt,
      stream: true // 启用流式响应
    })
  });

  // 检查响应状态
  if (!response.ok) {
   
    throw new Error('Network response was not ok');
  }

  // 获取响应的可读流并处理流数据
  const reader = response.body.getReader();
  const decoder = new TextDecoder('utf-8');
  let done = false;

  while (!done) {
   
    // 读取流中的下一个数据块
    const {
    value, done: readerDone } = await reader.read();
    done = readerDone;

    // 将数据块解码为字符串
    const chunk = decoder.decode(value, {
    stream: true });
    console.log(chunk);  // 处理或显示每一块数据
    // ***** 这需要注意,各个大模型的分块数据结构可能不一样,甚至会有可能出现部分数据的情况,要单独兼容和处理哦
    // 以及有些模型内容的路径不一样,一次性响应在content,但是流式在delta字段下
  }
};

1. 请求设置

  • fetch函数用于发起POST请求,stream: true选项通知服务器启用流式传输。
  • 请求体中包含模型ID和提示词prompt,以及其他必要参数(如API密钥)。

2. 读取流数据

  • 使用response.body.getReader()获取一个流的阅读器(Reader),该阅读器允许我们按数据块逐步读取响应。
  • TextDecoder将字节数据解码为文本格式,确保能够正确处理流传输中的文本数据。

3. 逐块处理数据

  • 通过reader.read()逐步读取每个数据块,value包含读取到的字节数据,done表示流是否已结束。
  • chunk是解码后的文本数据,每次接收到新的数据块时可以实时处理或显示。

三、前端如何处理流式响应?

当后端返回流式响应时,前端可以逐步接收并更新UI,提供更好的用户交互体验。以下是前端处理流式响应的关键步骤。

1. 逐步更新界面

每当接收到一个新的数据块,前端可以立即将其更新到UI上,而不必等待完整的响应。这种实时更新的机制对于聊天机器人、搜索建议等场景尤为重要。例如:

const chatBox = document.getElementById('chat-box');

const updateChat = (text) => {
   
  // 将新数据块追加到界面上
  chatBox.innerHTML += `<p>${
     text}</p>`;
};

// 在逐块接收时更新
while (!done) {
   
  const {
    value, done: readerDone } = await reader.read();
  const chunk = decoder.decode(value, {
    stream: true });
  updateChat(chunk);  // 实时更新聊天框
}

通过这种方式,用户能够看到模型生成内容的部分结果,即使整个请求尚未完成,提升了用户体验。

2. 处理中断或错误

在流式调用中,网络连接可能会中断,或者服务器可能会返回错误。前端应该做好错误处理,例如:

if (!response.ok) {
   
  console.error('Error with the request');
  return;
}

reader.read().then(processStream).catch(error => {
   
  console.error('Error while reading stream:', error);
});

在中断时,前端可以选择显示错误消息,或尝试重新发起请求以重新建立连接。

3. 流数据的拼接与处理

由于流传输的数据是分块发送的,前端可能需要将这些分段数据拼接起来,形成完整的响应。例如:

let fullResponse = '';

while (!done) {
   
  const {
    value, done: readerDone } = await reader.read();
  const chunk = decoder.decode(value, {
    stream: true });
  fullResponse += chunk;  // 拼接完整响应
}

4. 自动滚动和用户交互优化

对于聊天机器人或类似应用,前端可以设置自动滚动,使得用户在流式数据逐步加载时能够始终看到最新的内容。

const scrollToBottom = () => {
   
  chatBox.scrollTop = chatBox.scrollHeight;
};

updateChat(chunk);
scrollToBottom();  // 更新后自动滚动

四、流式调用的优势

  1. 提升用户体验:通过流式传输,用户能够实时看到部分生成的内容,而不需要等待整个模型生成完毕,从而减少了感知延迟。
  2. 减少服务器压力:在某些场景下,流式调用可以减少服务器压力,因为服务器可以按需逐步处理和发送数据,而不需要一次性生成和发送大量数据。
  3. 增强交互性:用户能够根据逐步收到的内容进行进一步操作,如在对话中实时反馈等。

五、总结

HTTP API流式调用为大语言模型的响应提供了更高效和实时的交互方式。通过流式调用,前端可以逐步接收模型生成的部分数据,并即时呈现,从而提升用户体验。前端在实现流式调用时,需要处理数据分块的拼接、实时更新界面和处理可能的中断错误。通过这种方式,可以在交互密集的应用场景(如聊天机器人、自动化助手等)中大幅改善用户的使用体验。

处理流式调用,尤其是国产大模型的兼容是一个重复的工作,后面的章节如果有空,我会讲讲如何基于rxjs或者langchain.js简化这个工作

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
15天前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
29 3
|
7天前
|
自然语言处理 开发者
多模态大模型LLM、MLLM性能评估方法
针对多模态大模型(LLM)和多语言大模型(MLLM)的性能评估,本文介绍了多种关键方法和标准,包括模态融合率(MIR)、多模态大语言模型综合评估基准(MME)、CheckList评估方法、多模态增益(MG)和多模态泄露(ML),以及LLaVA Bench。这些方法为评估模型的多模态和多语言能力提供了全面的框架,有助于研究者和开发者优化和改进模型。
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
大模型强崩溃!Meta新作:合成数据有剧毒,1%即成LLM杀手
在人工智能领域,大型语言模型(LLMs)的快速发展令人瞩目,但递归生成数据可能导致“模型崩溃”。Meta的研究揭示,模型在训练过程中会逐渐遗忘低概率事件,导致数据分布偏差。即使少量合成数据(如1%)也会显著影响模型性能,最终导致崩溃。研究强调保留原始数据的重要性,并提出社区合作和技术手段来区分合成数据和真实数据。论文地址:https://www.nature.com/articles/s41586-024-07566-y
23 2
|
10天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
11天前
|
人工智能 自然语言处理 算法
政务培训|LLM大模型在政府/公共卫生系统的应用
本课程是TsingtaoAI公司面向某卫生统计部门的政府职员设计的大模型技术应用课程,旨在系统讲解大语言模型(LLM)的前沿应用及其在政府业务中的实践落地。课程涵盖从LLM基础知识到智能化办公、数据处理、报告生成、智能问答系统构建等多个模块,全面解析大模型在卫生统计数据分析、报告撰写和决策支持等环节中的赋能价值。
32 2
|
10天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
16 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
15天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
31 2
|
6月前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
543 1
|
6月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
150 0
|
3月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
87 0