使用 LlamaIndex 和 Llama 2-Chat 构建知识驱动的对话应用程序

文章目录

  • 使用 LlamaIndex 和 Llama 2-Chat 构建知识驱动的对话应用程序
      • Llama 2-70B-聊天
      • LlamaIndex
    • 解决方案概述
    • 先决条件
    • 使用 SageMaker JumpStart 部署 GPT-J 嵌入模型
    • 使用 SageMaker Python SDK 进行部署
    • 在 SageMaker Studio 中使用 SageMaker JumpStart 进行部署
    • 使用 SageMaker JumpStart 部署和测试 Llama 2-Chat
    • 使用 LlamaIndex 构建 RAG
    • 使用LangChain工具和代理
    • 清理
    • 结论

使用 LlamaIndex 和 Llama 2-Chat 构建知识驱动的对话应用程序

从大量文本中解锁准确且富有洞察力的答案是大型语言模型 (LLM) 所实现的一项令人兴奋的功能。在构建 LLM 应用程序时,通常需要连接和查询外部数据源以为模型提供相关上下文。一种流行的方法是使用检索增强生成(RAG)来创建问答系统,该系统可以理解复杂的信息并对查询提供自然的响应。 RAG 允许模型利用庞大的知识库,并为聊天机器人和企业搜索助手等应用程序提供类似人类的对话。

在这篇文章中,将探讨如何利用LlamaIndex、Llama 2-70B-Chat和LangChain的强大功能来构建强大的问答应用程序。借助这些最先进的技术,LLM可以提取文本语料库、索引关键知识并生成准确、清晰地回答用户问题的文本。以下产品均可在亚马逊科技海外区免费试用,链接:https://aws.amazon.com/cn/free/

Llama 2-70B-聊天

Llama 2-70B-Chat 是一个强大的大语言模型,可与领先模型竞争。它经过了 2 万亿个文本标记的预训练,Meta 打算将其用于为用户提供聊天帮助。预训练数据来源于公开数据,截止日期为 2022 年 9 月,微调数据截止日期为 2023 年 7 月。有关模型训练过程、安全注意事项、学习内容和预期用途的更多详细信息,请参阅论文Llama 2 :开放基础和微调聊天模型。 Llama 2 模型可在Amazon SageMaker JumpStart上使用,以实现快速、简单的部署。

LlamaIndex

LlamaIndex是一个可以构建 LLM 应用程序的数据框架。它提供的工具提供数据连接器,以各种来源和格式(PDF、文档、API、SQL 等)摄取现有数据。无论LLM的数据存储在数据库还是 PDF 中,LlamaIndex 都可以让LLM轻松地将这些数据用于LLM。正如在这篇文章中所演示的,LlamaIndex API 使数据访问变得毫不费力,并使LLM能够创建强大的自定义 LLM 应用程序和工作流程。

如果LLM正在尝试和构建 LLM,LLM可能会熟悉 LangChain,它提供了一个强大的框架,简化了 LLM 支持的应用程序的开发和部署。与LangChain类似,LlamaIndex提供了许多工具,包括数据连接器、数据索引、引擎和数据代理,以及工具和可观察性、追踪性和评估性等应用集成。 LlamaIndex 致力于弥合数据和强大的LLM之间的差距,通过用户友好的功能简化数据任务。 LlamaIndex 专为构建搜索和检索应用程序(例如 RAG)而设计和优化,因为它提供了一个用于查询 LLM 和检索相关文档的简单界面。

解决方案概述

在这篇文章中,演示如何使用 LlamaIndex 和 LLM 创建基于 RAG 的应用程序。下图显示了以下各节中概述的该解决方案的分步架构。

img

RAG 将信息检索与自然语言生成相结合,以产生更有洞察力的响应。出现提示时,RAG 首先搜索文本语料库以检索与输入最相关的示例。在响应生成过程中,模型会考虑这些示例来增强其功能。通过合并相关检索到的段落,与基本生成模型相比,RAG 响应往往更加真实、连贯且与上下文一致。这种检索-生成框架利用了检索和生成的优势,有助于解决纯自回归会话模型可能出现的重复和缺乏上下文等问题。 RAG 引入了一种有效的方法来构建对话代理和人工智能助手,并提供情境化的高质量响应。

