目录
介绍
本教程将引导您完成使用KitOps创建时尚的Retrieval-Augmented Generation(RAG)管道的过程。KitOps是一种开源MLOps工具,用于将RAG应用程序打包为ModelKit,以简化评估、测试和操作方面的协作。
除了KitOps之外,我们还将使用Chroma DB作为嵌入数据库,将Llama 3用于我们的大型语言模型(LLM),将SentenceTransformer用于嵌入模型,并将LangChain用于分块。
背景
自然语言处理(NLP)最近成为热门话题。寻找增强信息检索和生成上下文准确的响应的方法现在是企业组织的首要考虑因素。
一种方法是Retrieval-Augmented Generation或简称RAG管道。RAG结合了基于检索的系统和生成模型的优势,使开发人员能够构建智能、可扩展且高度可定制的应用程序。
从聊天机器人和虚拟助手到复杂的信息提取系统,学习创建RAG管道已成为一项宝贵的技能。我们编写本教程是一种简单的入门方法。
1. 先决条件
在我们开始之前,请确保您拥有以下内容:
- Python 3.9+:您可以在 Python官方网站上找到并安装最新版本。
- KitOps CLI:你可以在GitHub上找到最新版本的KitOps CLI,并遵循KitOps CLI设置指南。
- Python的基本知识:在本教程中,我们将使用一些Python,因此需要了解Python的使用方法。
2. 安装您的工具
我们的第一步是将所有工具都准备好,为此,我们将执行以下操作:
1、安装ChromaDB:ChromaDB是我们的嵌入数据库。
pip install chromadb
2、安装LangChain:LangChain有助于对文本数据进行分块。
pip install langchain
3、安装Llama.cpp:这将允许我们与Llama模型进行交互。
pip install llama-cpp-python
4、安装SentenceTransformers:这是我们的嵌入模型框架。
pip install sentence_transformers
3. 加载你的Llama模型
接下来,我们需要准备好我们的Llama模型,为此我们可以使用KitOps来帮助加快速度。
1、拉取Llama 7B模型:使用KitOps下载Llama模型。
kit unpack ghcr.io/jozu-ai/llama3:8B-instruct-q4_0 -d ./llama3
2、加载模型:完成后,我们将在Python中加载模型。
from llama_cpp import Llama
llm = Llama(
model_path="./llama3/llama3-8b-instruct-q4_0.gguf",
seed=1337 # set a specific seed
# n_gpu_layers=-1, # Uncomment to use GPU acceleration
# n_ctx=2048, # Uncomment to increase the context window
)
在这里,我们初始化Llama模型,可以选择启用GPU加速并调整上下文窗口以获得更大的输入。
4. 分块
下一步是使用LangChain将数据分解为更易于管理的块。
分块是将大文本划分为更小、更易于管理的“块”的过程。这很重要,因为它允许模型更有效地处理文本。使用较小的数据块,我们可以处理更大的数据集,而不会使模型不堪重负。它还有助于维护上下文并确保在处理过程中关注文本的每个部分。分块可以更轻松地管理内存使用情况和处理时间。
1、读取数据集:
from langchain.text_splitter import CharacterTextSplitter
try:
with open("./dataset.txt", 'r') as file:
content = file.read()
except FileNotFoundError:
print("File not found.")
2、拆分文本:
text_splitter = CharacterTextSplitter(
chunk_size=1000,
chunk_overlap=0,
length_function=len,
)
split_texts = text_splitter.split_text(content)
此代码读取dataset.txt的内容并将其拆分为可管理的块,每个块包含1000个字符。
5. 创建和存储嵌入
现在,我们将使用Chroma DB作为Vector DB来保存我们的嵌入。
嵌入是一种将文本数据转换为模型可以处理的数值向量的方法。这些向量捕获文本的语义含义,使模型能够更有效地理解和处理数据。通过创建和存储嵌入,我们确保文本数据的格式是模型可以轻松检索和比较的格式。像ChromaDB这样的Vector DB有助于存储嵌入,从而更容易执行搜索。
1、使用KitOps从ModelKit注册表中提取SentenceTransformer嵌入模型:
kit unpack ghcr.io/jozu-ai/all-minilm-l6-v2:safetensor -d minilm
2、初始化嵌入模型:
from sentence_transformers import SentenceTransformer
import chromadb
embedding_model = SentenceTransformer("./minilm")
3、对文本块进行编码:
embeddings = embedding_model.encode(split_texts)
4、在ChromaDB中存储嵌入:
Python
chroma_client = chromadb.Client()
collection = chroma_client.create_collection(name="dataset-collection")
collection.add(
documents=split_texts,
embeddings=embeddings,
ids=[f"id{sno}" for sno in range(1, len(split_texts) + 1)]
)
此过程会将文本块编码为嵌入向量并存储在ChromaDB中。
6. 语义搜索
我们现在可以使用ChromaDB执行语义搜索:
1、查询嵌入:
query = "workflow engines"
query_embedding = embedding_model.encode([query])
2、检索结果:
results = collection.query(
query_embeddings=query_embedding,
n_results=3,
)
print(results)
在这里,我们对搜索查询进行了编码,并使用ChromaDB来查找最相关的文本块。
7. 使用LLM生成响应
在我们运行RAG管道之前的最后一步是将搜索结果与用户查询和提示一起传递给Llama模型,以便从给定上下文生成答案。这演示了模型如何从检索到的上下文(语义搜索结果)中综合信息并生成相关答案。
1、准备提示:
contexts = results["documents"][0]
query = "Give me 3 open source workflow engines"
user_prompt = '''You are given a Query and a context, your task is to analyze the context and answer the given Query based on the context.
'Statement': {}
'Context': {}'''.format(query, contexts)
2、生成响应:
def generate_response(user_prompt):
output = llm.create_chat_completion(
messages=[{
"role": "user",
"content": user_prompt
}],
max_tokens=200
)
return output['choices'][0]['message']['content']
output = generate_response(user_prompt)
print(output)
8. 运行 RAG 管道
现在,我们终于可以将所有东西整合在一起并运行我们的RAG管道。
1、定义RAG函数:
def rag(query):
query_embedding = embedding_model.encode([query])
results = collection.query(
query_embeddings=query_embedding,
n_results=3,
)
contexts = results["documents"][0]
user_prompt = '''You are given a Query and a context, your task is to analyze the context and answer the given Query based on the context.
'Statement': {query}
'Context': {contexts}'''.format(query, contexts)
output = generate_response(user_prompt)
return output['choices'][0]['message']['content']
2、运行管道:
print(rag("Your Query here"))
此函数将所有内容联系在一起,使您能够输入查询并获得与上下文相关的响应。
如果您已经走到了这一步,那么恭喜您!您现在拥有一个功能齐全的RAG管道。此管道允许您执行复杂的语义搜索,并使用强大的语言模型生成响应。但是,我们还没有完成。现在我们的管道正在运行,我们想将其打包以进行分发。
为此,我们将使用ModelKits,这将有助于简化评估、测试和运营方面的协作。
ModelKit是一种符合OCI标准的打包格式,支持无缝共享AI/ML模型生命周期中涉及的所有必要构件。这包括数据集、代码、配置和模型本身。通过标准化这些组件的打包方式,ModelKit促进了更简化和协作的开发过程,几乎与任何工具兼容。您可以在此处了解有关ModelKits的更多信息。
1. 将Notebook转换为Python脚本
在开始之前,我们需要添加一个 requirements.txt 文件来列出您的管道所需的所有依赖项。为简洁起见,我没有在这里提供代码,但别担心,您可以通过发出以下命令从我们现有的ModelKit中检索它,
kit unpack ghcr.io/jozu-ai/modelkit-examples/rag_pipeline:latest --code -d ./myrag
2. 整理您的工件,如下所示
接下来,我们需要正确组织我们的RAG工件。您的报告应反映以下内容,
Root-
| - rag_pipeline #Includes the python, configuration and requirements.txt files.
| - dataset.txt
| - KitFile
3. 创建一个引用您的工件和基本模型的Kitfile
组织完成后,我们需要创建一个Kitfile来列出我们所有的项目工件。Kitfile是基于YAML的清单,旨在简化项目构件的封装和共享。从代码和数据集到模型及其元数据,Kitfile是您项目的综合蓝图,确保每个组件都经过精心组织且易于访问。有关更多信息,请参阅Kitfile参考。
你的Kitfile应该看起来像下面这样,
manifestVersion: "1.0"
package:
name: RAG with LLMA3
version: 1.0.0
authors: ["Jozu AI"]
model:
name: llama3-8B-instruct-q4_0
path: ghcr.io/jozu-ai/llama3:8B-instruct-q4_0
description: Llama 3 8B instruct model
license: Apache 2.0
datasets:
- path: ./dataset.txt
code:
- path: ./rag_pipeline
- path: tutorial.py
4. 使用Kit将RAG管道打包并推送到您的注册表
接下来,我们需要将RAG管道打包并推送到我们选择的注册表,我们将从创建Kitfile的文件夹的根目录开始执行此操作。我们建议使用Docker Hub或Artifactory。
1、包装管道
kit pack . -t my-oci-registry/my-rag-repo/rag-tutorial:latest
2、推送到注册表以共享
kit push my-oci-registry/my-rag-repo/rag-tutorial:latest
5. 检索管道和利润
一旦我们推送了RAG管道,我们就可以检索它并解压缩ModelKit。
kit unpack ghcr.io/jozu-ai/modelkit-examples/rag_pipeline_bot:latest -d /path/to/unpacked
6. 快速尝试RAG教程
1、解开rag管道和基础llm的包装
kit unpack ghcr.io/jozu-ai/modelkit-examples/rag_pipeline:latest -d ./myrag
2、解压缩嵌入模型
kit unpack ghcr.io/jozu-ai/all-minilm-l6-v2:safetensor -d minilm
3、运行管道
python ./rag_pipeline/rag_user.py ./dataset.txt ./minilm llama3-8B-instruct-q4_0.gguf
恭喜!您已成功创建功能齐全的RAG管道,并将其打包以进行分发。如果你觉得本教程有帮助,并想了解更多关于KitOps的信息或为我们的项目做出贡献,请访问 KitOps.ML 或加入我们的 Discord群组。
https://www.codeproject.com/Articles/5384392/A-Step-by-Step-Guide-to-Building-and-Distributing