ChatFile实现相关流程

news2024/9/20 8:05:51

文本上传构建向量库后台库的内容

调用上传文件接口先上传文件在这里插入图片描述

存在疑问:暂时是把文件保存在tmp文件夹,定时清理,是否使用云存储

根据不同的文件类型选取不同的文件加载器加载文件内容

   switch (file.mimetype) {
      case 'application/pdf':
        loader = new PDFLoader(file.path)
        break
      case 'text/plain':
        loader = new TextLoader(file.path)
        break
      case 'application/msword':
        loader = new DocxLoader(file.path)
        break
      case 'application/vnd.ms-excel':
      case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
        loader = new CSVLoader(file.path)
        break
      case 'application/json':
        loader = new JSONLoader(file.path)
        break
      case 'text/html':
      default:
        loader = new TextLoader(file.path)
    }

存在疑问:我们通过后缀名还是mimetype来区分加载器,langchain使用的是后缀名

文本分割:

顾名思义,文本分割就是用来分割文本的。为什么需要分割文本?Prompt 会存在字符限制
比如我们将一份300页的 pdf 发给 openai api,让他进行总结,他肯定会报超过最大 Token 错。所以这里就需要使用文本分割器去分割我们 loader 进来的 Document。
主要代码:这里分块长度为1000,每次携带上下文20

    const textSplitter = new RecursiveCharacterTextSplitter({
      chunkSize: 1000,
      chunkOverlap: 20,
    })

文本向量化

我们和文件进行交流的时候不可能每次都把全量文本都当成prompt传给Gpt ,所以需要进行文本向量化,文本向量化后就可以进行文本相关性查询,查出最符合的内容交与GPT进行相关性问答

建立一张上传文本表,往数据库插入一条上传信息,获取到id,用于向量查询的不同命名空间

表结构设计如下

在这里插入图片描述

    const data = await prisma.chatFiles.create({
      data: {
        originalname: file.originalname,
        mimetype: file.mimetype,
        path: file.path,
        filename: file.filename,
        encoding: file.encoding,
        userId,
        deviceId,
      },
    })

向量文本内容持久化

    console.log('创建向量数据库,持久化')

    const store = await PineconeStore.fromDocuments(
      docs,
      new OpenAIEmbeddings(),
      {
        pineconeIndex,
        // namespace: `${userId}_${file.filename.replace('.pdf', '')}`,
        namespace: `${data.id}`,
      },
    )

我们需要把向量化的文本持久化,便于下次进行聊天或者连续性问答,通过后台文本表查询该次聊天向量文本内容,这里暂时使用个人的云向量库

文本聊天的流程

在这里插入图片描述

1. 需要传入后台保存的文本表对应id,便于寻找相应向量数据库

  const store = await PineconeStore.fromExistingIndex(new OpenAIEmbeddings(), {
    pineconeIndex,
    namespace: storeId,
  })

  chatFiles(quest, functionName, res, callback, chatInfoId, store)

2.chatfile 的核心代码

  // 使用retriever进行向量相似查询,找到相关数据
  const docs = await this.retriever.getRelevantDocuments(question);
  const inputs = { question, input_documents: docs };
  // 将数据交给gpt进行处理

文本总结的核心流程

在这里插入图片描述

1. 需要传入后台保存的文本表对应id,便于寻找相应向量数据库

  const store = await PineconeStore.fromExistingIndex(new OpenAIEmbeddings(), {
    pineconeIndex,
    namespace: storeId,
  })
  
 // 获取前N个文档进行总结,需要产品进行定义
  const docs = await store.asRetriever(3).getRelevantDocuments('')
  
  const chain = loadSummarizationChain(new OpenAI({ temperature: 0 }))
  const response = await chain.call({
    input_documents: docs.slice(0, 2),
  })

总结类型使用refine,链式总结,把前面的chunk总结内容带入prompt 进行总结,总结内容更精准
map_reduce 的话,分段总结然后进行合并,时间更快

需要设计一个删除文本相关的接口

在这里插入图片描述

const obj = await prisma.chatFiles.findFirst({ where: { id: storeId } })
  if (obj) {
    const obj = await prisma.chatFiles.delete({ where: { id: storeId } })
    obj && obj.path && fs.unlinkSync(obj.path)

    await pineconeClient.init({
      apiKey: process.env.PINECONE_API_KEY,
      environment: process.env.PINECONE_ENVIRONMENT,
    })

    const pineconeIndex = pineconeClient.Index('01')
    await pineconeIndex.delete1({ deleteAll: true, namespace: storeId })
    }

需要把临时上传文件,后台文本表相应记录和向量数据相关的内容清除

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

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

相关文章

爬虫教程1_Xpath 入门教程

Xpath 入门教程 在编写爬虫程序的过程中提取信息是非常重要的环节,但是有时使用正则表达式无法匹配到想要的信息,或者书写起来非常麻烦,此时就需要用另外一种数据解析方法,也就是本节要介绍的 Xpath 表达式。 Xpath表达式 XPath…

Linux(centos7)如何实现配置iscsi存储多路径 及DM-Multipath的配置文件概述

安装多路径软件(系统默认安装) #第一:安装多路径软件yum -y install device-mapper device-mapper-multipath#第二:在CentOS7中启用多路径模块,mpathconf命令及相关模块加载(可以使用mpathconf -h查看用法&…

RocketMQ 在业务消息场景的优势详解

