基于 EventBridge + DashVector 打造 RAG 全链路动态语义检索能力

作者:肯梦

本文将演示如何使用事件总线(EventBridge),向量检索服务(DashVector),函数计算(FunctionCompute)结合灵积模型服务 [ 1] 上的 Embedding API [ 2] ,来从 0 到 1 构建基于文本索引的构建+向量检索基础上的语义搜索能力。具体来说,我们将基于 OSS 文本文档动态插入数据,进行实时的文本语义搜索,查询最相似的相关内容。

本文中将用到事件总线(EventBridge),它是阿里云提供的一款无服务器事件总线服务,支持阿里云服务、自定义应用、SaaS 应用以标准化、中心化的方式接入,并能够以标准化的 CloudEvents 1.0 协议在这些应用之间路由事件,帮助您轻松构建松耦合、分布式的事件驱动架构。

RAG 背景概述

大语言模型(LLM)作为自然语言处理领域的核心技术,具有丰富的自然语言处理能力。但其训练语料库具有一定的局限性,一般由普适知识、常识性知识,如维基百科、新闻、小说,和各种领域的专业知识组成。导致 LLM 在处理特定领域的知识表示和应用时存在一定的局限性,特别对于垂直领域内,或者企业内部等私域专属知识。

实现专属领域的知识问答的关键,在于如何让 LLM 能够理解并获取存在于其训练知识范围外的特定领域知识。同时可以通过特定 Prompt 构造,提示 LLM 在回答特定领域问题的时候,理解意图并根据注入的领域知识来做出回答。在通常情况下,用户的提问是完整的句子,而不像搜索引擎只输入几个关键字。这种情况下,直接使用关键字与企业知识库进行匹配的效果往往不太理想,同时长句本身还涉及分词、权重等处理。相比之下,倘若我们把提问的文本,和知识库的内容,都先转化为高质量向量,再通过向量检索将匹配过程转化为语义搜索,那么提取相关知识点就会变得简单而高效。

本文将介绍如何构建一个完全动态的 RAG 入库方案,通过 EventBridge 拉取 OSS 非结构化数据,同时将数据投递至 DashVector 向量数据库,从而实现完整的 RAG Ingestion 流程。

流程概述

数据集成(Ingestion)

数据检索(Search)

操作流程

前提条件

  • DashScope 控制台开通灵积模型服务,并获得 API-KEY 的获取与配置。
  • 开通 DashVector 向量检索服务,并获得 API-KEY 的获取与配置。
  • 开通 OSS 服务。
  • 开通 FC 服务。
  • 开通 EventBridge 服务。
开通灵积模型服务
  1. 点击进入 DashScope 控制台 [ 3] ,开通灵积相关服务

  1. 点击进入“API-KEY”管理,获取相关 KEY 信息

开通 DashVector 服务
  1. 若第一次配置,请点击“新建 DashVector Cluster [ 4] ”,跳转创建新的 Cluster;点击“创建免费 Cluster”快速体验创建向量数据库

2. 选择“立即购买”

3. 点击创建“Collection”

4. 填写纬度为“1536”,距离度量方式“Cosine”,点击“确认”

5. 点击“API-KEY 管理”,获取 DashVector 的 API KEY

创建 Ingestion 数据集成任务

1.1 进入 EventBridge 控制台 [ 5]

1.2 配置 OSS 源
  • OSS Bucket:选择空白存储桶实验,若无请自行创建;
  • OSS 前缀:该项可根据诉求填写,若无前缀 EB 将拉取整个 Bucket 内容;本次演示不配置;
  • 文档加载:目前支持解析 TextLoder 作为文档加载器;
  • 加载模式:“单文档加载”单个文件作为一条数据加载,“分块加载”按照分隔符加载数据;本次演示使用单文档加载。

1.3 配置过滤

可根据诉求添加过滤规则,本次演示使用“匹配全部事件”。

1.4 配置转换

