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 平台的不足。

函数计算的新征程:使用 Laf 构建 AI 知识库的更多相关文章

  1. 阿里云函数计算发布新功能,支持容器镜像,加速应用 Serverless 进程

    我们先通过一段视频来看看函数计算和容器相结合后,在视频转码场景下的优秀表现.点击观看视频 >> FaaS 的门槛 Serverless 形态的云服务帮助开发者承担了大量复杂的扩缩容.运维. ...

  2. Laf v1.0 发布:函数计算只有两种,30s 放弃的和 30s 上线的

    一般情况下,开发一个系统都需要前端和后端,仅靠一个人几乎无法胜任,需要考虑的特性和功能非常多,比如: 需要一个数据库来存放数据: 需要一个文件存储来存放各种文件,比如图片文件: 后端需要提供接口供前端 ...

  3. 利用函数计算构建微信小程序的Server端

    10分钟上线 - 利用函数计算构建微信小程序的Server端-博客-云栖社区-阿里云 https://yq.aliyun.com/articles/435430 函数计算  读写 oss import ...

  4. 一元建站-基于函数计算 + wordpress 构建 serverless 网站

    前言 本文旨在通过 快速部署一个 wordpress 网站到阿里云函数计算平台 这个示例来展示 serverless web 新的开发模式, 包括 FUN 工具一键初始化 NAS, 同步网站到 NAS ...

  5. 函数计算工具链新成员 —— Fun Local 发布啦

    刚刚,我们发布了函数计算工具链的新成员,Fun Local.欢迎大家使用! 如果你还不了解 Fun 是什么,我们来简单解释下. Fun 是什么 Fun 是 have Fun with Serverle ...

  6. 160_技巧_Power BI 新函数-计算工作日天数

    160_技巧_Power BI 新函数-计算工作日天数 一.背景 Power BI 2022 年 7 月 14 日更新了最新版本的,版本号为:2.107.683.0 . 更多更新内容可以查看官方博客: ...

  7. 开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...

  8. 手把手教您将 libreoffice 移植到函数计算平台

    LibreOffice 是由文档基金会开发的自由及开放源代码的办公室套件.LibreOffice 套件包含文字处理器.电子表格.演示文稿程序.矢量图形编辑器和图表工具.数据库管理程序及创建和编辑数学公 ...

  9. 从函数计算架构看 Serverless 的演进与思考

    作者 | 杨皓然  阿里巴巴高级技术专家 导读:云计算之所以能够成为 DT 时代颠覆性力量,是因为其本质是打破传统架构模式.降低成本并简化体系结构,用全新的思维更好的满足了用户需求.而无服务器计算(S ...

  10. 函数计算: 让小程序开发进入 Serverless 时代

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 吴天龙(木吴 ...

随机推荐

  1. 记一次 HTTPS 抓包分析和 SNI 的思考

    日常听说 HTTPS 是加密协议,那现实中的 HTTPS 流量,是真的完全加密吗? --答案是,不一定.原因嘛,抓个包就知道了. 我们用 curl 命令触发一下: curl -v 'https://s ...

  2. sqli笔记

    MySQL数据库自带的数据库information_schema 里面有三个比较重要的表  SCHEMATA .TABLES . COLUMNS  保存数据库所有的数据库名 表名  字段名 SCHEM ...

  3. 痞子衡嵌入式:借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间. 最近痞子衡写了篇文章 <i.MXRT从Serial N ...

  4. WPF实现跳动的字符效果

    本文将介绍一个好玩但实际作用可能不太大的动画效果:跳动的字符.为了提高动画效果的可重用性以及调用的灵活性,通过Behavior实现跳动的字符动画.先看下效果: 技术要点与实现 通过TextEffect ...

  5. UI通过元素定位实现特定区域截图

    最近计划做一个自动截图的工具,目的是实现性能测试资源监控平台(grafana)各硬件资源的自动截图,解放手工操作.前期的截图做了如下探索. 1. 整个页面截图 1.1 代码实现 通过save_scre ...

  6. 当小白遇到FullGC

    起初没有人在意这场GC,直到它影响到了每一天! 前言 本文记录了一次排查FullGC导致的TP99过高过程,介绍了一些排查时思路,线索以及工具的使用,希望能够帮助一些新手在排查问题没有很好的思路时,提 ...

  7. 《Linux基础》07. 软件管理

    @ 目录 1:软件管理 1.1:rpm 1.1.1:查询 1.1.2:卸载 1.1.3:安装 1.2:yum 1.3:dpkg 1.4:apt 1.4.1:相关配置 1.4.2:常用指令 1.4.3: ...

  8. QA|Pycharm中的git分支提交冲突问题和解决|GIT

    前天,Pycharm中的git分支提交冲突了,原因是我PC上改了文件没有提交,笔记本又本地改代码,笔记本提交时就出现报错:提交拒绝,但pull也被拒绝,网上试了rebase等方法,均没得到解决,最终自 ...

  9. js调起android安卓与ios苹果方法 vue3.0 + ts

    let shareSelect = (ev :any) => { const u :any= navigator.userAgent; const win :any = window const ...

  10. 详细解释一下Spring是如何解决循环依赖问题的

    Spring是如何解决循环依赖问题的? 我们都知道,如果在代码中,将两个或多个Bean互相之间持有对方的引用就会发生循环依赖.循环的依赖将会导致注入死循环,这是Spring发生循环依赖的原因 循环依赖 ...