函数计算的新征程:使用 Laf 构建 AI 知识库

Laf 已成功上架 Sealos 模板市场,可通过 Laf 应用模板来一键部署!

这意味着 Laf 在私有化部署上的扩展性得到了极大的提升

Sealos 作为一个功能强大的云操作系统,能够秒级创建多种高可用数据库,如 MySQL、PostgreSQL、MongoDB 和 Redis 等,也可以一键运行各种消息队列和微服务,甚至 GPU 集群上线后还可以跑各种 AI 大模型。

将 Laf 一键部署到 Sealos 中,我们就可以在 Laf 中直接通过内网调用 Sealos 提供的所有这些能力。无论用户需要什么样的后端支持,只需在 Sealos 上运行相应的服务即可。这种集成模式不仅提高了资源的利用效率,而且还提供了无缝的技术集成,使得 Laf 成为一个更加强大和多功能的 Serverless 平台,弥补了传统 Serverless 平台在后端能力方面的不足。

Sealos 强大的模板市场提供了丰富的应用生态,用户可以在模板市场中一键部署各种应用。本文以 Elasticsearch 为例,展示如何在 Laf 中调用 Sealos 模板市场中部署的 Elasticsearch 来搭建一个向量数据库,提供定制化知识库搜索能力。

背景知识

如果我们想往大模型里边注入知识,最先能想到的就是对大模型进行微调,大模型有很好的根据上文来回答问题的能力。

假设一个场景,我有个问题是:“请给我介绍一下万能青年旅店这支乐队 “(假设模型内部并没有存储万青的相关信息),然后我有个 100w 字的文档,里边包含了世界上所有乐队的介绍。如果模型对无限长的输入都有很好的理解能力,那么我可以设计这样一个输入 “以下是世界上所有乐队的介绍:[插入 100w 字的乐队简介文档],请根据上文给我介绍一下万青这支乐队”,让模型来回答我的问题。但模型支持的输入长度是很有限的,比如 ChatGPT 只支持 32K Token 长度的输入 (大约 50 页文本)。

实际上,如果想让大模型根据文档来回答问题,必须要精简在输入中文档内容的长度。一种做法是,我们可以把文档切成若干段,只将少量的和问题有关的文档片段拿出来,放到大模型的输入里。至此,”大模型外挂数据库 “的问题转换成了 “文本检索的问题” 了,目标是根据问题找出文档中和问题最相关的片段,这已经和大模型本身完全无关了。

文本检索里边比较常用的是利用向量进行检索,我们可以把文档片段全部向量化 (通过语言模型,如 bert 等),然后存到向量数据库 (如 Annoy、FAISS、hnswlib 等) 里边,来了一个问题之后,也对问题语句进行向量话,以余弦相似度或点积等指标,计算在向量数据库中和问题向量最相似的 top k 个文档片段,作为上文输入到大模型中。

向量数据库都支持近似搜索功能,在牺牲向量检索准确度的情况下,提高检索速度。完整流程图如下所示:

按照这个思路我们需要做的事情有两个,一个是把文档向量化,另一个是搭建一个向量数据库。文档向量化最简单的方法可以使用 openai 提供的转化接口将文档转化成向量数组,除此之外还可以通过 bert 模型。OpenAI 还给出了向量数据库参考选项,建议我们使用 cosin 相似度公式来求向量相似度:

$$\cos (\theta) = \frac {A.B} {|A| |B|} = \frac {\sum {i=1}^{n} A_i B_i} {\sqrt {\sum {i=1}^{n} A_i^2} \sqrt {\sum_ {i=1}^{n} B_i^2}}$$

如何在 Sealos 上快速部署向量数据库呢?从 OpenAI 的推荐上我们看到了里面有个 Elasticsearch 选项,那我们就用它了。

部署 Laf 与 Elasticsearch

首先我们需要打开 Sealos 公有云桌面:https://cloud.sealos.top

Sealos 是完全开源的,您也可以通过 Sealos 构建自己的私有云:https://sealos.run/self-hosting

然后进入 “模板市场”,通过 Laf 模板与 Elasticsearch 模板分别部署 Laf 和 Elasticsearch。

然后在 Laf 中新建一个应用,安装依赖 elastic/elasticsearch

一旦应用创建完毕,您可以使用云函数代码来连接 Elasticsearch。在此示例中,我们直接插入了 10 条测试数据 (为了简化演示过程,我们直接使用了测试数据,并没有用 OpenAI 的接口去生成文档的向量数据)。

