IT评测·应用市场-qidao123.com

标题: 向量数据库与LLM的集成:实践指南(文末福利) [打印本页]

作者: 勿忘初心做自己    时间: 2024-7-22 03:54
标题: 向量数据库与LLM的集成:实践指南(文末福利)
本文将了解到什么是向量数据库,以及如何与LLMs进行集成。通过LLMs和向量数据库的结合,可以节流微调带来的开销和时间。
  通常,LLM会在各种各样的数据上进行训练,这使它们具有广泛的明白本领,但大概会导致在特定的知识领域存在差距。有时,它们甚至大概产生与目的无关或带有私见的信息——这是从广阔但未经筛选的web学习的副产品。为了办理该问题,我们引入了向量数据库(Vector Database)的概念。这些数据库以一种称为"向量嵌入"的独特格式存储数据,可以让LLMs把握和使用的信息更连贯和准确。
本文给出了如何使用向量数据库构建一个LLM,并改进LLM对该流程的使用。我们将会看到二者的结合是如何让LLMs更加准确可靠(特别针对特定主题)。
下面我们简朴总结了向量数据库,解释向量嵌入的概念以及它在增长AI和呆板学习应用方面的角色。之后我们会展示这些数据库和传统数据库的不同之处,以及为什么他们更适合AI任务,特别是与非结构数据(如文本、图片和复杂模式)打交道时。
之后,我们会探索使用该技术来构建一个封闭式QA呆板人应用,该呆板人使用了Falcon-7B模子和ChromaDB向量数据库,证实白LLMs与正确的工具和技术相结合时的成效。
末了,你将清晰认识到如何使用LLMs和向量数据库来创建新颖、上下文相干而且可靠的应用。不管你是AI爱好者还是履历丰富的开发者,本指南将资助你轻松自信地探索这个激动人心的领域。
向量数据库概述

在深入了解向量数据库之前,需要了解向量嵌入(vector embedding)的概念。向量嵌入是呆板学习中用于将原始数据转换为AI系统可以明白的数值格式必不可少的一种技术,涉及数据转换,如将文本或图片转换为一系列数字,这些数字在高维度空间称之为向量。高纬度数据指包括很多属性或特性的数据,每个数据代表一个不同的维度,这些维度可以资助捕获该数据的细微特性。
创建向量嵌入的过程开始于数据输入,可以是语句中的恣意内容或是图片的像素等。大语言模子和其他AI算法会分析这些数据并确定其关键特性。比方,在文本数据中,大概涉及明白单词的意义和它在语句中的上下文。嵌入模子会将这些特性转换为一个数值格式,向量中的每个数值代表数据的一个特性,通过将这些特性数值封装到一起,就可以作为呆板可以处置惩罚的输入。
之所以说这些向量是高纬度的,是因为它们包含很多数值,每个数值对应数据中的某个(不同)特性。这种高维度使得向量能够捕获复杂、详细的信息,使之成为强大的AI模子工具。模子使用这些嵌入向量来识别数据中的模式、关系和潜在结构。
向量数据库针对向量嵌入的特性提供了优化存储和查询的本领。它们擅长提供高效搜索、高性能、可扩展性,并通过比较和识别数据点之间的相似性,实现数据的快速检索。
这些数值代表了复杂的高纬度信息,使之有别于传统的重要使用文本和数字存储数据的系统。向量数据库的重要本领是管理和查询如图片、视频和文本格式的数据,当这些数据转换为向量格式后,特别适用于呆板学习和AI应用。
在下面示例中,我们将一段文本转换为词向量,这一步是神经语言处置惩罚的根本步骤,可以让我们量化和分析语言关系。比方,“puppy"的向量表达应该更靠近"dog"的向量空间,而不是"house”,反映了它们的语义靠近性。这种方式还可以拓展到类似的关系中。"man"和"woman"的向量间隔和方向类似于"king"和"queen"之间的间隔和方向。下面展示了单词向量不光仅代表单词,还可以在多维度向量空间中对它们的语义关系进行故意义的比较。

LLMs崛起之前的向量数据库

向量数据库用于处置惩罚向量嵌入,已经有一些关键使用场景,特别是在呆板学习和AI领域:
相似搜索:这是向量数据库的关键功能。它们可以在高维度空间内找出与给定请求相似的数据点。特别适用于图形和音频检索(希望找出和特定输入类似的内容),下面是一些业界使用场景:

推荐系统:向量数据库通过处置惩罚用户和商品嵌入来支持推荐系统。它可以将用户和他们感爱好或过去有过互动的物品(如产品、电影或文章)关联起来。下面是一个业务使用场景:

基于内容的检索:这里向量数据库用于基于实际内容而非传统元数据来检索内容。特别对于非结构化数据,如文本和图像,需要起首对内容本身进行分析。下面是一些业界使用场景:

关于基于内容的检索的末了一点越来越重要,并促进了一种新的应用:
使用上下文明白来加强LLMs:通过存储和处置惩罚文本嵌入,向量数据库可以资助LLMs实现更精致化以及上下文相干的检索工作。它们可以资助明白大量文本的语义内容,在回回复杂搜索、维护对话上下文或生成相干内容等任务中起着关键作用。这种应用正迅速成为向量数据库的一个重要场景,展示了其在加强高级AI系统(如LLM)本领方面起到的作用。
向量数据库 vs 传统数据库

传统的SQL数据库在结构化数据管理方面体现出色,擅长处置惩罚准确匹配和明确定义的条件逻辑。它们维护数据的完整性,适合需要准确、结构化数据处置惩罚的应用程序。但这种刚性计划模式也使得它们不太适合处置惩罚非结构化数据的语义以及上下文之间的细微差别,而这正是LLM和生成式AI应用所需要的。
另一方面,相比传统的SQL系统,NoSQL数据库则更加灵活。它们可以处置惩罚半结构化和非结构化数据,如JSON文档,这使得它们更适用于AI和呆板学习场景。但即便云云,相比用于LLMs和生成式的向量数据库来说,NoSQL数据库依然缺少某些方面的本领,如解析上下文、模式以及简朴数据检索之外的语义内容。
向量数据库弥补了这一空缺。它们以AI为中心,使用向量的方式处置惩罚数据,可以有用管理复杂的非结构化数据。当与LLMs协作时,向量数据库支持相似性查找和上下文明白,提供了超出传统SQL和NoSQL数据库的本领。它们擅长处置惩罚近似值和模式识别,使之特别适用于对数据的微妙明白比准确数据匹配更重要的AI应用。
提升向量数据库的性能

对于依赖速度和准确检索高纬数据的应用来说,向量数据库的性能优化至关重要。这内里涉及提升查询速度、保证高准确性以及有用处置惩罚不停增长的数据量和用户请求。其中最重要的一部门是围绕索引策略进行优化(一种更有用组织和查询向量数据的技术)。下面,我们将先容这些索引策略,以及它们是如何提升向量数据库性能的。
索引策略

向量数据库的索引策略用于方便和准确检索与查询向量相似的向量。这些策略可以显著影响到查询操作的速度和准确性。

IVF方法适合处置惩罚可扩展查询情况中的高纬度数据,可以通过对相似项分别聚类来有用降低搜索空间,特别适用于相对静态的数据库,且可以允许偶尔重新聚类的场景。但对于低纬数据(大概存在太过分割)或要求尽大概低耽误的应用(聚类过程和跨多个聚类查询大概会引入额外的查询时间)来说,IVF大概不是最佳的选择。
优化的其他留意事项


通过这些索引策略和留意事项来提升向量数据库的性能需要深刻明白底层数据以及特定的应用需求。通过仔细选择并调节这些策略,开发者可以显著提高基于向量的应用的相应本领和可扩展性,保证其满足真实使用场景。
用向量数据库丰富LLM的上下文

像Facebook的 LLama2 或 TIIUAE的 Falcon大语言模子具有先进的人工智能和类人类的文本生成本领,但由于它们是基于广泛、通用的数据集进行训练的,因此缺乏对特定上下文的处置惩罚本领。
可以使用如下两种方式办理上下文限制的问题:

第二种方式称为RAG,我们将在下一章中详细先容。

使用Falcon-7BChromaDB构建一个封闭式问题呆板人

本章中,我们将先容如何使用向量数据库来构建一个LLM,是使用的模子是一个封闭式问题呆板人(Closed Q&A bot),该呆板人使用一组集成的技术组件来有用解答与科学相干的问题。
   实现架构如下。使用multi-qa-MiniLM-L6-cos-v1作为嵌入模子,负责将数据集的数据导入数据库。
  在用户提问时,会使用嵌入模子对提问文本进行编码,生成向量数据库可以明白的格式,并由向量数据库返回应答。Falcon 7B模子用于优化向量数据库的应答结果。
  下图有点问题,看起来请求和应答是异步执行的,但代码中是串行的。
  

设置情况

为了实现本文的代码,需要安装如下库:
  1.         !pip install -qU \
  2.             transformers==4.30.2 \
  3.             torch==2.0.1+cu118 \
  4.             einops==0.6.1 \
  5.             accelerate==0.20.3 \
  6.             datasets==2.14.5 \
  7.             chromadb \
  8.             sentence-transformers==2.2.2