转换部分主要是将原始数据转成向量化数据,为投递至 DashVector 做数据准备。

函数代码如下,函数环境为 Python 3.10:

# -*- coding: utf-8 -*-
import os
import ast
import copy
import json
import logging
import dashscope
from dashscope import TextEmbedding
from http import HTTPStatuslogger = logging.getLogger()
logger.setLevel(level=logging.INFO)dashscope.api_key='Your-API-KEY'def handler(event, context):evt = json.loads(event)evtinput = evt['data']resp = dashscope.TextEmbedding.call(model=dashscope.TextEmbedding.Models.text_embedding_v1,api_key=os.getenv('DASHSCOPE_API_KEY'), input= evtinput )if resp.status_code == HTTPStatus.OK:print(resp)else:print(resp)return resp

🔔 注意: 需手动安装相关函数环境,相关文档参考《为函数安装第三方依赖》 [ 6]

pip3 install dashvector dashscope -t .

返回样例:

{"code": "","message": "","output": {"embeddings": [{"embedding": [-2.192838430404663,-0.703125,... ...-0.8980143070220947,-0.9130208492279053,-0.520526111125946,-0.47154948115348816],"text_index": 0}]},"request_id": "e9f9a555-85f2-9d15-ada8-133af54352b8","status_code": 200,"usage": {"total_tokens": 3}
}
1.5 配置向量数据库 Dashvector

选择创建好的向量数据库。

  • 数据映射:选择 Upsert 方式插入;
  • 向量:填写上游 Dashscope 的 TextEmbedding 投递的向量信息 $.output. embeddings[0].embedding;
  • 鉴权配置:获取的 DashVector API-KEY 参数。

创建 Search 数据检索任务

在进行数据检索时,需要首先对数据进行 embedding,然后将 embedding 后的向量值与数据库值做检索排序。最后填写 prompt 模版,通过自然语言理解和语义分析,理解数据检索意图。

该任务可以部署在云端函数计算,或者直接在本地环境执行;首先,我们创建 embedding.py,将需要检索的问题进行文本向量化,代码如下所示:

embedding.py

import os
import dashscope
from dashscope import TextEmbeddingdef generate_embeddings(news):rsp = TextEmbedding.call(model=TextEmbedding.Models.text_embedding_v1,input=news)embeddings = [record['embedding'] for record in rsp.output['embeddings']]return embeddings if isinstance(news, list) else embeddings[0]if __name__ == '__main__':dashscope.api_key = '{your-dashscope-api-key}'

然后,创建 search.py 文件,并将如下示例代码复制到 search.py 文件中,通过 DashVector 的向量检索能力来检索相似度的最高的内容。search.py

from dashvector import Clientfrom embedding import generate_embeddingsdef search_relevant_news(question):# 初始化 dashvector clientclient = Client(api_key='{your-dashvector-api-key}',endpoint='{your-dashvector-cluster-endpoint}')# 获取存入的集合collection = client.get('news_embedings')assert collection# 向量检索:指定 topk = 1 rsp = collection.query(generate_embeddings(question), output_fields=['raw'],topk=1)assert rspreturn rsp.output[0].fields['raw']

创建 answer.py 文件,我们就可以按照特定的模板作为 prompt 向 LLM 发起提问了,在这里我们选用的 LLM 是通义千问(qwen-turbo),代码示例如下:

answer.py

from dashscope import Generationdef answer_question(question, context):prompt = f'''请基于```内的内容回答问题。"```{context}```我的问题是:{question}。'''rsp = Generation.call(model='qwen-turbo', prompt=prompt)return rsp.output.text

最后,创建 run.py 文件,并将如下示例代码复制到 run.py 文件中,并最终执行 run.py 文件。(验证时,可在绑定的 OSS Bucket 上传需要被检索的知识库信息。)

import dashscopefrom search import search_relevant_news
from answer import answer_questionif __name__ == '__main__':dashscope.api_key = '{your-dashscope-api-key}'question = 'EventBridge 是什么,它有哪些能力?'context = search_relevant_news(question)answer = answer_question(question, context)print(f'question: {question}\n' f'answer: {answer}')