import cloud from '@lafjs/cloud'
const { Client } = require('@elastic/elasticsearch')
const ca = `-----BEGIN CERTIFICATE-----
MIIDITCCAgmgAwIBAgIQQKs5V2terYVNUrHt9K0CzTANBgkqhkiG9w0BAQsFADAb
MRkwFwYDVQQDExBlbGFzdGljc2VhcmNoLWNhMB4XDTIzMTEyMjA3MDcxOFoXDTI0
MTEyMTA3MDcxOFowGzEZMBcGA1UEAxMQZWxhc3RpY3NlYXJjaC1jYTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAPYyHrFgyoD3Pkkc/ekXhHGKi+qKPBbp
afPuGImQfTtkGlzhaHJ7Iy3MZojP/iyt3FTY+LvxODsbkgIrQJWwiG2s26rw03Zd
lphf7RULRa9Z/TKt0jxHV9M419ge2zRij6Al3uUHCP2FxjVMgYjuFisKwNalQfUE
spCTq9lWNp4bKP32GieEBQKeNRD8ElNBJkInIA2aTyH2TIhyICK0f5GjH52rxKeV
wrE/BHq8zomHRVtTM67KHoXc9RJgYNICfooeDHvi/f9f+pWrX881rmbNWXGcxu2u
GQLqCAkqpIpUwn5HAoSvUYHmxwgaDC866fjsgxv/6DMDJuGPmfsBqQMCAwEAAaNh
MF8wDgYDVR0PAQH/BAQDAgKkMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
AjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQaGk9O4hQFjJPU6ay8qqU8CNug
uzANBgkqhkiG9w0BAQsFAAOCAQEAfZUesinfp1jeSqfHBSPHOgZ1q/v8xoClEPRl
wzh8sbL14iuuSb190J8zQefvzxC7ip4kVCVTW52fBZNyoMpvj0cXKWRGFmz3yHIs
TNdwOy15mQRQGbOTDBkQ528SbrmrWF4W7kDMoWs0t02UIlSfBWDjJrVharRR9QuF
cGjoS59TCAFcHHUsPO3lcUT1TCq/W4xnds3zBxJiGeIdmDqE6DbS78YfwP9rhTx0
oxcQwpKaOj8vxQNQxNbJRmWgffx0PgUzFPni/N5FgFQQXDPG4i0gMciekHWz8VRM
pp2z1uD1lVdDa/83w/IZCQOqDU7cRjDosg+gaAefFGNMHVbPBw==
-----END CERTIFICATE-----
`

export default async function (ctx: FunctionContext) {

  const client = new Client({
    node: 'https://elasticsearch-master.ns-wz9g09tc.svc.cluster.local:9200',
    auth: {
      username: 'elastic',
      password: 'zhtvadgdinhkyirozeznxlxd'
    },
    tls: {
      ca: ca,
      rejectUnauthorized: false
    }
  })

  const health = await client.cluster.health()
  console.log(health)
  // 删除已存在的索引(如果有)
  await client.indices.delete({
    index: 'vectors',
    ignore_unavailable: true
  })

  // 创建一个新的向量索引
  await client.indices.create({
    index: 'vectors',
    body: {
      mappings: {
        properties: {
          embedding: {
            type: 'dense_vector',
            // 向量列表的长度
            dims: 3,
            index:true,
            // 字段索引,consin函数求相似度
            similarity:'cosine'
          },
          text: {
            type: 'text'
          }
        }
      }
    }
  })

// 测试数据
  const documents = [
    { embedding: [0.5, 10, 6], text: 'text1' },
    { embedding: [-0.5, 10, 10], text: 'text2' },
    { embedding: [1.0, 5, 8], text: 'text3' },
    { embedding: [-0.2, 8, 12], text: 'text4' },
    { embedding: [0.8, 12, 4], text: 'text5' },
    { embedding: [-0.7, 6, 14], text: 'text6' },
    { embedding: [0.3, 14, 2], text: 'text7' },
    { embedding: [-0.4, 16, 8], text: 'text8' },
    { embedding: [0.6, 8, 10], text: 'text9' },
    { embedding: [-0.6, 12, 6], text: 'text10' }
  ];

// 插入测试数据
  for (const doc of documents) {
    await client.index({
      index: 'vectors',
      document: doc,
      refresh: true
    });
  }

  // Define the vector to search for
  const query_vector = [0.2, 12, 5]

  const body = await client.knnSearch({
    index: 'vectors',
    knn: {
      field: 'embedding',
      query_vector: query_vector,
      k: 3,
      num_candidates: 5
    },
    _source: ["text"]
  });


  // 输出搜索结果
  console.log(JSON.stringify(body, null, 2))

  return { data: 'hi, laf' }
}