复制代码
本代码运行在Qwak的Workspaces的一台gpu.a10.2xl 实例上。需要留意的是运行Falcon-7B-Instruct模子的代码大概会根据硬件设置而变革。
构建"知识库"

一开始,我们需要拉取Databricks-Dolly数据集,重点关注closed_qa一类的数据集。这些数据条目通常以对准确信息的需求为特性,这种转一性给通用性大语言模子的训练带来了肯定挑战。
   在databricks/databricks-dolly-15k的dataset card中可以查看支持的split和过滤字段。
  1.         from datasets import load_dataset
  2.          
  3.         # Load only the training split of the dataset
  4.         # 加载 train 类型的数据集
  5.         train_dataset = load_dataset("databricks/databricks-dolly-15k", split='train')
  6.          
  7.         # 通过过滤拉取 category为 closed_qa 的一组数据
  8.         closed_qa_dataset = train_dataset.filter(lambda example: example['category'] == 'closed_qa')
  9.          
  10.         print(closed_qa_dataset[0])
复制代码
  数据库通常可以分为三类:training、validating和evaluating。分别用于训练、校验和评估模子。
  范例的数据集条目的格式如下:
  1.         {
  2.           "instruction": "When was Tomoaki Komorida born?",
  3.           "context": "Komorida was born in Kumamoto Prefecture on July 10, 1981. After graduating from high school, he joined the J1 League club Avispa Fukuoka in 2000. His career involved various positions and clubs, from a midfielder at Avispa Fukuoka to a defensive midfielder and center back at clubs such as Oita Trinita, Montedio Yamagata, Vissel Kobe, and Rosso Kumamoto. He also played for Persela Lamongan in Indonesia before returning to Japan and joining Giravanz Kitakyushu, retiring in 2012.",
  4.           "response": "Tomoaki Komorida was born on July 10, 1981.",
  5.           "category": "closed_qa"
  6.         }
复制代码
下面,我们将重点为每组指令及其各自的上下文生成词嵌入,并将它们集成到向量数据库ChromaDB中。
Chroma DB是一个开源的向量数据库系统,擅长管理向量嵌入,专为语义查询引擎之类的应用量身定做,这种本领在自然语言处置惩罚和呆板学习领域至关重要。Chroma DB作为一个内存型数据库,支持数据的快速访问和高速处置惩罚。其友好的Python设置加强了对我们项目的吸引力,简化了与我们工作流程的集成。更多拜见Chroma DB 文档。

为了给回答生成嵌入向量,我们使用了multi-qa-MiniLM-L6-cos-v1 模子,该模子专为语义搜索场景而训练。给定一个问题/搜索请求,该模子可以找到相干的文本信息,这正是我们所需要的。
在下面例子中,解释了如何将嵌入向量存储在Chroma的内存集合中。
  1.         import chromadb
  2.         from sentence_transformers import SentenceTransformer
  3.          
  4.         class VectorStore:
  5.          
  6.             def __init__(self, collection_name):
  7.                # 初始化嵌入模型和向量数据库
  8.                 self.embedding_model = SentenceTransformer('sentence-transformers/multi-qa-MiniLM-L6-cos-v1')
  9.                 self.chroma_client = chromadb.Client()
  10.                 self.collection = self.chroma_client.create_collection(name=collection_name)
  11.          
  12.             # 该方法用于将输入的数据集转换为向量,并保存到向量数据库中
  13.             def populate_vectors(self, dataset):
  14.                 for i, item in enumerate(dataset):
  15.                     combined_text = f"{item['instruction']}. {item['context']}"
  16.                     embeddings = self.embedding_model.encode(combined_text).tolist()
  17.                     self.collection.add(embeddings=[embeddings], documents=[item['context']], ids=[f"id_{i}"])
  18.          
  19.             # 该方法直接从向量数据库中与查询相关的上下文
  20.             def search_context(self, query, n_results=1):
  21.                 query_embeddings = self.embedding_model.encode(query).tolist()
  22.                 return self.collection.query(query_embeddings=query_embeddings, n_results=n_results)
  23.          
  24.          
  25.         # Example usage
  26.         if __name__ == "__main__":
  27.            # Initialize the handler with collection name
  28.             vector_store = VectorStore("knowledge-base")
  29.             
  30.             # 输入上一步拉取的 closed_qa 数据集
  31.             vector_store.populate_vectors(closed_qa_dataset)
复制代码
对于每个数据集条目,我们会生成一个结合了instruction和context字段的嵌入向量,在我们的LLM提示中,context充当要检索的文档。
下面,我们使用Falcon-7b-instruct LLM来生成封闭式信息查询的应答(无需额外的上下文),并展示知识库的重要性。
生成根本的回答