总结

从本文的范例中,我们可以比较方便的使用 EventBridge 提供的 OSS To DashVector 离线数据流导入能力,开箱即用的构建强大向量检索服务能力,这些能力和各个 AI 模型结合,能够衍生多样的 AI 应用的可能。同样,Transform 部分使用了函数计算能力,可以更灵活的制定想要的 Split 切分算法,提供更灵活且具备生产力的 RAG 方案。

相关链接:

[1] 灵积模型服务

https://dashscope.aliyun.com/

[2] Embedding API

https://help.aliyun.com/zh/dashscope/developer-reference/text-embedding-api-details

[3] DashScope 控制台

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fdashscope.console.aliyun.com%2Foverview&clearRedirectCookie=1&lang=zh

[4] 新建 DashVector Cluster

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fdashvector.console.aliyun.com%2Fcn-hangzhou%2Fcluster&clearRedirectCookie=1&lang=zh

[5] EventBridge 控制台

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Feventbridge.console.aliyun.com%2F&clearRedirectCookie=1&lang=zh

[6] 《为函数安装第三方依赖》

https://help.aliyun.com/zh/functioncompute/fc-3-0/user-guide/install-third-party-dependencies-for-a-function

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GooglePlay: 应用和游戏的内容分级

对于后台私信的开发者们,希望能够携带详细过审记录和拒审邮件一同发来,方便我们尽快解决问题 应用与游戏 为您的应用或游戏选择类别和标签选择要添加的标签选择类别并添加标签类别示例与应用、游戏以及两者中所投放广告的内容分级相关的要求应用如何获得内容分级内容分级的用…

将Notepad++添加到右键菜单【一招实现】

一键添加注册表 复制以下代码保存为 Notepad.reg,将红框内路径修改为自己电脑的“Notepad.exe路径”后,再双击运行即可。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad" "Icon""D:\\N…

[复健计划][紫书]Chapter 7 暴力求解法

7.1 简单枚举 例7-1 Division uva725 输入正整数n,按从小到大的顺序输出所有形如abcde/fghij n的表达式,其中a~j恰好为数字0~9的一个排列(可以有前导0),2≤n≤79。枚举fghij,验证a…

【测试工具篇一】全网最强保姆级教程抓包工具Fiddler(2)

本文接上篇Fiddler介绍,开始讲fiddler如何使用之前,给大家讲讲http以及web方面的小知识,方便大家后面更好得理解fiddler使用。 目录 一、软件体系结构---B/S与C/S架构 B/S架构 C/S架构 二、HTTP基础知识 什么是http请求和响应? http协…

如何基于pdf2image实现pdf批量转换为图片

最近为了将pdf报告解析成为文本和图片,需要将大量多页的pdf文件拆分下单独的一页一页的图像,以便后续进行OCR和图像处理,因此就需要实现将pdf2image,本文主要结合开源的pdf2image和poppler,实现了pdf转换为png格式图片…

【Linux】Linux下查看cpu信息指令(top/mpstat/iostat/pidstat)说明

top命令 top(1) - Linux manual page (man7.org) top查看总的CPU利用率 us: 用户空间消耗的CPU资源占比,进程在用户态执行函数调用,编解码消耗的都是us sy: 内核空间消耗的CPU资源占比,进程调用系统调用达到内核后会增加sy的消耗 ni&…

Java学习者的福音:SpringBoot教学辅助平台

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理教学辅助平台的相关信息成为必然。开发合适…

csrf令牌

csrf get请求 路由 // index.php Route::get(/, function () {// return view(welcome);return view(login); });Route::get(d3,function(Request $request){echo "输入的内容是" . "<font color>".$request -> input(mytext)."</fon…

高校实验室安全巡检系统设计与实现(源码+定制+开发)高校实验室巡检系统、实验室安全管理平台、实验室安全监控系统、智能实验室巡查系统、高校实验室风险管理

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