通过 cosin 相似度搜索,我们找到了与向量 [0.2, 12, 5] 最相似的三条向量数据。这些数据的文本分别是 text8text5text10

Elasticsearch 内网调用地址如下:

ca 的值就是 Elasticsearch 的证书,Elasticsearch 的证书可以通过命令行来获取,先在 Sealos 桌面中打开 “终端” App,然后执行以下命令获取证书:

kubectl get secret elasticsearch-master-certs -o jsonpath="{.data.ca\.crt}"|base64 -d

Elasticsearch 的用户名密码可以通过以下命令获取:

$ kubectl get secret elasticsearch-master-credentials -o jsonpath="{.data.username}"|base64 -d && echo
elastic
$ kubectl get secret elasticsearch-master-credentials -o jsonpath="{.data.password}"|base64 -d && echo
xurcwgjxpfztmgjquufyyiml

至此简单的 Demo 已经完成了,后续我们需要做的就是持续地向我们的向量数据库中添加更多文档的向量化数据,通过这种方式,我们可以构建起一个功能强大的知识库。当用户提问时,先将用户问题转换成向量数据,然后在向量数据库中找到最相似的文档,将文档作为上文输入到大模型中,最后大模型输出答案。我们的明星项目 FastGPT 就是这样做的哦。另外不难看出 Bing Chat 也是异曲同工。

总结

通过将 Laf 集成到 Sealos 云操作系统中,可以更高效地利用云操作系统的资源。用户可以直接在 Laf 中调用 Sealos 提供的各种数据库和服务,如 MySQL、PostgreSQL、MongoDB 和 Redis 等,以及消息队列和微服务,实现资源的最大化利用。这种集成方式使得 Laf 成为了一个功能更加全面的 Serverless 平台。尤其是在后端能力方面,这种集成提供了一个无缝的解决方案,弥补了传统 Serverless 平台的不足。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神命令tree的魅力你get到了吗?

背景 日常工作中,有时候为了明确表达自己的意思,往往需要输出对应的目录层级结构,手动一个个输入往往显得不那么高级,效率相对较低,这时候拥有可以一键输出目录结构并且可以快速转化为文本的工具就比较方便&#xff0…

创新指南|消费品牌2024重塑增长最值得关注的10个DTC零售策略

2023年对消费零售行业来说同样是挑战的一年,经济逆风和消费低迷迫在眉睫,而品牌零售商如何从库存积压中跳出来,努力应对增加的支出,实现可盈利的增长会是让每位CEO战略执行的第一优先级。2023年用什么策略于DTC?与全球…

B033-Servlet交互 JSP

目录 ServletServlet的三大职责跳转:请求转发和重定向请求转发重定向汇总请求转发与重定向的区别用请求转发和重定向完善登录 JSP第一个JSP概述注释设置创建JSP文件默认字符编码集 JSP的java代码书写JSP的原理三大指令九大内置对象改造动态web工程进行示例内置对象名…

易点易动固定资产管理系统:实现全面的固定资产采购管理

在现代企业中,固定资产采购管理是一项关键的任务。为了确保企业的正常运营和发展,有效管理和控制固定资产采购过程至关重要。易点易动固定资产管理系统为企业提供了一种全面的解决方案,整合了从采购需求、采购计划、询比价、采购合同到采购执…

【C语言】整形在内存中的存储

1、整形在内存中的存储 1.1 原码、反码、补码 计算机中整数有三种二进制表示方法,分别是原码、反码、补码 三种表示方法由符号位和数值位构成,符号位用0表示正数,1表示负数。 整形数据在内存中存放的是补码 正数的原码、反码、补码相同 …

JSP:MVC

