介绍
在人工智能领域,大型语言模型(LLMs)和生成型AI模型,如OpenAI的GPT-4、Anthropic的Claude 2、Meta的Llama、Falcon、Google的Palm等,已经彻底改变了我们解决问题的方式。LLMs使用深度学习技术来执行自然语言处理任务。本文将教你如何使用向量数据库构建LLM应用程序。你可能已经与类似亚马逊客服或Flipkart决策助手的聊天机器人进行过交互。它们能生成类似人类的文本,并提供几乎与现实对话无异的交互用户体验。然而,这些LLMs需要进行优化,以产生高度相关和具体的结果,才能真正对特定的使用案例有用。
例如,如果你询问亚马逊客服应用程序:“如何在Android应用中更改语言?”可能没有经过训练来处理这个确切的文本,因此可能无法回答。这就是向量数据库发挥作用的时候。向量数据库将领域文本(在这种情况下是帮助文档)和所有用户的过去查询(包括订单历史等)存储为数值嵌入,并提供实时查找相似向量的功能。在这种情况下,它将这个查询编码成一个数值向量,并使用它在其向量数据库中执行相似性搜索,找到最相似的邻居。有了这个帮助,聊天机器人可以正确地指导用户进入亚马逊应用程序的“更改语言偏好设置”部分。
学习目标
- LLMs是如何工作的,它们的限制是什么,为什么它们需要向量数据库?
- 嵌入模型的介绍以及如何在应用程序中对其进行编码和使用。
- 学习什么是向量数据库,以及它们如何成为LLM应用程序架构的一部分。
- 学习如何使用向量数据库和tensorflow编写LLM/生成型AI应用程序。
本文是数据科学博客马拉松的一部分。
什么是LLMs?
大型语言模型(LLMs)是基础的机器学习模型,使用深度学习算法处理和理解自然语言。这些模型被训练使用大量的文本数据来学习语言中的模式和实体关系。LLMs可以执行许多类型的语言任务,例如翻译语言、分析情感、聊天机器人对话等。它们能够理解复杂的文本数据,识别实体及其之间的关系,并生成连贯且语法正确的新文本。
在这里阅读更多关于LLMs的信息。
LLMs是如何工作的?
LLMs使用大量数据进行训练,通常是以太字节,甚至是拍字节,拥有数十亿或数万亿个参数,使其能够根据用户的提示或查询进行预测和生成相关的响应。它们通过词嵌入、自注意层和前馈网络处理输入数据,生成有意义的文本。你可以在这里阅读更多关于LLM架构的信息。
LLMs的限制
虽然LLMs似乎以相当高的准确性生成响应,甚至在许多标准化测试中比人类表现得更好,但这些模型仍然有限制。首先,它们完全依赖于它们的训练数据来构建推理,因此可能在数据中缺乏特定或当前的信息。这导致模型生成不正确或不寻常的响应,也被称为“幻觉”。有持续的努力在减轻这个问题。其次,模型可能无法按照用户的期望行为或响应。
为了解决这个问题,向量数据库和嵌入模型通过为用户寻找信息提供了额外的类似性查询(文本、图像、视频等)。以下是一个例子,LLMs无法回答用户询问的信息,而是依靠向量数据库找到该信息。
LLM和向量数据库
大型语言模型(LLM)被广泛应用于电子商务、旅游、搜索、内容创作和金融等行业的许多部分。这些模型依赖于一种相对较新的数据库类型,称为向量数据库,它以一种称为嵌入的二进制表示存储文本、图像、视频和其他数据的数值表示。本节介绍了向量数据库和嵌入的基本原理,更重要的是介绍了如何将它们与LLM应用程序集成使用。
向量数据库是一种使用高维空间存储和搜索嵌入的数据库。这些向量是数据特征或属性的数值表示。使用计算向量在高维空间中的距离或相似度的算法,向量数据库可以快速高效地检索相似的数据。与传统的基于标量的数据库不同,后者将数据存储在行或列中,并使用精确匹配或基于关键词的搜索方法,向量数据库的操作方式不同。它们使用向量数据库来在非常短的时间内(毫秒级别)搜索和比较大量向量,使用近似最近邻(ANN)等技术。
嵌入的简要教程
AI模型通过将原始数据如文本、视频和图像输入到诸如word2vec之类的向量嵌入库中,生成嵌入。在AI和机器学习的背景下,这些特征代表数据的不同维度,这些维度对于理解模式、关系和底层结构至关重要。
下面是使用word2vec生成词嵌入的示例。
1. 使用自定义数据集生成模型,或使用来自Google或FastText的示例预构建模型。如果生成自己的模型,可以将其保存为“word2vec.model”文件。
import gensim# 创建word2vec模型model = gensim.models.Word2Vec(corpus)# 将模型文件保存model.save('word2vec.model')
2. 加载模型,生成输入词的向量嵌入,并使用它来获取向量嵌入空间中的相似词。
import gensimimport numpy as np# 加载word2vec模型model = gensim.models.Word2Vec.load('word2vec.model')# 获取单词“king”的向量king_vector = model['king']# 获取与king向量最相似的向量similar_vectors = model.similar_by_vector(king_vector, topn=5)# 打印最相似的向量for vector in similar_vectors: print(vector[0], vector[1])
3. 这是与输入词接近的前5个词。
输出:man 0.85prince 0.78queen 0.75lord 0.74emperor 0.72
使用向量数据库的LLM应用架构
从高层次上看,向量数据库依靠嵌入模型处理嵌入的创建和查询。在摄取路径上,语料库内容使用嵌入模型转换为向量,并存储在类似Pinecone、ChromaDB、Weaviate等向量数据库中。在阅读路径上,应用程序使用句子或单词进行查询,然后再次由嵌入模型转换为向量,并查询到向量数据库中获取结果。
使用向量数据库的LLM应用
LLM在语言任务中很有帮助,它被嵌入到更广泛的模型类别中,例如生成型AI,除了文本外还可以生成图像和视频。在本节中,我们将学习如何使用向量数据库构建实用的LLM/生成型AI应用。我使用了transformers和torch库来进行语言模型,并使用了pinecone作为向量数据库。您可以选择任何LLM/嵌入语言模型和任何向量数据库进行存储和搜索。
聊天机器人应用
要使用向量数据库构建聊天机器人,可以按照以下步骤进行操作:
- 选择一个向量数据库,如Pinecone、Chroma、Weaviate、AWS Kendra等。
- 为您的聊天机器人创建一个向量索引。
- 使用您选择的大文本语料库训练一个语言模型。例如,对于新闻聊天机器人,您可以输入新闻数据。
- 集成向量数据库和语言模型。
以下是一个使用向量数据库和语言模型的简单聊天机器人应用示例:
import pineconeimport transformers# 为向量数据库创建一个API客户端client = pinecone.Client(api_key="YOUR_API_KEY")# 加载语言模型model = transformers.AutoModelForCausalLM.from_pretrained("google/bigbird-roberta-base")# 定义一个生成文本的函数def generate_text(prompt): inputs = model.prepare_inputs_for_generation(prompt, return_tensors="pt") outputs = model.generate(inputs, max_length=100) return outputs[0].decode("utf-8")# 定义一个检索与用户查询向量最相似的向量的函数def retrieve_similar_vectors(query_vector): results = client.search("my_index", query_vector) return results# 定义一个生成对用户查询的响应文本的函数def generate_response(query): # 检索与用户查询向量最相似的向量 similar_vectors = retrieve_similar_vectors(query) # 基于检索到的向量生成文本 response = generate_text(similar_vectors[0]) return response# 启动聊天机器人while True: # 获取用户查询 query = input("您有什么问题?") # 生成对用户查询的响应 response = generate_response(query) # 打印响应 print(response)
这个聊天机器人应用将从向量数据库中检索与用户查询向量最相似的向量,然后根据检索到的向量使用语言模型生成文本。
聊天机器人 > 您有什么问题?用户A > 埃菲尔铁塔有多高?聊天机器人 > 埃菲尔铁塔的高度从基座到天线顶端的测量为324米(1,063英尺)。
图像生成应用
让我们探索如何构建一个使用生成型AI和LLM库的图像生成应用。
- 创建一个向量数据库来存储图像向量。
- 从训练数据中提取图像向量。
- 将图像向量插入到向量数据库中。
- 训练生成对抗网络(GAN)。如果需要GAN的介绍,请阅读这里。
- 集成向量数据库和GAN。
以下是一个集成向量数据库和GAN来生成图像的简单示例程序:
import pineconeimport torchfrom torchvision import transforms# 为向量数据库创建一个API客户端client = pinecone.Client(api_key="YOUR_API_KEY")# 加载GANgenerator = torch.load("generator.pt")# 定义一个从向量生成图像的函数def generate_image(vector): # 将向量转换为张量 tensor = torch.from_numpy(vector).float() # 生成图像 image = generator(tensor) # 将图像转换为PIL图像 image = transforms.ToPILImage()(image) return image# 启动图像生成器while True: # 获取用户查询 query = input("您想生成什么类型的图像?") # 检索与用户查询向量最相似的向量 similar_vectors = client.search("my_index", query) # 从检索到的向量生成图像 image = generate_image(similar_vectors[0]) # 显示图像 image.show()
这个程序将从向量数据库中检索与用户查询向量最相似的向量,然后通过基于GAN的生成相应的图像。
ImageBot>你想生成哪种类型的图像?Me>一幅山上有流水的田园风光图像。ImageBot>等一下!给你...
你可以根据自己的需要定制这个程序。例如,你可以训练一个专门用于生成特定类型图像(如肖像或风景)的GAN。
电影推荐应用
我们来看看如何从电影语料库构建一个电影推荐应用。你可以使用类似的思想构建其他产品或实体的推荐系统。
- 创建一个向量数据库来存储电影向量。
- 从电影元数据中提取电影向量。
- 将电影向量插入向量数据库。
- 向用户推荐电影。
以下是如何使用Pinecone API向用户推荐电影的示例:
import pinecone# 创建API客户端client = pinecone.Client(api_key="YOUR_API_KEY")# 获取用户的向量user_vector = client.get_vector("user_index", user_id)# 向用户推荐电影results = client.search("movie_index", user_vector)# 打印结果for result in results: print(result["title"])
以下是向用户推荐的示例:
肖申克的救赎黑暗骑士盗梦空间教父低俗小说
LLM使用向量搜索/数据库的实际用例
- 微软和TikTok等公司使用Pinecone等向量数据库进行长期记忆和更快的查找。这是LLM无法单独完成的,需要借助向量数据库。它帮助用户保存过去的问题/回答并恢复会话。例如,用户可以询问,“告诉我更多关于上周我们讨论的意面食谱。”
- Flipkart的决策助手通过将查询编码为向量嵌入,并在高维空间中对存储相关产品向量执行查找来向用户推荐产品。例如,如果你搜索“Wrangler 男士皮夹克 棕色 VoAGI”,它会使用向量相似度搜索向用户推荐相关产品。否则,LLM将无法提供任何推荐,因为没有产品目录包含这样的标题或产品详情。
- 非洲金融科技公司Chipper Cash使用向量数据库将用户注册欺诈降低了10倍。它通过将所有之前用户注册的图像存储为向量嵌入进行此操作。然后,当新用户注册时,它将其编码为向量,并与现有用户进行比较以检测欺诈行为。
- Facebook在许多内部产品中使用自己的向量搜索库FAISS (博客) ,包括Instagram Reels和Facebook Stories,以快速查找任何多媒体并找到相似的候选项,以便向用户展示更好的推荐。
结论
向量数据库对于构建各种LLM应用非常有用,如图像生成、电影或产品推荐和聊天机器人。它们为LLM提供了额外或类似的信息,这些信息LLM并没有经过训练。它们在高维空间中高效地存储向量嵌入,并使用最近邻搜索以高准确性找到相似的嵌入。
关键要点
本文的关键要点是,矢量数据库非常适用于LLM应用程序,并提供以下重要功能供用户集成使用:
- 性能:矢量数据库是专门设计用于高效存储和检索矢量数据的,这对于开发高性能的LLM应用程序非常重要。
- 精度:即使矢量存在轻微变化,矢量数据库也能准确匹配相似矢量。它们使用最近邻算法计算相似矢量。
- 多模态:矢量数据库可以容纳各种多模态数据,包括文本、图像和声音。这种多样性使它们成为需要处理不同数据类型的LLM/生成型AI应用程序的理想选择。
- 开发者友好:即使对于可能没有广泛机器学习技术知识的开发者来说,矢量数据库也相对易于使用。
此外,我还要强调,许多现有的SQL/NoSQL解决方案已经添加了矢量嵌入存储、索引和更快的相似性搜索功能,例如PostgreSQL和Redis。这是一个快速发展的领域,因此应用程序开发人员在不久的将来将有许多可用的选项来构建创新的应用程序。
常见问题
本文中显示的媒体不属于Analytics Vidhya所有,仅由作者自行决定使用。