Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >开发基于云的RAG应用,使用开源 LLM

开发基于云的RAG应用,使用开源 LLM

作者头像
云云众生s
发布于 2024-07-07 06:15:10
发布于 2024-07-07 06:15:10
30200
代码可运行
举报
文章被收录于专栏:云云众生s云云众生s
运行总次数:0
代码可运行

按照以下步骤指南,使用 BentoML、LangChain 和 MyScaleDB 创建自定义 AI 应用程序。

译自 Develop a Cloud-Hosted RAG App With an Open Source LLM,作者 Usama Jamil。

检索增强生成 (RAG) 通常用于开发定制的 AI 应用程序,包括 聊天机器人推荐系统 和其他个性化工具。该系统利用向量数据库大型语言模型 (LLM) 的优势来提供高质量的结果。

为任何 RAG 模型选择合适的 LLM 非常重要,需要考虑成本、隐私问题和可扩展性等因素。OpenAI 的 GPT-4Google 的 Gemini 等商业 LLM 非常有效,但可能很昂贵并引发数据隐私问题。一些用户更喜欢 开源 LLM,因为它们灵活且节省成本,但它们需要大量资源进行 微调 和部署,包括 GPU 和专用基础设施。此外,使用本地设置管理模型更新和可扩展性可能具有挑战性。

更好的解决方案是选择一个 开源 LLM 并将其部署在 上。这种方法提供了必要的计算能力和可扩展性,而无需本地托管的高成本和复杂性。它不仅节省了初始基础设施成本,而且还最大限度地减少了维护问题。

让我们探索一种类似的方法来开发使用云托管开源 LLM 和可扩展向量数据库的应用程序。

工具和技术

开发此基于 RAG 的 AI 应用程序需要使用多种工具。这些工具包括:

  • BentoML: BentoML 是一个开源平台,简化了机器学习模型的部署到生产就绪的 API,确保可扩展性和易于管理。
  • LangChain: LangChain 是一个用于使用 LLM 构建应用程序的框架。它提供模块化组件,便于集成和定制。
  • MyScaleDB: MyScaleDB 是一个高性能、可扩展的数据库,针对高效的数据检索和存储进行了优化,支持高级查询功能。

在本教程中,我们将使用 LangChain 的 WikipediaLoader 模块从维基百科中提取数据,并在该数据上构建 LLM。

准备

设置环境

通过打开终端并输入以下内容,开始设置您的环境以在系统中使用 BentoML、MyScaleDB 和 LangChain

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install bentoml langchain clickhouse-connect

这将在您的系统中安装所有三个软件包。之后,您就可以编写代码并开发 RAG 应用程序了。

加载数据

首先从 langchain_community.document_loaders.wikipedia 模块导入 WikipediaLoader。您将使用此加载器来获取与 “阿尔伯特·爱因斯坦”相关的维基百科文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from langchain_community.document_loaders.wikipedia import WikipediaLoader
loader = WikipediaLoader(query="Albert Einstein")

# Load the documents
docs = loader.load()

# Display the content of the first document
print(docs[0].page_content)

这使用 load 方法检索“阿尔伯特·爱因斯坦”文档,并使用 print 方法打印第一个文档的内容以验证加载的数据。

将文本拆分为块

导入来自 CharacterTextSplitter langchain_text_splitters,将所有页面的内容合并到一个字符串中,然后将文本拆分为可管理的块。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from langchain_text_splitters import CharacterTextSplitter
# Split the text into chunks
text = ' '.join([page.page_content.replace('\\t', ' ') for page in docs])
text_splitter = CharacterTextSplitter(
   separator="\\n",
   chunk_size=400,
   chunk_overlap=100,
   length_function=len,
   is_separator_regex=False,
)
texts = text_splitter.create_documents([text])
splits = [item.page_content for item in texts]

CharacterTextSplitter 配置为将此文本拆分为 400 个字符的块,重叠 100 个字符,以确保块之间不会丢失任何信息。page_content 或文本存储在 splits 数组中,该数组仅包含文本内容。您将使用 splits 数组来获取 嵌入

在 BentoML 上部署模型

... 您的数据已准备就绪,下一步是在 BentoML 上部署模型并在您的 RAG 应用程序中使用它们。首先部署 LLM。您需要一个免费的 BentoML 帐户,如果您需要,可以 在 BentoCloud 上注册一个。接下来,导航到 部署 部分,然后单击右上角的 创建部署 按钮。将打开一个新页面,如下所示:

