通过阿里云 Milvus 和 LangChain 快速构建 LLM 问答系统

背景介绍

阿里云向量检索 Milvus 版是一款云上全托管服务,确保了与开源Milvus的100%兼容性,并支持无缝迁移。在开源版本的基础上增强了可扩展性,能提供大规模 AI 向量数据的相似性检索服务。相比于自建,目前阿里云Milvus具备易用性、可用性、安全性、低成本与生态优势。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,阿里云Milvus 云服务成为多样化 AI 应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的 Attu 工具进行可视化操作,进一步促进应用的快速开发和部署。

本文介绍如何通过整合阿里云向量检索服务Milvus版、阿里云百炼DashScope Embedding模型与阿里云PAI(EAS)模型服务,构建一个由LLM(大型语言模型)驱动的问题解答应用,并着重演示了如何搭建基于这些技术的RAG对话系统。

前提条件

  • 已创建Milvus实例。

进入阿里云Milvus页面(向量检索服务 Milvus 版_向量检索引擎_多模态检索_计算-阿里云),登录阿里云Milvus控制台(阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台)。并在左侧导航栏,单击Milvus实例,并继续创建实例

  • 已开通PAI(EAS)并创建了默认工作空间。

登录PAI控制台(https://pai.console.aliyun.com),在左上角选择需要开通的地域后,进行认证、授权并开通服务,待开通成功后,便可进入控制台进行AI开发。

  • 已开通百炼服务并获得API-KEY。

登陆阿里云百炼大模型服务平台(https://bailian.console.aliyun.com),在页面右上角的下拉菜单中单击API-KEY,进行创建。

使用限制

  • Milvus实例和PAI(EAS)须在相同地域下。

  • 请确保您的运行环境中已安装Python 3.8或以上版本,以便顺利安装并使用DashScope。

方案架构

该方案架构如下图所示,主要包含以下几个处理过程:

  • 知识库预处理:您可以借助LangChain SDK对文本进行分割,作为Embedding模型的输入数据。

  • 知识库存储:选定的Embedding模型(DashScope)负责将输入文本转换为向量,并将这些向量存入阿里云Milvus的向量数据库中。

  • 向量相似性检索:Embedding模型处理用户的查询输入,并将其向量化。随后,利用阿里云Milvus的索引功能来识别出相应的Retrieved文档集。

  • RAG(Retrieval-Augmented Generation)对话验证:您使用LangChain SDK,并将相似性检索的结果作为上下文,将问题导入到LLM模型(本例中用的是阿里云PAI EAS),以产生最终的回答。此外,结果可以通过将问题直接查询LLM模型得到的答案进行核实。

操作流程

步骤一:部署对话模型推理服务

  1. 进入模型在线服务页面。

    1. 登录PAI控制台(https://pai.console.aliyun.com/)。

    2. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。

    3. 在工作空间页面的左侧导航栏选择模型部署>模型在线服务(EAS),进入模型在线服务(EAS)页面。

  2. 模型在线服务页面,单击部署服务

  3. 部署服务页面,选择大模型RAG对话系统

  4. 部署大模型RAG对话系统页面,配置以下关键参数,其余参数可使用默认配置,更多参数详情请参见大模型RAG对话系统(https://help.aliyun.com/zh/pai/user-guide/deploy-a-rag-based-dialogue-system)。

5. 单击部署

服务状态变为运行中时,表示服务部署成功。

6. 获取VPC地址调用的服务访问地址和Token。

  1. 单击服务名称,进入概览页面。

  2. 基本信息区域,单击查看调用信息

  3. 调用信息对话框的VPC地址调用页签,获取服务访问地址和Token,并保存到本地。

步骤二:创建并执行Python文件

  1. (可选)在ECS控制台创建并启动一个开通公网的ECS实例,用于运行Python文件,详情请参见通过控制台使用ECS实例(快捷版)(https://help.aliyun.com/zh/ecs/getting-started/create-and-manage-an-ecs-instance-by-using-the-ecs-console)。

您也可以在本地机器执行Python文件,具体请根据您的实际情况作出合适的选择。

        2. 执行以下命令,安装相关依赖库。

pip3 install pymilvus langchain dashscope beautifulsoup4

        3. 执行以下命令,创建milvusr-llm.py文件。

vim milvusr-llm.py

milvusr-llm.py文件内容如下所示。

from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores.milvus import Milvus
from langchain.schema.runnable import RunnablePassthrough
from langchain.prompts import PromptTemplate
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.llms.pai_eas_endpoint import PaiEasEndpoint# 设置Milvus Collection名称。
COLLECTION_NAME = 'doc_qa_db'# 设置向量维度。
DIMENSION = 768loader = WebBaseLoader(['https://milvus.io/docs/overview.md','https://milvus.io/docs/release_notes.md','https://milvus.io/docs/architecture_overview.md','https://milvus.io/docs/four_layers.md','https://milvus.io/docs/main_components.md','https://milvus.io/docs/data_processing.md','https://milvus.io/docs/bitset.md','https://milvus.io/docs/boolean.md','https://milvus.io/docs/consistency.md','https://milvus.io/docs/coordinator_ha.md','https://milvus.io/docs/replica.md','https://milvus.io/docs/knowhere.md','https://milvus.io/docs/schema.md','https://milvus.io/docs/dynamic_schema.md','https://milvus.io/docs/json_data_type.md','https://milvus.io/docs/metric.md','https://milvus.io/docs/partition_key.md','https://milvus.io/docs/multi_tenancy.md','https://milvus.io/docs/timestamp.md','https://milvus.io/docs/users_and_roles.md','https://milvus.io/docs/index.md','https://milvus.io/docs/disk_index.md','https://milvus.io/docs/scalar_index.md','https://milvus.io/docs/performance_faq.md','https://milvus.io/docs/product_faq.md','https://milvus.io/docs/operational_faq.md','https://milvus.io/docs/troubleshooting.md',
])docs = loader.load()text_splitter = RecursiveCharacterTextSplitter(chunk_size=1024, chunk_overlap=0)# 使用LangChain将输入文档安照chunk_size切分
all_splits = text_splitter.split_documents(docs)# 设置embedding模型为DashScope(可以替换成自己模型)。embeddings = DashScopeEmbeddings(model="text-embedding-v2", dashscope_api_key="your_api_key"
)# 创建connection,host为阿里云Milvus的访问域名。connection_args = {"host": "c-xxxx.milvus.aliyuncs.com", "port": "19530", "user": "your_user", "password": "your_password"}
# 创建Collection
vector_store = Milvus(embedding_function=embeddings,connection_args=connection_args,collection_name=COLLECTION_NAME,drop_old=True,
).from_documents(all_splits,embedding=embeddings,collection_name=COLLECTION_NAME,connection_args=connection_args,
)# 利用Milvus向量数据库进行相似性检索。query = "What are the main components of Milvus?"
docs = vector_store.similarity_search(query)
print(len(docs))# 声明LLM 模型为PAI EAS(可以替换成自己模型)。llm = PaiEasEndpoint(eas_service_url="your_pai_eas_url",eas_service_token="your_token",
)# 将上述相似性检索的结果作为retriever,提出问题输入到LLM之后,获取检索增强之后的回答。retriever = vector_store.as_retriever()template = """Use the following pieces of context to answer the question at the end.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
Use three sentences maximum and keep the answer as concise as possible.
Always say "thanks for asking!" at the end of the answer.
{context}
Question: {question}
Helpful Answer:"""
rag_prompt = PromptTemplate.from_template(template)rag_chain = ({"context": retriever, "question": RunnablePassthrough()}| rag_prompt| llm
)print(rag_chain.invoke("Explain IVF_FLAT in Milvus."))

以下参数请根据实际环境替换。

        4. 执行以下命令运行文件。

python3 milvusr-llm.py

返回如下类似信息。

4
IVF_FLAT is a type of index in Milvus that divides vector data into nlist cluster units and compares distances between the target input vector and the center of each cluster. It uses a smaller number of clusters than IVF_FLAT, which means it may have slightly higher query time but also requires less memory. The encoded data stored in each unit is consistent with the original data.

相关信息

  • 更多关于Milvus的介绍,请参见什么是向量检索服务Milvus版(https://help.aliyun.com/zh/milvus/product-overview/what-is-the-vector-retrieval-milvus-version)。

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

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

相关文章

云原生是什么

云原生是一种构建和运行应用程序的方法,它充分利用了云计算的优势。它不仅仅是指在云上运行应用程序,更重要的是指应用程序的设计、开发、部署和运维方式都充分考虑了云环境的特性,从而能够更好地利用云的弹性、可扩展性和灵活性。 更详细地…

LeetCode刷题day29——动态规划(完全背包)

LeetCode刷题day29——动态规划(完全背包) 377. 组合总和 Ⅳ分析: 57. 爬楼梯(第八期模拟笔试)题目描述输入描述输出描述输入示例输出示例提示信息 分析: 322. 零钱兑换分析: 279. 完全平方数分…

多个Echart遍历生成 / 词图云

echart官网 安装 如果版本报错推荐安装以下版本 npm install echarts4.8.0 --savenpm uninstall echarts//这个是卸载命令以下安装成功后是局部引入:多个Echart遍历生成 vue3echart单个页面多个图表循环渲染展示:<template><div class"main"><div …

LabVIEW伸缩臂参数监控系统

LabVIEW开发伸缩臂越野叉车参数监控系统主要应用于工程机械中的越野叉车&#xff0c;以提高车辆的作业效率和故障诊断能力。系统通过PEAK CAN硬件接口和LabVIEW软件平台实现对叉车作业参数的实时监控和故障分析&#xff0c;具有良好的实用性和推广价值。 系统组成 系统主要由P…

【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )

文章目录 一、解封装1、封装与解封装流程2、解封装 常用函数 二、解封装函数简介1、avformat_alloc_context 函数2、avformat_free_context 函数3、avformat_open_input 函数4、avformat_close_input 函数5、avformat_find_stream_info 函数6、av_read_frame 函数7、avformat_s…

windows 自旋锁的实现

VOID KxAcquireSpinLock ( __inout PKSPIN_LOCK SpinLock) {//设置SpinLock指定位,并返回原值//如果原值为0,表示没有上锁,直接返回//如果原值为1,表示已经上锁,进入函数if (InterlockedBitTestAndSet64((LONG64 *)SpinLock, 0)){KxWaitForSpinLockAndAcquire(SpinLock);}retur…

YOLOv8目标检测——详细记录使用ONNX Runtime进行推理部署C++/Python实现

概述 在之前博客中有介绍YOLOv8从环境安装到训练的完整过程&#xff0c;本节主要介绍ONNX Runtime的原理以及使用其进行推理加速&#xff0c;使用Python、C两种编程语言来实现。 https://blog.csdn.net/MariLN/article/details/143924548?spm1001.2014.3001.5501 1. ONNX Ru…

python学opencv|读取图像(十六)修改HSV图像HSV值

【1】引言 前序学习进程中&#xff0c;我们已经掌握了对HSV通道和BGR通道的拆分和合并&#xff0c;并通过自由组合的形式&#xff0c;获得了和初始图像完全不一样的新图像&#xff0c;相关文章可以参考下述链接&#xff1a; python学opencv|读取图像&#xff08;十四&#xf…

【进阶编程】MVC和MVVM实现前后端分离的实现

在 WPF 开发中&#xff0c;通常使用 MVVM&#xff08;Model-View-ViewModel&#xff09;架构来分离视图和业务逻辑&#xff0c;但在某些情况下&#xff0c;你可能希望将 MVC&#xff08;Model-View-Controller&#xff09;模式与 MVVM 结合使用。这种结合有时是为了兼顾不同的架…

CEF127 编译指南 MacOS 篇 - 编译 CEF(六)

1. 引言 经过前面的准备工作&#xff0c;我们已经完成了所有必要的环境配置。本文将详细介绍如何在 macOS 系统上编译 CEF127。通过正确的编译命令和参数配置&#xff0c;我们将完成 CEF 的构建工作&#xff0c;最终生成可用的二进制文件。 2. 编译前准备 2.1 确认环境变量 …

关于小程序内嵌h5打开新的小程序

关于小程序内嵌h5打开新的小程序 三种方式 https://juejin.cn/post/7055551463489011749 只依赖于h5本身的就是 https://huaweicloud.csdn.net/64f97ebb6b896f66024ca16c.html https://juejin.cn/post/7055551463489011749 navigateToMiniProgram 故小程序webview里的h5无法…

网络安全技术深度解析与实践案例

网络安全技术深度解析与实践案例 随着信息技术的飞速发展&#xff0c;计算机网络已经成为现代社会不可或缺的一部分。无论是个人生活、企业运营还是国家安全&#xff0c;网络都扮演着至关重要的角色。然而&#xff0c;网络空间的开放性和匿名性也带来了诸多安全隐患。因此&…

[一招过] Python的正则表达式篇

Python 正则表达式&#xff08;re模块&#xff09; 正则表达式&#xff08;regular expression&#xff09;是用于匹配字符串的一种强大工具。Python 提供了 re 模块来处理正则表达式。通过正则表达式&#xff0c;可以快速匹配、查找、替换、分割字符串等。 1. re 模块基础 …

Zerotier + VSCode远程连接实验室的服务器、Xshell连接远程服务器

目录 1. 本地安装 Zerotier2. 使用本地CMD或者Xshell连接服务器&#xff1a;3. VSCode连接服务器 1. 本地安装 Zerotier Zerotier用来创建一个虚拟网络&#xff0c;可以将服务器和本机都加入该虚拟网络中。本地将会拥有一个内网ip地址&#xff0c;和服务器在一个网络下&#x…

gcd 生成4d

目录 推理示例: 开源地址 https://github.com/basilevh/gcd 推理示例: This section is for casually running our model on custom videos. For thorough quantitative evaluation on Kubric-4D or ParallelDomain-4D, or any command line inference outside of those t…

网安入门|前端基础之Html_css基础

Web1.0、Web2.0 和 Web3.0 是互联网发展的三个主要阶段&#xff0c;每个阶段有其独特的特征和技术进步。以下是对它们的介绍&#xff1a; Web 1.0&#xff08;静态互联网&#xff09; 时间&#xff1a;1990年代初到2000年代初 特点&#xff1a; 静态内容&#xff1a;网页主要…

开发平台接口规范:北斗终端->北斗三号卫星->指挥机(北斗终端)->北斗短报文融合平台->客户平台(上行)| 时空信息产品

文章目录 引言I 技术架构和业务流程技术架构北斗终端信息流II 渠道接口验证签名白名单IP渠道配置表设计III 其他辅助功能TCP 发送消息到消息中心nginx转发网关服务异常捕获日志采集IV 知识扩展对请求参数进行校验引言 开发平台的应用场景:平台需要开发能力给下游平台需要接收上…

知识分享第三十天-力扣343.(整数拆分)

343 整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 说明: 你可…

C语言中回调函数的注册及使用

1&#xff0c;回调函数类型定义 #include <stdio.h>// 定义回调函数类型 typedef void (*CallbackFunction)(int); 2&#xff0c;定义注册和调用回调函数的函数 // 存储回调函数的数组 CallbackFunction callbacks[10]; int callback_count 0;// 注册回调函数 void r…

SQL Server 解决游标性能问题的替代方案

在 SQL Server 中&#xff0c;游标&#xff08;Cursor&#xff09;是一种用于逐行处理数据集的强大工具&#xff0c;但在某些情况下&#xff0c;它们可能会导致性能问题&#xff0c;尤其是在处理大量数据时。为了提高性能和可维护性&#xff0c;可以考虑使用其他替代方案。以下…