作者:隆基 01 消息场景 RocketMQ 5.0 是消息事件流一体的实时数据处理平台,是业务消息领域的事实标准,很多互联网公司在业务消息场景会使用 RocketMQ。 我们反复提到的“消息、业务消息”,指的是分布式应用解耦,是 R…

史上最全,性能测试-性能分析调优详细讲解,全网独一份...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能分析 前提&a…

中国AI大模型峰会“封神之作” - 开发者不容错过这场夏季盛会

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

【AI模型系列】中国AI大模型峰会“封神之作”,不容错过的大模型机遇

目录 序言 峰会介绍 现场大咖 大语言模型 五大论坛 峰会特点 参与方式 方式一 方式二 序言 AI大模型是指具有数十亿个参数的深度学习模型。这些模型通常使用多层神经网络来处理大规模的数据集,以学习和提高它们的表现。 大模型通常需要大量的计算资源和…

three.js实现vr全景图

方法: 可以利用Threejs中的立方体或者球体实现全景图功能,把立方体或球体当成天空盒子,将无缝衔接的图片贴上,看起来就像在一个场景中,相机一般放置在中央。 three.js中文网 1、立方体实现 立方体6个面要贴上6个方向的图片&…

GFS 分布式文件系统

GFS 分布式文件系统 一.GlusterFS 概述 1.GlusterFS简介 (1)开源的分布式文件系统。 (2)由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。 (3&#x…

css3 hover border 流动效果

/* Hover 边线流动 */.hoverDrawLine {border: 0 !important;position: relative;border-radius: 5px;--border-color: #60daaa; } .hoverDrawLine::before, .hoverDrawLine::after {box-sizing: border-box;content: ;position: absolute;border: 2px solid transparent;borde…

常用的统计分析方法

统计方法是指有关收集、整理、分析和解释统计数据,并对其所反映的问题作出一定结论的方法。统计方法是一种从微观结构上来研究物质的宏观性质及其规律的独特的方法。统计方法是适用于所有学科领域的通用数据分析方法,只要有数据的地方就会用到统计方法。…

vue3.3-TinyMCE:TinyMCE富文本编辑器基础使用

一、TinyMCE官网 GitHub - tinymce/tinymce TinyMCE中文文档中文手册 二、官网介绍 TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有:UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 TinyMCE的优势&…

XML约束和解析

文章目录 概述使用场景语法dtd约束Schema约束解析DOM4j(重点) 概述 可扩展的标记性语言 使用场景 以前: 传输数据的媒介。 例如:微服务架构中,可以用xml文件进行多语言之间的的联系。 现在: 做配置文件 现在作为传输数据的媒介…

untiy代码打压缩包,可设置密码

1、简单介绍: 用的是一个插件SharpZipLib,在vs的Nuget下载,也可以去github下载https://github.com/icsharpcode/SharpZipLib 用这个最主要的是因为,这个不用请求windows的文件读写权限,关于这个权限我搞了好久&#…

基于SSM家电补贴一站式服务平台-计算机毕设 附源码12305

ssm家电补贴一站式服务平台 摘 要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用。简单的流程、便捷可靠的支付方式、快捷畅通的物流快递、安全的信息保护都使得电子商务…

C++ 文件流操作详解

1. C I/O流 本文章有很多内容参考并借鉴了《C primer plus》 这本经典。这里先说明一下。 1. C I/O流 1.1. 数据流1.2. 控制台流1.3. 文件流 1.3.1. 什么是文件流?1.3.2. 缓冲区1.3.3. 文件流和控制流的关系1.3.4. 文件处理1.3.5. 简单的文件I/O1.3.6. 流状态检查和…

DNS WEB HTTP

DNS与域名 网络是基于 TCP/IP 协议进行通信和连接的。 每一台主机都有唯一的标识,用于区别在网络上成千上万个用户和计算机。即固定的IP地址(32位二进制数转换成为十进制数——点分十进制)。每一个与网络相连接的计算机和服务器都被指派一个…

xml的学习笔记

学习视频:093-尚硅谷-xml-什么是XML以及它的作用_哔哩哔哩_bilibili 目录 XML简介 XML的作用 XML语法 1.文档声明 2.xml注释 3.元素标签 4.xml属性 5.语法规则 1.所有xml元素都须有关闭标签(也就是闭合) 2.xml 标签对大小写敏感 3.xml必须正确的嵌套 4…

前端工程化最佳实践:项目结构、代码规范和文档管理

文章目录 前端工程化最佳实践项目结构设计与组织文档管理和注释规范国际化和本地化实践 前端工程化的未来发展趋势前端工程化领域的最新技术和工具WebAssembly 和前端性能优化可持续性和可访问性的趋势 总结前端工程化的关键知识点前端工程化对项目和团队的价值 前端工程化最佳…

玩转顺序表——【数据结构】

在C语言学习中,我们经常会遇见增删查改等一系列操作,而这些操作全都与线性表关联,没有线性表将会对这些操作完成的十分艰难!那今天就让我们来了解一下顺序表如何增删查改!!! 目录 1.线性表 2…

(二)Spring WeFlux响应式编程第二种整合方案|道法术器

Spring WebFlux 响应式异步编程|道法术器(一) Spring WeFlux响应式编程整合另一种方案|道法术器(二) R2dbc操作mysql 注意下面红色部分与上一篇"Spring WebFlux 响应式异步编程|道法术器(一)" 不一样的依赖包 技术整合: <!--设置spring-boot依赖的版本 --> &l…