BentoML 部署页面
BentoML 部署页面

BentoML 部署页面

从下拉菜单中选择 bentoml/bentovllm-llama3-8b-instruct-service 模型,然后单击右下角的“提交”。这将开始部署模型。将打开一个新的页面,如下所示:

LLM 配置页面
LLM 配置页面

LLM 配置页面

部署可能需要一些时间。部署完成后,复制端点。

注意:BentoML 的免费层级只允许部署单个模型。如果您有付费计划并且可以部署多个模型,请按照以下步骤操作。如果没有,不用担心 - 我们将在本地使用开源模型进行嵌入。

部署嵌入模型与您部署 LLM 所采取的步骤非常相似:

  1. 转到 部署 页面。
  2. 点击 创建部署 按钮。
  3. 选择 sentence-transformers 模型,然后单击 提交
  4. 部署完成后,复制端点。

接下来,转到 API 令牌页面 并生成一个新的 API 密钥。现在您已准备好将部署的模型用于您的 RAG 应用程序。

定义嵌入方法

您将定义一个名为 get_embeddings 的函数来为提供的文本生成嵌入。此函数接受三个参数。如果提供了 BentoML 端点和 API 令牌,则该函数使用 BentoML 的嵌入服务;否则,它使用本地 transformerstorch 库来加载 sentence-transformers/all-MiniLM-L6-v2 模型并生成嵌入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Import the libraries
import subprocess
import sys
import numpy as np

# Install the packages if the API key isn't provided
def install(package):
   subprocess.check_call([sys.executable, "-m", "pip", "install", package])

# Define the embedding method
def get_embeddings(texts: list, BENTO_EMBEDDING_MODEL_END_POINT=None, BENTO_API_TOKEN=None) -> list:
   # If the BentoML KEY is provided, the method will use BENTOML model to get embeddings
   if BENTO_EMBEDDING_MODEL_END_POINT and BENTO_API_TOKEN:
       import bentoml
       embedding_client = bentoml.SyncHTTPClient(BENTO_EMBEDDING_MODEL_END_POINT, token=BENTO_API_TOKEN)
       return embedding_client.encode(sentences=texts).tolist()
  
   # Otherwise it'll use transformers library
   else:
       # Install transformers and torch if not already installed
       try:
           import transformers
       except ImportError:
           install("transformers")
       try:
           import torch
       except ImportError:
           install("torch")
      
       from transformers import AutoTokenizer, AutoModel
      
       # Initialize the tokenizer and model for embeddings
       tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
       model = AutoModel.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
      
       inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt", max_length=512)
       with torch.no_grad():
           outputs = model(**inputs)
       embeddings = outputs.last_hidden_state.mean(dim=1)
       return embeddings.numpy().tolist()

此设置允许免费层级 BentoML 用户灵活使用,他们一次只能部署一个模型。如果您有付费版本的 BentoML 并且可以部署两个模型,则可以传递 BentoML 端点和 Bento API 令牌以使用部署的嵌入模型。

获取嵌入

25 的批次迭代文本块 (splits) 以使用上面定义的 get_embeddings 函数生成嵌入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
all_embeddings = []
# Pass the splits in a batch of 25
for i in range(0, len(splits), 25):
   batch = splits[i:i+25]
   # Pass the batch to the get_embeddings method
   embeddings_batch = get_embeddings(batch)
   # Append the embeddings to the all_embeddings list holdng the embeddings of the whole dataset
   all_embeddings.extend(embeddings_batch)

这可以防止一次将过多的数据加载到嵌入模型中,这对于管理内存和计算资源特别有用。

创建数据帧

现在,创建一个 pandas 数据帧来存储文本块及其相应的嵌入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
df = pd.DataFrame({
   'page_content': splits,
   'embeddings': all_embeddings
})

这种结构化格式使在 MyScaleDB 中操作和存储数据变得更加容易。

连接到 MyScaleDB

知识库已完成,现在是将数据保存到向量数据库的时候了。此演示使用 MyScaleDB 进行向量存储。通过遵循 快速入门指南 在云环境中启动 MyScaleDB 集群。然后,您可以使用 clickhouse_connect 库建立与 MyScaleDB 数据库的连接。 此处创建的客户端对象将用于执行 SQL 命令并与数据库交互。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import clickhouse_connect
client = clickhouse_connect.get_client(
   host='your-host-name',
   port=443,
   username='your-user-name',
   password='your-password'
)