构建解决方案包括以下步骤:

  1. 将Amazon SageMaker Studio设置为开发环境并安装所需的依赖项。
  2. 从 Amazon SageMaker JumpStart 中心部署嵌入模型。
  3. 下载新闻稿作为的外部知识库。
  4. 根据新闻稿构建索引,以便能够查询并将其作为附加上下文添加到提示中。
  5. 查询知识库。
  6. 使用 LlamaIndex 和 LangChain 代理构建问答应用程序。

先决条件

在此示例中,LLM需要一个具有 SageMaker 域和适当的亚马逊科技 Identity and Access Management (IAM) 权限的亚马逊科技 账户。有关账户设置说明,请参阅创建 亚马逊云科技 账户。如果LLM还没有 SageMaker 域,请参阅Amazon SageMaker 域概述来创建一个。在本文中,使用AmazonSageMakerFullAccess角色。不建议LLM在生产环境中使用此凭据。相反,LLM应该创建并使用具有最低权限的角色。LLM还可以探索如何使用Amazon SageMaker Role Manager直接通过 SageMaker 控制台构建和管理基于角色的 IAM 角色,以满足常见的机器学习需求。

此外,LLM至少需要访问以下实例大小:

  • ml.g5.2xlarge用于部署Hugging Face GPT-J文本嵌入模型时的端点使用
  • ml.g5.48xlarge用于部署 Llama 2-Chat 模型端点时的端点使用

要增加配额,请参阅请求增加配额。

使用 SageMaker JumpStart 部署 GPT-J 嵌入模型

本部分为LLM提供部署 SageMaker JumpStart 模型时的两个选项。LLM可以使用提供的代码进行基于代码的部署,或使用 SageMaker JumpStart 用户界面 (UI)。

使用 SageMaker Python SDK 进行部署

LLM可以使用 SageMaker Python SDK 来部署 LLM,如存储库中提供的代码所示。完成以下步骤:

  1. 使用以下命令设置用于部署嵌入模型的实例大小instance_type = "ml.g5.2xlarge"
  2. 找到用于嵌入的模型的 ID。在 SageMaker JumpStart 中,它被标识为model_id = "huggingface-textembedding-gpt-j-6b-fp16"
  3. 检索预先训练的模型容器并将其部署以进行推理。

成功部署嵌入模型后,SageMaker 将返回模型端点的名称和以下消息:

在 SageMaker Studio 中使用 SageMaker JumpStart 进行部署

要在 Studio 中使用 SageMaker JumpStart 部署模型,请完成以下步骤:

  1. 在 SageMaker Studio 控制台上,在导航窗格中选择 JumpStart。
    img
  2. 搜索并选择 GPT-J 6B Embedding FP16 型号。
  3. 选择部署并自定义部署配置。
    img
  4. 对于此示例,需要一个 ml.g5.2xlarge 实例,这是 SageMaker JumpStart 建议的默认实例。
  5. 再次选择部署以创建端点。

端点大约需要 5-10 分钟才能投入使用。

img

部署嵌入模型后,为了使用 LangChain 与 SageMaker API 的集成,LLM需要创建一个函数来处理输入(原始文本)并使用模型将其转换为嵌入。LLM可以通过创建一个名为 的类来完成此操作ContentHandler,该类接受输入数据的 JSON,并返回文本嵌入的 JSON:class ContentHandler(EmbeddingsContentHandler).

将模型端点名称传递给ContentHandler函数以转换文本并返回嵌入:

embeddings = SagemakerEndpointEmbeddings(endpoint_name='huggingface-textembedding-gpt-j-6b-fp16', region_name= aws_region, content_handler=emb_content_handler).

LLM可以在 SDK 的输出或 SageMaker JumpStart UI 的部署详细信息中找到端点名称。

LLM可以通过输入一些原始文本并运行函数来测试ContentHandler函数和端点是否按预期工作embeddings.embed_query(text)。LLM可以使用提供的示例text = "Hi! It's time for the beach"或尝试LLM自己的文本。

使用 SageMaker JumpStart 部署和测试 Llama 2-Chat

现在LLM可以部署能够与用户进行交互式对话的模型。在本例中,选择 Llama 2-chat 模型之一,该模型通过以下方式识别

my_model = JumpStartModel(model_id = "meta-textgeneration-llama-2-70b-f")