容器内pip安装Apache Airflow的经历:如何重置初始密码

背景 Apache Airflow™https://github.com/apache/airflow 是一个开源平台&#xff0c;用于开发、调度和监控面向批处理的工作流程。Airflow 可扩展的 Python 框架使您能够构建几乎可以连接任何技术的工作流程。Web 界面有助于管理工作流程的状态。Airflow 可以通过多种方式部…

微服务透传日志traceId

问题 在微服务架构中&#xff0c;一次业务执行完可能需要跨多个服务&#xff0c;这个时候&#xff0c;我们想看到业务完整的日志信息&#xff0c;就要从各个服务中获取&#xff0c;即便是使用了ELK把日志收集到一起&#xff0c;但如果不做处理&#xff0c;也是无法完整把一次业…

精心整理教育研究专题数据资源大全-最新出炉_附下载链接

教育研究专题数据资源大全V1.0 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a;教育研究专题数据资源大全-最新出炉.zip 资源介绍 一、中国教育统计年鉴面板数据 简介&#xff1a;《中国教育统计年鉴》是由教育部发展规划司根据全国各省、自治区、直辖市…

汽修行业员工培训SOP的智能化搭建

汽修行业正经历着技术革新和服务模式的双重变革&#xff0c;员工的专业培训变得尤为重要。智能化的员工培训标准操作程序&#xff08;SOP&#xff09;在线知识库不仅能够提升培训效率&#xff0c;还能确保服务质量和作业安全。本文将探讨汽修行业如何智能化地搭建员工培训的SOP…

还在担心Mac卸载不干净?XApp帮你干净完成卸载

Mac的卸载机制非常独特&#xff0c;虽然将app拖拽到废纸篓也能够完成卸载&#xff0c;但是会有很多的文件残留&#xff0c;那么如何卸载干净非常重要 XApp&#xff0c;免费的Mac卸载工具&#xff0c;有着强大的垃圾检测机制&#xff0c;检测出更深层的垃圾&#xff0c;卸载更干…

游戏测试之浅谈测试思维

一、游戏测试与软件测试的区别 1、测试目标 软件测试&#xff1a;主要目标是确保软件在功能、性能、安全性等方面达到预期质量标准。关注点主要是软件的正确性、稳定性、安全性和效率。 游戏测试&#xff1a;不仅关注游戏的功能性和稳定性&#xff0c;还要关注游戏的体验性、平…

为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?

文章目录 前言1.关于Uptime Kuma2.安装Docker3.本地部署Uptime Kuma4.使用Uptime Kuma5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 本篇文章介绍如何在本地部署Uptime Kuma&#xff0c;并结合cpolar内网穿透实现公网远程访问。 说起网站相…

使用Python创建自助抢单插件的完整指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入 Med-BERT:pretrained contextualized embeddings on large-scale structured electronic health records for disease prediction ​ ​ 摘要:基于电子健康记录(EHR)的深度学习(DL)预…

MinGW-w64_10.0.0 + GCC12_x86_64-12.2.0-release-posix-seh-msvcrt-rt_v10-rev2.zip

主题&#xff1a;mingw-w64安装 以及 matlab适配mingw-w64&#xff0c;g&#xff0c;gcc 无套路直接下载mingw-w64 for matlab 通过百度网盘分享的文件&#xff1a; MinGW-w64_10.0.0 GCC12_x86_64-12.2.0-release-posix-seh-msvcrt-rt_v10-rev2.zip 链接&#xff1a;https…

一文了解git TAG

Git标签&#xff08;Tag&#xff09;用于为 Git 历史中的特定提交打上标记&#xff0c;通常用于标识重要的节点&#xff0c;比如发布版本。标签让开发者可以很方便地对特定版本进行引用&#xff0c;且不会随时间变动。Git 中的标签分为两种&#xff1a;轻量标签和附注标签。 …