Web应用 一个好的Web应用: 功能完善 易于实现和维护 易于扩展等 的体系结构 一个Web应用通常分为两个部分: m 1. 由界面设计人员完成的 表示层 (主要做网页界面设计) m 2. 由程序设计人员实现的 行为层 (主要完成本…

利用企业被执行人信息查询API保障商业交易安全

前言 在当今竞争激烈的商业环境中,企业为了保障商业交易的安全性不断寻求新的手段。随着技术的发展,利用企业被执行人信息查询API已经成为了一种强有力的工具,能够帮助企业在商业交易中降低风险,提高合作的信任度。 企业被执行人…

ArcMap针对正射影像图生成切片操作

1.导入图层jpg文件 2.添加地图坐标系 右键点击地图 --》数据框属性 坐标系选项设置地图的坐标系 地图应该有对应的坐标文件 3.地理配准选项 --》去除自动校正, 4.选择参考坐标 在图中选三个定位坐标保存 5.地理配准选项 --》更新地理位置配准 6.管理工具下 --》…

2023仿聚合搜索程序源码/轻量级搜狗泛站群程序源码/PHP整站源码+完美SEO优化+符合搜狗算法

源码简介: 2023仿聚合搜索/轻量级搜狗泛站群程序整站源码,作为PHP源码,可以完美SEO优化,符合搜狗搜索引擎算法。 轻量级的PHP搜狗泛站群程序源码,完美SEO优化符合搜狗搜索引擎算法,无需任何采集&#xff…

如何有效减少 AI 模型的数据中心能源消耗?

在让人工智能变得更好的竞赛中,麻省理工学院(MIT)林肯实验室正在开发降低功耗、高效训练和透明能源使用的方法。 在 Google 上搜索航班时,您可能已经注意到,现在每个航班的碳排放量估算值都显示在其成本旁边。这是一种…

AI:87-基于深度学习的街景图像地理位置识别

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…

GWAS结果批量整理:升级版算法TidyGWAS

TidyGWAS GWAS分析关键结果之一是显著性SNP位点的P值,通常多年份多地点多模型的GWAS分析将会产生很多结果文件,如何对这些数据进行整理? 汇总这些结果,并将显著性的位点或区域找出来,更加清晰的展示关键信息。 今天介…

揭秘!SpireCV如何实现低延时推流、视频保存!

引言 视频推流是指将实时的音视频数据通过网络传输到服务器或其他终端设备的过程。 在无人机上则是通过搭载摄像头或录像设备,通过无线网络将实时拍摄到的视频数据传输到地面站或其他终端设备,使操作人员能够实时监视无人机所处位置的环境,…

Find My鼠标|苹果Find My技术与鼠标结合,智能防丢,全球定位

随着折叠屏、多屏幕、OLED 等新兴技术在个人计算机上的应用,产品更新换代大大加速,进一步推动了个人计算机需求的增长。根据 IDC 统计,2021 年全球 PC 市场出货量达到 3.49 亿台,同比增长 14.80%,随着个人计算机市场发…

qt实现播放视屏的时候,加载外挂字幕(.srt文件解析)

之前用qt写了一个在windows下播放视频的软件,具体介绍参见qt编写的视频播放器,windows下使用,精致小巧_GreenHandBruce的博客-CSDN博客 后来发现有些视频没有内嵌字幕,需要外挂字幕,这时候,我就想着把加载…

「首届广州百家新锐企业」名单出炉!数说故事遴选入围

11月20日,由中共广州市委统战部、市工商联、市工信局、市国资委、市科技局联合主办的首届广州百家新锐企业融通创新交流会在广州成功举办。 为推动广州市中小民营企业的创新发展,践行新发展理念,厚植广州产业根基,现场发布首届广…

云计算时代来临,传统运维怎样做才能不被“杀死”?

据Forrester Research的数据显示,2021年全球公有云基础设施市场将增长35%,达到1200亿美元,云计算将继续在疫情复苏的过程中“占据中心位置”。 全球用于云计算的IT支出占比将持续增长,企业对于云计算开发人才需求紧迫&#xff0c…

面向自然语言处理任务的预训练模型综述

源自:计算机应用 作者:刘睿珩, 叶霞, 岳增营 “人工智能技术与咨询” 发布 摘 要 近年来,深度学习技术得到了快速发展。在自然语言处理(NLP)任务中,随着文本表征技术…

c语言新龟兔赛跑

以下是一个使用C语言编写的新的龟兔赛跑游戏&#xff1a; #include <stdio.h>#include <stdlib.h>#include <time.h>int main() { int distance, turtle_speed, rabbit_speed, turtle_time, rabbit_time, rabbit_lead; srand(time(NULL)); // 随机数种…