该模型需要使用 部署到实时端点predictor = my_model.deploy()。 SageMaker 将返回模型的端点名称,LLM可以将其用作endpoint_name稍后引用的变量。

LLM定义一个print_dialogue函数来将输入发送到聊天模型并接收其输出响应。有效负载包含模型的超参数,其中包括:

  • max_new_tokens – 指模型可以在其输出中生成的最大令牌数。
  • top_p – 指模型在生成输出时可以保留的令牌的累积概率
  • 温度– 指模型生成的输出的随机性。温度大于 0 或等于 1 会增加随机性级别,而温度为 0 将生成最有可能的标记。

LLM应该根据LLM的用例选择超参数并对其进行适当的测试。 Llama 系列等型号要求LLM包含一个附加参数,表明LLM已阅读并接受最终用户许可协议 (EULA):

response = predictor.predict(payload, custom_attributes='accept_eula=true')

要测试模型,请替换输入有效负载的内容部分:"content": "what is the recipe of mayonnaise?"。LLM可以使用自己的文本值并更新超参数以更好地理解它们。

与嵌入模型的部署类似,LLM可以使用 SageMaker JumpStart UI 部署 Llama-70B-Chat:

  1. 在 SageMaker Studio 控制台上,在导航窗格中选择JumpStart
  2. 搜索并选择Llama-2-70b-Chat model
  3. 接受 EULA 并选择Deploy,再次使用默认实例

与嵌入模型类似,LLM可以通过为聊天模型的输入和输出创建内容处理程序模板来使用 LangChain 集成。在这种情况下,LLM将输入定义为来自用户的输入,并指示它们受system prompt.它system prompt告知模型其在帮助用户处理特定用例方面的作用。

除了上述超参数和自定义属性(EULA 接受)之外,调用模型时还会传递此内容处理程序。LLM可以使用以下代码解析所有这些属性:

llm = SagemakerEndpoint(
        endpoint_name=endpoint_name,
        region_name="us-east-1",
        model_kwargs={"max_new_tokens":500, "top_p": 0.1, "temperature": 0.4, "return_full_text": False},
        content_handler=content_handler,
        endpoint_kwargs = {"CustomAttributes": "accept_eula=true"}
    )

当端点可用时,LLM可以测试它是否按预期工作。LLM可以llm("what is amazon sagemaker?")使用自己的文本进行更新。LLM还需要定义ContentHandler使用 LangChain 调用 LLM 的具体内容,如代码和以下代码片段所示:

class ContentHandler(LLMContentHandler):
    content_type = "application/json"
    accepts = "application/json"
    def transform_input(self, prompt: str, model_kwargs: dict) -> bytes:
            payload = {
                "inputs": [
                    [
                        {
                            "role": "system",
                            "content": system_prompt,
                        },
                        {"role": "user", "content": prompt},
                    ],
                ],
                "parameters": model_kwargs,
            }
            input_str = json.dumps(
                payload,
            )
            return input_str.encode("utf-8")
   
    def transform_output(self, output: bytes) -> str:
            response_json = json.loads(output.read().decode("utf-8"))
            content = response_json[0]["generation"]["content"]
            return content
        
content_handler = ContentHandler()

使用 LlamaIndex 构建 RAG

要继续,请安装 LlamaIndex 以创建 RAG 应用程序。LLM可以使用 pip 安装 LlamaIndex:pip install llama_index

LLM首先需要将数据(知识库)加载到 LlamaIndex 上以进行索引。这涉及几个步骤:

  1. 选择数据加载器:

LlamaIndex 在LlamaHub上提供了许多可用的数据连接器,适用于 JSON、CSV 和文本文件等常见数据类型以及其他数据源,允许LLM提取各种数据集。在这篇文章中,使用SimpleDirectoryReader代码中所示的方式提取一些 PDF 文件。的数据样本是代码存储库中新闻稿文件夹中的两份 PDF 版本的 Amazon 新闻稿。加载 PDF 后,LLM可以看到它们已转换为包含 11 个元素的列表。

DocumentLLM还可以将对象转换为Node对象,然后再将其发送到索引,而不是直接加载文档。选择将整个Document对象发送到索引还是Node在索引之前将 Document 转换为对象取决于LLM的具体用例和数据结构。对于长文档,节点方法通常是一个不错的选择,在这种情况下,LLM想要分解和检索文档的特定部分而不是整个文档。有关更多信息,请参阅文档/节点。

  1. 实例化加载器并加载文档:

此步骤初始化加载器类和任何所需的配置,例如是否忽略隐藏文件。有关更多详细信息,请参阅SimpleDirectoryReader。

  1. 调用加载器的load_data方法来解析源文件和数据,并将它们转换为 LlamaIndex Document 对象,准备索引和查询。LLM可以使用以下代码,利用 LlamaIndex 的索引和检索功能完成全文搜索的数据摄取和准备:
docs = SimpleDirectoryReader(input_dir="pressrelease").load_data()
  1. 建立索引:

LlamaIndex 的关键特性是它能够在数据上构建有组织的索引,这些数据表示为文档或节点。索引有助于有效地查询数据。使用默认的内存向量存储和定义的设置配置来创建索引。 LlamaIndex Settings是一个配置对象,为 LlamaIndex 应用程序中的索引和查询操作提供常用资源和设置。它充当单例对象,因此它允许LLM设置全局配置,同时还允许LLM通过将特定组件直接传递到使用它们的接口(例如 LLM、嵌入模型)来本地覆盖特定组件。当未显式提供特定组件时,LlamaIndex 框架会回退到对象中定义的设置Settings作为全局默认值。要将的嵌入和 LLM 模型与 LangChain 一起使用并配置,Settings需要安装llama_index.embeddings.langchainllama_index.llms.langchain。可以Settings像下面的代码一样配置该对象:

Settings.embed_model = LangchainEmbedding(embeddings)
Settings.llm = LangChainLLM(llm)

默认情况下,使用作为默认存储上下文的一部分初始化的VectorStoreIndex内存中。SimpleVectorStore在现实生活中的使用案例中,LLM经常需要连接到外部矢量存储,例如Amazon OpenSearch Service。有关更多详细信息,请参阅Amazon OpenSearch Serverless 的矢量引擎。

index = VectorStoreIndex.from_documents(docs, service_context=service_context)

现在,LLM可以使用 LlamaIndex 中的query_engine对文档运行问答。为此,请传递LLM之前为查询创建的索引并提出LLM的问题。查询引擎是查询数据的通用接口。它采用自然语言查询作为输入并返回丰富的响应。查询引擎通常使用检索器构建在一个或多个索引之上。

query_engine = index.as_query_engine() print(query_engine.query("Since migrating to AWS in May, how much in operational cost Yellow.ai has reduced?"))

LLM可以看到 RAG 解决方案能够从提供的文档中检索正确的答案:

According to the provided information, Yellow.ai has reduced its operational costs by 20% since migrating to AWS in May

使用LangChain工具和代理

Loader班级。该加载器旨在将数据加载到 LlamaIndex 中或随后作为LangChain 代理中的工具。这为LLM提供了更多功能和灵活性,可以将其用作应用程序的一部分。首先从 LangChain 代理类定义LLM的工具。LLM传递给工具的函数会查询LLM使用 LlamaIndex 在文档上构建的索引。

tools = [
    Tool(
        name="Pressrelease",
        func=lambda q: str(index.as_query_engine().query(q)),
        description="useful pressreleases for answering relevnat questions",
        return_direct=True,
    ),
]

然后,LLM选择要用于 RAG 实施的正确代理类型。在这种情况下,LLM可以使用chat-zero-shot-react-description代理。通过此代理,LLM 将使用可用的工具(在本例中为知识库上的 RAG)来提供响应。然后,LLM可以通过传递工具、LLM 和代理类型来初始化代理:

agent= initialize_agent(tools, llm, agent="chat-zero-shot-react-description", verbose=True)

LLM可以看到代理正在通过thoughtsactions、 和observation,使用该工具(在本场景中,查询LLM的索引文档);并返回结果:

'According to the provided press release, Yellow.ai has reduced its operational costs by 20%, driven performance improvements by 15%, and cut infrastructure costs by 10% since migrating to AWS. However, the specific cost savings from the migration are not mentioned in the provided information. It only states that the company has been able to reinvest the savings into innovation and AI research and development.'

清理

为了避免不必要的成本,LLM可以通过以下代码片段或 Amazon JumpStart UI 清理资源。

要使用Boto3 SDK,请使用以下代码删除文本嵌入模型端点和文本生成模型端点以及端点配置:

client = boto3.client('sagemaker', region_name=aws_region)
client.delete_endpoint(EndpointName=endpoint_name)
client.delete_endpoint_config(EndpointConfigName=endpoint_configuration)

要使用 SageMaker 控制台,请完成以下步骤:

  1. 在 SageMaker 控制台的导航窗格中的推理下,选择端点
  2. 搜索嵌入和文本生成端点。
  3. 在端点详细信息页面上,选择删除。
  4. 再次选择删除进行确认。

结论

对于专注于搜索和检索的用例,LlamaIndex 提供了灵活的功能。它擅长为LLM建立索引和检索,使其成为深度探索数据的强大工具。 LlamaIndex 使LLM能够创建有组织的数据索引、使用不同的 LLM、增强数据以获得更好的 LLM 性能以及使用自然语言查询数据。

这篇文章演示了一些关键的 LlamaIndex 概念和功能。使用 GPT-J 进行嵌入,并使用 Llama 2-Chat 作为 LLM 来构建 RAG 应用程序,但LLM可以使用任何合适的模型。LLM可以探索 SageMaker JumpStart 上提供的全面的模型。

还展示了 LlamaIndex 如何提供强大、灵活的工具来连接、索引、检索数据以及与 LangChain 等其他框架集成数据。通过 LlamaIndex 集成和 LangChain,LLM可以构建更强大、更通用、更有洞察力的 LLM 应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dashboard 介绍

Dashboard 介绍 一、K8S Dashboard简介 简单的说,K8S Dashboard是官方的一个基于WEB的用户界面,专门用来管理K8S集群,并可展示集群的状态。K8S集群安装好后默认没有包含Dashboard,我们需要额外创建它 二、RABC简介 还是那句话&a…

关于下载上传的sheetjs

一、背景 需要讲后端返回来的表格数据通过前端设置导出其中某些字段,而且得是xlsx格式的。 那就考虑使用控件SheetJS。如果是几年前,一般来说,保存excel的文件都是后端去处理,处理完成给前端一个接口,前端调用了打开…

SQLite的扩展函数Carray()表值函数(三十八)

返回:SQLite—系列文章目录 上一篇:SQLite如何处理CSV 虚拟表 下一篇:SQLite—系列文章目录 ​ 1. 概述 Carray()是一个具有单列的表值函数(名为 “value”)和零行或多行。 carray() 中每一行的“值”取自 C 语言数组 由应用程序通过参数绑定提…

如何进行面向对象分析、面向对象设计和面向对象编程

目录 1.引言 2.案例介绍和难点剖析 3.如何进行面向对象分析 4.如何进行面向对象设计 5.如何进行面向对象编程 6.总结 1.引言 面向对象分析(OOA)、面向对象设计(00D)和面向对象编程(OOP)是面向对象开发的3个主要环节。 在以往的工作中,作者发现,很多…

JavaScript原型链深度剖析