为了实现文本生成任务,我们采用了来自Hugging Face的Falcon-7b-instruct模子。该模子是Falcon的革新系列,由Abu Dhabi的Technology Innovation Institute开发。
Falcon-7B-Instruct引人注目的一点是其有用平衡了高级功能和管理巨细,用于明白复杂的文本和生成任务,其性能可以与更大的封闭源代码模子相媲美,但包更精简。这也是它成为我们抱负选择的缘故原由(可以深入语言明白,但不会带来跟更大模子一样的开销)。
如果你打算运行Falcon-7B-Instruct模子(无论是当地呆板或远程服务器),需要留意硬件要求。在HuggingFace的文档中有提到,该模子最少需要16GB的内存来满足最佳的性能和更快的相应次数,最好使用GPU。
  1.          
  2.         import transformers
  3.         import torch
  4.         from transformers import AutoTokenizer, AutoModelForCausalLM
  5.          
  6.         class Falcon7BInstructModel:
  7.          
  8.             def __init__(self):
  9.                 # 初始化模型
  10.                 model_name = "tiiuae/falcon-7b-instruct"
  11.                 self.pipeline, self.tokenizer = self.initialize_model(model_name)
  12.          
  13.             def initialize_model(self, model_name):
  14.                 # 初始化 Tokenizer
  15.                 tokenizer = AutoTokenizer.from_pretrained(model_name)
  16.          
  17.                 # Pipeline setup for text generation
  18.                 pipeline = transformers.pipeline(
  19.                     "text-generation",
  20.                     model=model_name,
  21.                     tokenizer=tokenizer,
  22.                     torch_dtype=torch.bfloat16,
  23.                     trust_remote_code=True,
  24.                     device_map="auto",
  25.                 )
  26.          
  27.                 return pipeline, tokenizer
  28.          
  29.             def generate_answer(self, question, context=None):
  30.                 # Preparing the input prompt
  31.                 prompt = question if context is None else f"{context}\n\n{question}"
  32.          
  33.                 # 生成应答
  34.                 sequences = self.pipeline(
  35.                     prompt,
  36.                     max_length=500,
  37.                     do_sample=True,
  38.                     top_k=10,
  39.                     num_return_sequences=1,
  40.                     eos_token_id=self.tokenizer.eos_token_id,
  41.                 )
  42.          
  43.                 # Extracting and returning the generated text
  44.                 return sequences['generated_text']
复制代码
可以参考Hugging Face的文档来编写上述代码:

使用方式如下:
  1.         # 初始化 Falcon 模型类
  2.         falcon_model = Falcon7BInstructModel()
  3.          
  4.         user_question = "When was Tomoaki Komorida born?"
  5.          
  6.         # LLM使用LLM来为用户提问生成回答
  7.         answer = falcon_model.generate_answer(user_question)
  8.          
  9.         print(f"Result: {answer}")
复制代码
你大概已经猜到模子的输出:
  1.         { answer: “I don't have information about Tomoaki Komorida's birthdate.” }
复制代码
使用Falcon-7B-Instruct时,如果没有相干的上下文,就会返回一个否定相应。这说明需要进一步丰富背景知识,为非一般性问题提供更有针对性和有用的答案。
生成上下文相干的回答

下面我们通过向量存储来为模子提供相干上下文,从而提升模子本领。
有趣的是,我们使用相同的VectorStore类来同时生成嵌入向量和从用户提问中获取上下文。
  1.         # Assuming vector_store and falcon_model have already been initialized
  2.          
  3.         # 从 VectorStore 中获取上下文(假设数据集已经导入数据库)
  4.         context_response = vector_store.search_context(user_question)
  5.          
  6.         # 从向量数据库的响应中抽取上下文,上下文应该是 context 关键字的第一个元素
  7.         context = "".join(context_response['context'][0])
  8.          
  9.         # Falcon模型结合提取的上下文生成应答
  10.         enriched_answer = falcon_model.generate_answer(user_question, context=context)
  11.          
  12.         print(f"Result: {enriched_answer}")
复制代码
末了可以得到准确的回答:
  1.         Tomoaki Komorida was born on July 10, 1981.
复制代码
TIPs:


如何系统的去学习AI大模子LLM ?

作为一名热心肠的互联网老兵,我意识到有很多履历和知识值得分享给大家,也可以通过我们的本领和履历解答大家在人工智能学习中的很多狐疑,所以在工作繁忙的情况下还是对峙各种整理和分享。
但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模子资料 包括AI大模子入门学习思维导图、精品AI大模子学习册本手册、视频教程、实战学习等录播视频免费分享出来





欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4