创建表并插入数据

在 MyScaleDB 中创建一个表来存储文本块和嵌入。表模式包括一个 idpage_contentembeddings

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Create the table named RAG
client.command("""
CREATE TABLE IF NOT EXISTS default.RAG (
   id Int64,
   page_content String,
   embeddings Array(Float32),
   CONSTRAINT check_data_length CHECK length(embeddings) = 384
) ENGINE = MergeTree()
   ORDER BY id
""")

# Insert data into the table
batch_size = 100
num_batches = (len(df) + batch_size - 1) // batch_size

for i in range(num_batches):
   batch_data = df[i * batch_size: (i + 1) * batch_size]
   client.insert('default.RAG', batch_data.values.tolist(), column_names=batch_data.columns.tolist())
   print(f"Batch {i+1}/{num_batches} inserted.")

这确保嵌入具有 384 的固定长度。然后将数据帧中的数据以批次插入表中,以有效地管理大量数据。

创建向量索引

下一步是在 RAG 表中的 embeddings 列中添加向量索引。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client.command("""
ALTER TABLE default.RAG
   ADD VECTOR INDEX vector_index embeddings
   TYPE MSTG
""")

向量索引允许进行有效的相似性搜索,这对于检索增强生成任务至关重要。

检索相关向量

定义一个函数,根据用户查询检索相关文档。查询嵌入是使用 get_embeddings 函数生成的,并且执行高级 SQL 向量查询以在数据库中找到最接近的匹配项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_relevant_docs(user_query, top_k):
   query_embeddings = get_embeddings(user_query)[0]
   results = client.query(f"""
       SELECT page_content,
       distance(embeddings, {query_embeddings}) as dist FROM default.RAG ORDER BY dist LIMIT {top_k}
   """)
   relevant_docs = " "
  
   for row in results.named_results():
       relevant_docs=relevant_docs + row["page_content"]
  
   return relevant_docs

# Example query
message="Who is albert einstein?"
relevant_docs = get_relevant_docs(message, 8)
print(relevant_docs)

结果按距离排序,并返回前 k 个匹配项。此设置找到了给定查询的最相关文档。

注意:distance 方法接受一个嵌入列和用户查询的嵌入向量,通过应用余弦相似度来查找相似的文档。

连接到 BentoML LLM

建立与您在 BentoML 上托管的 LLM 的连接。llm_client 对象将用于与 LLM 交互,以根据检索到的文档生成响应。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import bentoml
BENTO_LLM_END_POINT = "add-your-end-point-here"

llm_client = bentoml.SyncHTTPClient(BENTO_LLM_END_POINT, token="your-token-here")

替换 BENTO_LLM_END_POINT 以及 token 使用您之前在 LLM 部署期间复制的值。

执行 RAG

定义一个执行 RAG 的函数。该函数以用户问题和检索到的上下文作为输入。它为 LLM 构建一个提示,指示它根据提供的上下文回答问题。然后将 LLM 的响应作为答案返回。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def dorag(question: str, context: str):
   # Define the prompt template
   prompt = (f"You are a helpful assistant. The user has a question. Answer the user question based only on the context: {context}. \\n"
             f"The user question is {question}")
   # Call the LLM endpoint with the prompt defined above
   results = llm_client.generate(
       max_tokens=1024,
       prompt=prompt,
   )
   res = ""
   for result in results:
       res += result
   return res

进行查询

最后,您可以通过对 RAG 应用程序进行查询来测试它。询问“谁是阿尔伯特·爱因斯坦?”并使用 dorag 函数根据之前检索到的相关文档获取答案。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
query = "Who is albert einstein?"
dorag(question=query, context=relevant_docs)

输出提供了对问题的详细响应,证明了 RAG 设置的有效性。

LLM 响应提供了关于阿尔伯特·爱因斯坦的传记信息
LLM 响应提供了关于阿尔伯特·爱因斯坦的传记信息

LLM 响应

如果您询问 RAG 模型关于阿尔伯特·爱因斯坦的死亡,响应应该如下所示:

LLM 响应提供了关于阿尔伯特·爱因斯坦死亡的信息
LLM 响应提供了关于阿尔伯特·爱因斯坦死亡的信息

LLM 响应

结论