目录 前言 一、原型链 1.原型链的主要组成 原型(Prototype) 构造函数(Constructor) 实例(Instance) 2.原型链的工作原理 前言 在JavaScript的世界中,原型链(Prototype Chain&…

Amazon云计算AWS之[4]非关系型数据库服务SimpleDB和DynamoDB

文章目录 简介非关系型VS关系数据库SimpleDB域条目属性值SimpleDB的使用 DynamoDBSimpleDB VS DynamoDB 简介 非关系型数据库服务主要用于存储结构化的数据,并为这些数据提供查找、删除等基本的数据库功能。AWS中提供的非关系型数据库主要包括SimpleDB和DynamoDB …

聚醚醚酮(Polyether Ether Ketone)PEEK在粘接使用时可以使用UV胶水吗?要注意哪些事项?

一般情况下,聚醚醚酮(Polyether Ether Ketone,PEEK)是一种难以黏附的高性能工程塑料,而UV胶水通常不是与PEEK进行粘接的首选方法。PEEK表面的化学性质和高温性能使得它对常规胶水的附着性较低。然而,有一些…

(成品论文22页)24深圳杯数学建模A题1-4问完整代码+参考论文重磅更新!!!!

论文如下: 基于三球定位的多个火箭残骸的准确定位 针对问题一:为了进行单个残骸的精确定位,确定单个火箭残骸发生音爆 时的精确位置和时间,本文基于三球定位模型,考虑到解的存在性和唯一性, 选取了四个监测…

用HTML5实现播放gif文件

用HTML5实现播放gif文件 在HTML5中&#xff0c;你可以使用<img>标签来播放GIF文件。GIF文件本质上是一种图像格式&#xff0c;它支持动画效果&#xff0c;因此当在网页上加载时&#xff0c;它会自动播放动画。先看一个简单的示例&#xff1a; <!DOCTYPE html> &l…

清华同方电脑文件删除怎么恢复

在日常使用清华同方电脑的过程中&#xff0c;我们难免会遇到误删重要文件的情况。文件丢失不仅可能导致数据损失&#xff0c;还可能影响到我们的工作、学习甚至是生活。那么&#xff0c;当在清华同方电脑上删除了重要文件后&#xff0c;我们应该如何恢复呢&#xff1f;本文将为…

Linux服务器安全基础 - 查看入侵痕迹

1. 常见系统日志 /var/log/cron 记录了系统定时任务相关的日志 /var/log/dmesg 记录了系统在开机时内核自检的信息&#xff0c;也可以使用dmesg命令直接查看内核自检信息 /var/log/secure:记录登录系统存取数据的文件;例如:pop3,ssh,telnet,ftp等都会记录在此. /var/log/btmp:记…

服务器被攻击,为什么后台任务管理器无法打开?

在服务器遭受DDoS攻击后&#xff0c;当后台任务管理器由于系统资源耗尽无法打开时&#xff0c;管理员需要依赖间接手段来进行攻击类型的判断和解决措施的实施。由于涉及真实代码可能涉及到敏感操作&#xff0c;这里将以概念性伪代码和示例指令的方式来说明。 判断攻击类型 步…

C#---使用Coravel实现定时任务

Coravel是一款框架轻&#xff0c;使用简单&#xff0c;支持秒级定时任务。 1.添加NuGet引用 2.定义自己的工作任务 using Coravel.Invocable; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Thread…

【Java笔记】JVM:对象在内存中是什么样的?如何计算对象占用的内存大小?

文章目录 Java对象的内存布局计算对象占用的内存大小Openjdk jol来算几个Object o new Object() 该对象在内存中占用多少字节&#xff1f;基本数据类型作为成员变量的对象有实例对象作为成员变量的对象 Java对象的内存布局 Java中&#xff0c;一个实例对象在内存中的组成主要包…

国家开放大学2024年春《Matlab语言及其应用》实验五Simulink系统 建模与仿真参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 实验报告 姓名&#xff1a; 学号&#xff1a; 实验五名称…

【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第九篇&#xff1a;MyBatis-Plus用法介绍。 在 MyBatis-Plus 3.5.0 中&#xff0c;LambdaQueryWrapper支持多种条件构造方式&#xff0c;除了等于&#xff08;eq&#xff09;、不等于&#xff08;ne&#xff09;、大于&a…

大模型公开课-大模型的语言解码游戏学习总结

在当今快速发展的人工智能领域&#xff0c;深度学习作为其中的一项关键技术&#xff0c;正引领着科技的新潮流。而对于初学者来说&#xff0c;了解大型语言模型的解码游戏&#xff0c;对于理解深度学习的基本概念至关重要。本篇博客将对一次关于大型语言模型解码游戏的视频教学…

SQL如何利用Bitmap思想优化array_contains()函数

目录 0 问题描述 1 位图思想 2 案例实战 3 小结 0 问题描述 在工作中&#xff0c;我们往往使用array_contains()函数来进行存在性问题分析&#xff0c;如判断某个数是否在某个数组中&#xff0c;但是当表数据量过多&#xff0c;存在大量array_contains()函数时&#xff0c;…

ollama-python-Python快速部署Llama 3等大型语言模型最简单方法

ollama介绍 在本地启动并运行大型语言模型。运行Llama 3、Phi 3、Mistral、Gemma和其他型号。 Llama 3 Meta Llama 3 是 Meta Inc. 开发的一系列最先进的模型&#xff0c;提供8B和70B参数大小&#xff08;预训练或指令调整&#xff09;。 Llama 3 指令调整模型针对对话/聊天用…

案例分享:使用RabbitMQ消息队列和Redis缓存优化Spring Boot秒杀功能

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c…