BentoML 作为部署机器学习模型(包括 LLM)的出色平台而脱颖而出,无需费心管理资源。使用 BentoML,您可以快速部署和扩展您的 AI 应用程序到云端,确保它们已准备好投入生产并高度可访问。它的简单性和灵活性使其成为开发人员的理想选择,使他们能够更多地专注于创新,而无需过多关注部署复杂性。

另一方面,MyScaleDB 是专门为 RAG 应用程序开发的,提供高性能 SQL 向量数据库。它熟悉的 SQL 语法使开发人员可以轻松地将其集成到他们的应用程序中并使用它,因为学习曲线很小。MyScaleDB 的 多尺度树图 (MSTG) 算法在速度和准确性方面明显优于其他向量数据库。此外,MyScaleDB 为每个新用户提供高达 500 万个向量的免费存储空间,使其成为希望实施高效且可扩展的 AI 解决方案的开发人员的理想选择。

您对此项目有何看法?在 TwitterDiscord 上分享您的想法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-062,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
告别人工提示,用DSPy编程
DSPy 框架旨在通过优先考虑声明式、系统化编程而不是手动编写提示来解决一致性和可靠性问题。
云云众生s
2024/07/12
3640
Langchain 和 RAG 最佳实践
这是一篇关于LangChain和RAG的快速入门文章,主要参考了由Harrison Chase和Andrew Ng讲授的Langchain chat with your data课程。你可以在rag101仓库中查看完整代码。本文翻译自我的英文博客,最新修订内容可随时参考:LangChain 与 RAG 最佳实践。
timerring
2025/03/05
880
【AIGC】通过RAG架构LLM应用程序
在之前的博客文章中,我们已经描述了嵌入是如何工作的,以及RAG技术是什么。本节我们我们将使用 LangChain 库以及 RAG 和嵌入技术在 Python 中构建一个简单的 LLM 应用程序。
Freedom123
2024/05/08
2440
【LangChain系列3】【检索模块详解】
总结: LangChain是一个用于开发由LLM支持的应用程序的框架,通过提供标准化且丰富的模块抽象,构建LLM的输入输出规范,主要是利用其核心概念chains,可以灵活地链接整个应用开发流程。(即,其中的每个模块抽象,都是源于对大模型的深入理解和实践经验,由许多开发者提供出来的标准化流程和解决方案的抽象,再通过灵活的模块化组合,才得到了langchain)
Alice师傅的好宝宝
2025/01/07
3100
LangChain大模型应用开发
LangChain作为一个新兴的框架,旨在简化大模型应用的开发过程。它提供了一套工具和接口,帮助开发者将大模型无缝集成到各种应用场景中。通过LangChain,开发者可以更专注于业务逻辑的实现,而不必过多关注底层模型的复杂性。
@小森
2024/12/04
2201
LangChain大模型应用开发
langchain中的召回增强生成(RAG)一览
RAG是一种通过额外的、通常是私有或实时的数据来增强LLM知识的技术。LLM能够推理各种广泛的主题,但它们的知识仅限于它们训练时的公共数据,到达其特定时间节点为止。如果你想构建可以推理私人数据或在模型截止日期之后引入的数据的人工智能应用程序,你需要用特定信息增强模型的知识。将适当的信息带入并插入到模型提示中的过程被称为“检索增强生成”(RAG)。
山行AI
2023/12/12
4.7K0
langchain中的召回增强生成(RAG)一览
使用LOTR合并检索提高RAG性能
RAG结合了两个关键元素:检索和生成。它首先使用语义搜索等高级技术来浏览大量数据,包括文本、图像、音频和视频。RAG的本质在于它能够检索相关信息,然后作为下一阶段的基础。生成组件利用大型语言模型的能力,解释这些数据块,制作连贯的、类似人类的响应。与传统的生成模型相比,这个过程确保RAG系统可以提供更细致和准确的输出。
deephub
2024/01/04
4560
使用LOTR合并检索提高RAG性能
使用高级SQL向量查询增强您的 RAG 应用程序
通过使用 MyScale 和 LangChain 创建 AI 助手来克服 RAG 的限制,以提高数据检索过程的准确性和效率。
云云众生s
2024/06/13
2030
使用高级SQL向量查询增强您的 RAG 应用程序
RAG流程优化(微调)的4个基本策略
在本文中,我们将介绍使用私有数据优化检索增强生成(RAG)的四种策略,可以提升生成任务的质量和准确性。通过使用一些优化策略,可以有效提升检索增强生成系统的性能和输出质量,使其在实际应用中能够更好地满足需求。
deephub
2024/07/01
1.3K0
RAG流程优化(微调)的4个基本策略
LangChain学习:Chat with Your Data
这块没有跑通,大概就是下载视频提取语音,调用OpenAIWhisperParser转成文字
Michael阿明
2023/07/25
1.5K0
LangChain学习:Chat with Your Data
Langchain--如何使用大模型 2.0
我们除了可以使用Langchain进行模型对话、提示词创作、嵌入模型,还可以使用其他的组件对大模型封装使用,打造我们自己的大模型。
@小森
2024/08/05
3010
Langchain--如何使用大模型 2.0
大模型应用框架-LangChain
LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代表,国内百度的文心一言、阿里的通义千问也属于LLMs。LangChain自身并不开发LLMs,它的核心理念是为各种LLMs实现通用的接口,把LLMs相关的组件“链接”在一起,简化LLMs应用的开发难度,方便开发者快速地开发复杂的LLMs应用。 LangChain目前有两个语言的实现:python、nodejs。
@小森
2024/06/04
4230
【RAG入门教程05】Langchian框架-Vector Stores
向量存储旨在高效处理大量向量,提供根据特定标准添加、查询和检索向量的功能。它可用于支持语义搜索等应用程序,在这些应用程序中,您可以查找与给定查询在语义上相似的文本段落或文档。
致Great
2024/06/10
6050
【RAG入门教程05】Langchian框架-Vector Stores
用 LangChain 搭建基于 Notion 文档的 RAG 应用
如何通过语言模型查询 Notion 文档?LangChain 和 Milvus 缺一不可。
Zilliz RDS
2023/12/01
7000
用 LangChain 搭建基于 Notion 文档的 RAG 应用
ChatGLM实战:用Langchain-ChatGLM解析小说《天龙八部》
上一章我们介绍了《如何使用Transformers加载和运行预训练的模型》,实现了与GPT模型的对话和咨询功能。然而,这种原生模型的知识是有限的,它无法对一些未知内容做出准确的回答,比如最新的时事、小众的小说,以及法院档案中的案件等。通过使用Langchain,我们有可能使GPT模型能够理解文章内容并进行分析,从而弥补这一限制。
MavenTalker
2023/09/06
1.3K0
ChatGLM实战:用Langchain-ChatGLM解析小说《天龙八部》
LLM RAG系列
本文介绍了RAG以及RAG pipeline的整个流程,包括请求转换、路由和请求构造、索引和检索、生成和评估等,其中引用了大量有价值的论文。
charlieroro
2024/04/02
8680
LLM RAG系列
使用 LangChain 和 Elasticsearch 实现隐私优先的人工智能搜索
过去几个周末,我一直沉浸在“即时工程”的迷人世界中,学习Elasticsearch® 等向量数据库如何通过充当长期记忆和语义知识存储来增强 ChatGPT 等大型语言模型 (LLM)。然而,困扰我和许多其他经验丰富的数据架构师的一件事是,许多教程和演示完全依赖于向大型网络公司和基于云的人工智能公司发送您的私人数据。
点火三周
2023/07/25
2.8K0
使用 LangChain 和 Elasticsearch 实现隐私优先的人工智能搜索
本地部署开源大模型的完整教程:LangChain + Streamlit+ Llama
在过去的几个月里,大型语言模型(llm)获得了极大的关注,这些模型创造了令人兴奋的前景,特别是对于从事聊天机器人、个人助理和内容创作的开发人员。
deephub
2023/08/30
6.4K0
本地部署开源大模型的完整教程:LangChain + Streamlit+ Llama
使用 Gemma 2 构建 RAG的全过程( Ollama 或 Hugginface )
没错,这两天关于Gemma2 9B、27B开源的消息又刷屏了,如果你还不知道的话,可以搜搜看看,还是挺不错的。
AI进修生
2024/12/02
2090
使用 Gemma 2 构建 RAG的全过程( Ollama 或 Hugginface )
使用ChromaDB和Python构建RAG驱动的LLM聊天应用
利用检索增强生成 (RAG) 和大型语言模型 (LLM) 的强大功能来创建生成式 AI 应用程序。
云云众生s
2024/04/05
1.3K0
推荐阅读
相关推荐
告别人工提示,用DSPy编程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验