当前位置: 首页 > news >正文

Elasticsearch:使用 LLM 实现传统搜索自动化

作者:来自 Elastic Han Xiang Choong

这篇简短的文章是关于将结构化数据上传到 Elastic 索引,然后将纯英语查询转换为查询 DSL 语句,以使用特定过滤器和范围搜索特定条件。完整代码位于此 Github repo 中。

首先,运行以下命令安装依赖项(Elasticsearch 和 OpenAI):

pip install elasticsearch==8.14.0 openai==1.35.13

你将需要一个 Elastic Cloud 部署和一个 Azure OpenAI 部署来跟进此笔记本。有关更多详细信息,请参阅此 readme 文件。

如果这些可用,请填写下面的 env.example 并将其重命名为 .env:

ELASTIC_ENDPOINT=<YOUR ELASTIC ENDPOINT>
ELASTIC_API_KEY=<YOUR ELASTIC API KEY>
ELASTIC_INDEX_NAME=<YOUR ELASTIC INDEX NAME>AZURE_OPENAI_KEY_1=<AZURE OPEN AI API KEY>
AZURE_OPENAI_KEY_2=<AZURE OPEN AI API KEY>
AZURE_OPENAI_REGION=<AZURE OPEN AI API REGION>
AZURE_OPENAI_ENDPOINT=<AZURE OPEN AI API ENDPOINT>

最后,打开 main.ipynb 笔记本,并按顺序执行每个单元。请注意,代码将向你选择的 Elastic 索引上传大约 200,000 个数据点,大约 400MB。

本文探讨的流程

问题陈述

RAG 和混合搜索是当今最流行的搜索方式。将非结构化文档上传到索引,然后查询它,并在流程的每一步都使用机器学习,这一前景被证明是一个用途广泛的想法,拥有大量用例。

现在,数量庞大并非无限。尽管 RAG 用途广泛,但有时 RAG 要么过度使用,要么根本不适合数据。一个这样的例子是包含如下数据点的结构化数据集:

{'address': {'block': '827','postal_code': '705858','street': 'Commonwealth Avenue','street No.': '756','town': 'Sengkang','unit': '#15-042'},'age': 65,'blood_type': 'A+','citizenship': 'Singapore PR','country_of_birth': 'Slovakia','cpf_number': 'S8613060M','date_of_birth': '1958-10-05','deceased': False,'drivers_license_number': 'S4707782F','education': {'highest_qualification': 'N-Levels','institution': 'Local Polytechnic'},'email': 'mjq2n4xlpb@outlook.com','emergency_contact': {'name': 'Deng An Sheng','phone_number': '+65 8163 9924','relationship': 'Sibling'},'gender': 'Male','height_cm': 166,'immigration_status': None,'languages': {'spoken': {'Afrikaans': 'Basic', 'Xhosa': 'Native'},'written': {'Bengali': 'Native'}},'marital_status': 'Married','name': 'Wong Jiu Zhan','national_service': {'rank': 'Captain', 'status': 'NSman'},'nric': 'S77385949H','occupation': 'Sociologist','passport_number': 'K8013743A','phone_number': '+65 9395 8462','race': 'Others','religion': 'Taoism','weight_kg': 92}

对我来说,使用这种结构化数据进行基于向量的 RAG 没什么意义。要做到这一点,你可能需要尝试嵌入字段值,但这有几个问题。

首先,并非所有单个字段都是相等的。根据用例,某些字段会更受关注,因此应该赋予更高的权重(血型、年龄、体重和已故,如果你从事医学领域,也许可以这样?)。如果嵌入每个字段,然后进行加权求和,则可以对字段进行加权。这将使嵌入的计算成本乘以你拥有的字段数 - 在本例中约为 37 倍。如果不这样做,相关字段将被埋没在无关字段之下,性能可能会很差。糟糕的选择。

其次,即使你确实在每个数据点中嵌入了每个字段,你到底在查询什么?一个简单的英语问题,例如 “Adult men over the age of 25” ?向量无法像这样根据特定标准进行过滤 - 它们纯粹基于统计相关性工作,这很难明确。我敢打赌这些查询的结果很差,甚至根本无法给出结果。

数据

我们使用的数据不包括真实人物的个人资料。我编写了一个数据生成器来生成假的新加坡人。它是一系列随机选择语句,每个选择都从大量职业、出生国家、地址等选项中进行选择……有几个函数可以生成令人信服的护照、电话和 NRIC 号码。现在这个假数据生成器本身并不是特别有趣,所以我不会在这里讨论它。生成器本身位于相关笔记本上 - 请随意查看!我为这次测试生成了 352,500 个个人资料。

解决方案

传统搜索是一种更有效的选择,因为它具有明确的过滤器和范围。Elastic 是一个功能齐全的搜索引擎,具有远远超出向量的大量搜索功能。这是搜索的一个方面,最近被有关 RAG 和向量的讨论所掩盖。我认为这代表着错过了一个在相关性(搜索引擎性能)方面获得重大提升的机会,因为在昂贵的向量搜索发挥作用之前,就有可能过滤掉大量不相关的数据(这可能会产生统计噪音,使结果恶化)。

然而,交付和形式因素是重大障碍。最终用户可能不需要学习 SQL 或 Elastic Query DSL 等数据库查询语言,尤其是如果他们一开始就不懂技术的话。理想情况下,我们希望保留用户使用普通的自然语言查询数据的想法。让用户能够搜索你的数据库,而无需摆弄过滤器或疯狂地谷歌搜索如何编写 SQL 或 QDSL 查询。

在 LLM 时代之前,解决这个问题的办法可能是编写一些按钮并将它们标记为查询的特定组件。然后,你可以通过选择选项列表来构建复杂的查询。但这样做的缺点是,最终会变成一个非常丑陋的用户界面,里面充满了大量按钮。如果你只有一个聊天框可以搜索,那不是更好吗?

是的,我们将编写一个自然语言查询,将其传递给 LLM,生成一个 Elastic 查询,并使用它来搜索我们的数据。

提示设计 - prompt design

这是一个简单的概念,唯一需要解决的挑战是提示写作。我们应该写一个具有几个关键特征的提示:

1. 文档模式 - document schema

它包含数据模式,因此 LLM 知道哪些字段有效并且可以查询,哪些不能。像这样:

The document schema for the profiles is as follows:{"nric": "string","name": "string","race": "string","gender": "string","date_of_birth": "date","age": "integer","country_of_birth": "string","citizenship": "string","religion": "string" ["Buddhism", "Christianity", "Islam", "Hinduism", "Taoism", "No Religion"],"marital_status": "string" ["Single", "Married", "Divorced", "Separated", "Widowed", "Civil Partnership", "Domestic Partnership", "Engaged", "Annulled"],"address": {"block": "string","street_no": "string","street": "string","unit": "string","town": "string","postal_code": "string"},"phone_number": "string","email": "string","occupation": "string","cpf_number": "string","education": {"highest_qualification": "string","institution": "string"},"languages": {"spoken": {"language":"fluency" ["Basic", "Conversational", "Fluent", "Native"]},"written": {"language":"fluency" ["Basic", "Conversational", "Fluent", "Native"]},},"height_cm": "integer","weight_kg": "integer","blood_type": "string" ["A+", "A-", "B+", "B-", "O+", "O-", "ABß", "AB-"],"passport_number": "string","drivers_license_number": "string","national_service": {"status": "string","rank": "string"},"immigration_status": "string","emergency_contact": {"name": "string","relationship": "string","phone_number": "string"},"deceased": "boolean","date_of_death": "date"
}

请注意,对于某些字段(例如 blood_type、religion 和 fluency),我明确定义了有效值以确保一致性。对于其他字段(例如 languages 或 streetnames),可用选项的数量过多,会导致提示膨胀。在这种情况下,最好的选择是信任 LLM。

2. 示例

它包含示例查询和指南,有助于减少无效的无意义查询的几率。

Example query:
User: Find all male Singapore citizens between 25 and 30 years old who work as software developers and speak fluent English.Your response should be:{"query": {"bool": {"should": [{ "match": { "gender": "Male" } },{ "match": { "citizenship": "Singapore Citizen" } },{ "range": { "age": { "gte": 25, "lte": 30 } } },{ "match": { "occupation": "Software Developer" } },{"match": {"languages.spoken.English": {"query": "Fluent","fuzziness": "AUTO"}}}],"minimum_should_match": 2}}
}

3. 特殊情况

它应该包含一些特殊情况,这些情况可能需要稍微更高级的查询:

Consider using multi_match for fields that might contain the value in different subfields:
{"multi_match": {"query": "Software Developer","fields": ["occupation", "job_title", "role"],"type": "best_fields","fuzziness": "AUTO"}
}For names or other fields where word order matters, you might want to use match_phrase with slop:
{"match_phrase": {"full_name": {"query": "John Doe","slop": 1}}
}

4. 宽大处理和覆盖范围

应包含避免过度依赖精确匹配的说明。我们希望鼓励模糊性和部分匹配,并避免使用布尔 AND 语句。这是为了抵消可能的幻觉,这种幻觉可能会导致不可行或不合理的条件,最终导致搜索结果列表为空。

 Generate a JSON query for Elasticsearch. Provide only the raw JSON without any surrounding tags or markdown formatting, because we need to convert your response to an object. 
Use a lenient approach with 'should' clauses instead of strict 'must' clauses. Include a 'minimum_should_match' parameter to ensure some relevance while allowing flexibility. Avoid using 'must' clauses entirely.
All queries must be lowercase.Use 'match' queries instead of 'term' queries to allow for partial matches and spelling variations. Where appropriate, include fuzziness parameters to further increase tolerance for spelling differences. 
For name fields or other phrases where word order matters, consider using 'match_phrase' with a slop parameter. Use 'multi_match' for fields that might contain the value in different subfields.If some criteria are strict, please judiciously use term queries and must clauses appropriately.

一旦我们有了满足所有这些标准的提示,我们就可以进行测试了!

测试程序

我们将定义一个类来调用我们的 Azure OpenAI LLM:

class AzureOpenAIClient:def __init__(self):self.client = AzureOpenAI(api_key=os.environ.get("AZURE_OPENAI_KEY_1"),api_version="2024-06-01",azure_endpoint=os.environ.get("AZURE_OPENAI_ENDPOINT"))def generate_non_streaming_response(self, prompt, model="gpt-4o", system_prompt=""):response = self.client.chat.completions.create(model=model,messages=[{"role": "system", "content": system_prompt},{"role": "user", "content": prompt}],max_tokens=4096)return response.choices[0].message.contentLLM = AzureOpenAIClient()

并将查询与我们刚刚定义的提示一起传递给 LLm,如下所示:

query="All non-Singaporean men over the age of 25 who are software people living in woodlands" 
response=LLM.generate_non_streaming_response(query, system_prompt=prompt)
es_query=json.loads(response)
pprint(es_query)

提示中的这一行应该允许我们直接将 LLM 的响应加载为 JSON 对象,而无需进行任何进一步的处理:

Generate a JSON query for Elasticsearch. Provide only the raw JSON without any surrounding tags or markdown formatting, because we need to convert your response to an object. 

现在让我们进行一些测试并看看它的表现如何:

测试 1

首先,让我们测试一下 LLM 处理简单标准和处理一些模糊性的能力。我期望一个简单的年龄范围、男性和软件相关职业的模糊匹配以及新加坡公民的否定匹配。

查询:

所有 25 岁以上居住在 woodlands 的软件人员非新加坡男性

生成的 Elastic 查询:

{"query": {"bool": {"minimum_should_match": 3,"must_not": [{"match": {"citizenship": "singapore"}}],"should": [{"match": {"gender": "male"}},{"range": {"age": {"gt": 25}}},{"multi_match": {"fields": ["occupation"],"fuzziness": "AUTO","query": "software","type": "best_fields"}},{"match_phrase": {"address.town": {"query": "woodlands","slop": 1}}}]}}
}

结果:

Total matches: 7742
Score: 8.3714
Name: Xiao E
Age: 78
Gender: Male
Citizenship: Foreigner
Occupation: Software Developer
Address: {'town': 'Woodlands', 'postal_code': '838414'}
---
Score: 8.3714
Name: Zafran binti Kamaruzaman
Age: 67
Gender: Male
Citizenship: Foreigner
Occupation: Software Developer
Address: {'town': 'Woodlands', 'postal_code': '790670'}
---
Score: 8.3714
Name: Saffuan binti Sofiah
Age: 48
Gender: Male
Citizenship: Foreigner
Occupation: Software Developer
Address: {'town': 'Woodlands', 'postal_code': '352474'}
---

好的。这基本上就是我们所期望的。只有完全相关的结果。让我们尝试更难的测试。

测试 2

让我们做一个更模糊的查询。我期望对目前已故且出生在新加坡的 O 型血的人有更明确的标准。

查询:

目前已去世且出生在新加坡的全民献血者女性

生成的 Elastic 查询:

{"query": {"bool": {"minimum_should_match": 3,"should": [{"match": {"gender": "female"}},{"match": {"deceased": true}},{"bool": {"minimum_should_match": 1,"should": [{"match": {"blood_type": "o-"}}]}},{"match": {"country_of_birth": "singapore"}}]}}
}

结果:

Total matches: 10000
Score: 7.8673687
Name: Bharat D'Souza
Blood Type: O-
Gender: Female
Country of Birth: Singapore
Deceased: True
---
Score: 7.8673687
Name: Neeti Kochhar
Blood Type: O-
Gender: Female
Country of Birth: Singapore
Deceased: True
---
Score: 7.8673687
Name: Shanta Somani
Blood Type: O-
Gender: Female
Country of Birth: Singapore
Deceased: True
---

这些结果完全符合预期,向量甚至没有出现在任何步骤中。当你有锤子时,自然的倾向是寻找钉子来敲打。在这种情况下,我认为嵌入数据不会产生任何积极的结果来证明添加嵌入模型所增加的成本和复杂性是合理的。

测试 3

最后一个测试 - 让我们看看它是否可以处理嵌套属性,例如语言字段。

查询:

说中文方言的人

生成的 Elastic 查询:

{"query": {"bool": {"minimum_should_match": 1,"should": [{"match": {"languages.spoken.Chinese": "Fluent"}},{"match": {"languages.spoken.Mandarin": "Fluent"}},{"match": {"languages.spoken.Cantonese": "Fluent"}},{"match": {"languages.spoken.Hokkien": "Fluent"}},{"match": {"languages.spoken.Teochew": "Fluent"}},{"match": {"languages.spoken.Hakka": "Fluent"}},{"match": {"languages.spoken.Hainanese": "Fluent"}}]}}
}

结果:

Total matches: 10000
Score: 2.8383636
Name: Hadi binti Saleh
languages: {'spoken': {'Hainanese': 'Fluent', 'Esperanto': 'Fluent', 'Hakka': 'Fluent'}, 'written': {'Slovenian': 'Native', 'Mongolian': 'Basic', 'Dutch': 'Fluent'}}
---
Score: 2.8383636
Name: Liu Zai Su
languages: {'spoken': {'Hainanese': 'Fluent', 'Amharic': 'Native', 'Hakka': 'Fluent'}, 'written': {'Sinhala': 'Fluent'}}
---
Score: 2.8383636
Name: Kamal binti Zarina
languages: {'spoken': {'Zulu': 'Basic', 'Hakka': 'Fluent', 'Hainanese': 'Fluent'}, 'written': {'Armenian': 'Fluent', 'Spanish': 'Fluent'}}
---

使用 LLM 定义查询的一个显著优势是:各种中文方言都被正确地添加到查询中,而无需我在提示中明确定义它们。方便!

讨论

在 GenAI 时代,并非所有搜索用例都应涉及 RAG 和嵌入。使用传统的结构化数据构建搜索引擎非常简单,而且具有现代的纯语言查询便利性。由于其核心实际上只是 prompt 工程,因此这种方法并不是搜索非结构化数据的最佳方法。我确实相信,有大量用例有待探索,其中可以将传统的结构化数据库表暴露给非技术用户进行一般查询。在 LLMs 可用于自动查询生成之前,这是一个困难的问题。

在我看来,这有点错失良机。

准备好自己尝试一下了吗?开始免费试用。

想要获得 Elastic 认证吗?了解下一次 Elasticsearch 工程师培训何时开始!

原文:Write Elastic Query DSL to search structured datasets — Search Labs

相关文章:

Elasticsearch:使用 LLM 实现传统搜索自动化

作者&#xff1a;来自 Elastic Han Xiang Choong 这篇简短的文章是关于将结构化数据上传到 Elastic 索引&#xff0c;然后将纯英语查询转换为查询 DSL 语句&#xff0c;以使用特定过滤器和范围搜索特定条件。完整代码位于此 Github repo 中。 首先&#xff0c;运行以下命令安装…...

人脸表情行为识别系统源码分享

人脸表情行为识别系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…...

ThreadLocal原理解析及面试

基本使用 讲原理之前&#xff0c;我简单写个demo小程序说说怎么使用 public class TestThreadLocal {public static void main(String[] args) throws InterruptedException {ThreadLocal<String> tl new ThreadLocal();/**主线程设置了一个值*/tl.set("SSSSSs&…...

探索未来:mosquitto-python,AI领域的新宠

文章目录 探索未来&#xff1a;mosquitto-python&#xff0c;AI领域的新宠背景&#xff1a;为何选择mosquitto-python&#xff1f;库简介&#xff1a;mosquitto-python是什么&#xff1f;安装指南&#xff1a;如何安装mosquitto-python&#xff1f;函数用法&#xff1a;5个简单…...

C++版iwanna1

第一篇目录 开头程序Game.cpp源文件Player.h头文件Player.cpp源文件trigger.h头文件trigger.cpp源文件Cmp.h头文件Cmp.cpp源文件 开头 大家好&#xff0c;我叫这是我58。 程序 Game.cpp源文件 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <c…...

LSTM变种模型

一、GRU 1.概念 GRU&#xff08;门控循环单元&#xff0c;Gated Recurrent Unit&#xff09;是一种循环神经网络&#xff08;RNN&#xff09;的变体&#xff0c;旨在解决标准 RNN 在处理长期依赖关系时遇到的梯度消失问题。GRU 通过引入门控机制简化了 LSTM&#xff08;长短期…...

Python进阶--函数进阶

目录 1. 函数多返回值 2. 函数多种传参方式 (1). 位置参数 (2). 关键字参数 (3). 缺省参数 (4). 不定长参数 3. 匿名函数 (1). 函数作为参数传递 (2). lambda匿名函数 1. 函数多返回值 def return_num():return 1# 返回1之后就不会再向下继续执行函数体return 2 resu…...

elasticsearch 8.2 设置账号密码

背景:单节点集群数据写入测试-CSDN博客 前述项目支持设置账号密码,但8+版本似乎不能那么做了。 ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch. bootstrap check failure [1] of…...

JavaScript代码如何测试?

测试JavaScript代码是确保其功能、性能和可靠性的关键步骤。以下是一些详细的步骤和方法&#xff0c;用于测试JavaScript代码&#xff1a; 1、编写测试用例 首先&#xff0c;你需要为要测试的JavaScript代码编写测试用例。这些用例应该涵盖代码的各种功能和场景&#xff0c;包…...

案例分享—国外ui设计优秀案例

国外企业更注重用户体验设计&#xff0c;倾向于简洁清晰的设计风格&#xff0c;以提高用户的使用体验和操作效率。他们注重“简约至上”的设计理念&#xff0c;认为简洁的设计可以减少用户的认知负担&#xff0c;提高用户的工作效率。 设计师在界面设计中往往更加注重创意性和个…...

在JavaScript中,改变this指向的call,apply,bind有什么区别,原理分别是什么?

在JavaScript中&#xff0c;call、apply和bind方法都是用来改变函数执行时this指向的。 以下通过一个Demo帮助理解&#xff0c;代码如下&#xff1a; var obj {name: lisi,sayHello: function() {console.log(this.name)} } obj.sayHello()// lisifunction sayHello() {conso…...

Redis 缓存策略详解:提升性能的四种常见模式

在现代分布式系统中&#xff0c;缓存是提升性能和减轻数据库负载的关键组件。Redis 作为一种高性能的内存数据库&#xff0c;被广泛应用于缓存层。本文将深入探讨几种常用的 Redis 缓存策略&#xff0c;包括旁路缓存模式&#xff08;Cache-Aside Pattern&#xff09;、读穿透模…...

怎么建设网站吸引并留住客户

如何建设网站吸引并留住客户 在当今数字化时代&#xff0c;网站是企业与客户沟通的重要桥梁。一个设计精良、功能完备的网站不仅能吸引客户的注意&#xff0c;还能有效留住他们。以下是一些建设网站的关键策略。 **1. 用户体验优先** 网站的整体用户体验&#xff08;UX&#x…...

培训行业为什么要搭建自己的知识付费小程序平台?集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统 集师线上卖课小程序

在当今这个信息爆炸的时代&#xff0c;培训行业正面临前所未有的变革与挑战。传统的线下授课模式虽然经典&#xff0c;但在互联网技术的冲击下&#xff0c;其局限性日益凸显。为了更好地适应市场需求&#xff0c;提升服务效率与用户体验&#xff0c;培训行业亟需搭建自己的知识…...

Linux:Linux进程概念

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 冯诺依曼体系结构 二 操作系统(Operator System&#xff09; 2.1 概念 2.2 设计OS的目的 ​编辑 2.3 OS如何进行管理 ​编辑2.4 总结 三 进程的标示符 3.1 基本概念…...

专题九_递归_算法专题详细总结

目录 递归 1.什么是递归&#xff1f; 2.为什么会用到递归&#xff1f; 3.如何理解递归&#xff1f; 1.递归展开的细节图 2.二叉树中的题目 3.宏观看待递归的过程 1) 不要在意细节的展开图 2) 把递归的函数当作一个黑盒 3) 相信这个黑盒一定能够完成这个任务 4.如何写…...

性能赶超GPT-4!多模态检索最新成果刷爆SOTA!顶会思路确定不学?

关注各大顶会的同学们都知道&#xff0c;今年多模态相关的主题可谓是火爆非常&#xff0c;有许多突破性成果被提出&#xff0c;比如最新的多模态检索增强框架MORE&#xff0c;生成性能猛超GPT-4&#xff01; 再比如多模态检索模型MARVEL&#xff0c;在所有基准上实现SOTA&…...

基于 Qwen2.5-0.5B 微调训练 Ner 命名实体识别任务

一、Qwen2.5 & 数据集 Qwen2.5 是 Qwen 大型语言模型的最新系列&#xff0c;参数范围从 0.5B 到 72B 不等。 对比 Qwen2 最新的 Qwen2.5 进行了以下改进&#xff1a; 知识明显增加&#xff0c;并且大大提高了编码和数学能力。在指令跟随、生成长文本&#xff08;超过 8K…...

16【Protues51单片机仿真】智能洗衣机倒计时系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 用直流电机转动模拟洗衣机。要求 有弱洗、普通洗、强洗三种模式&#xff0c;可通过按键选择。可以设置洗衣时长&#xff0c;通关按键选择15、30、45、60、90分钟。时间到蜂鸣器报警提示。LCD 显示…...

爱心曲线公式大全

local r a*((math.sin(angle) * math.sqrt(math.abs(math.cos(angle)))) / (math.sin(angle) 1.4142) - 2 * math.sin(angle) 2) local x r * math.cos(angle) -- 计算对应的x值 local z r * math.sin(angle) 1.5*a - --曲线公式绘画 local function generateParabola()…...

新书速览|你好,C++

《你好&#xff0c;C》 本书内容 《你好&#xff0c;C》主要介绍C开发环境的搭建、基础语法知识、面向对象编程思想以及标准模板库的应用&#xff0c;特别针对初学者在学习C过程中可能遇到的难点提供了解决方案。全书共分13章&#xff0c;以一个工资程序的不断优化和完善为线索…...

ufw:Linux网络防火墙

一、命令简介 ​ufw​&#xff08;Uncomplicated Firewall&#xff09;是一个为 Linux 系统提供简单易用的命令行界面的防火墙管理工具。它是基于 iptables ​的&#xff0c;但提供了更简洁的语法和更直观的操作方式&#xff0c;使得配置防火墙变得更加简单&#xff0c;特别适…...

[C++]使用纯opencv部署yolov11-cls图像分类onnx模型

【算法介绍】 在C中使用纯OpenCV部署YOLOv11-cls图像分类ONNX模型是一项具有挑战性的任务&#xff0c;因为YOLOv11通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff0c;可以通过一些间接的方法来实现这一目标&am…...

​​​​​​​如何使用Immersity AI将图片转换成3D效果视频

随着技术的进步&#xff0c;图片处理变得越来越强大和直观。借助Immersity AI这样的工具&#xff0c;我们现在可以轻松地将平面图片转换成3D效果视频。以下是如何使用Immersity AI进行这一转换的详细步骤。 第一步&#xff1a;访问Immersity AI网站 首先&#xff0c;打开你的…...

安全运营 -- GPO审计

0x00 背景 审计GPO&#xff0c;目的是审计哪些GPO权限分配不合理&#xff0c;包括但不限于审计预期以外的用户具有对GPO的写权限。 0x01 开启审核 在一台windows服务器上 开始 -- 运行 -- 输入 server manager 依次点击Manage -- Add Roles and Features Wizard 角色和功能…...

thinkphp6入门(25)-- 分组查询 GROUP_CONCAT

假设表名为 user_courses&#xff0c;字段为 user_id 和 course_name&#xff0c;存储每个用户选修的课程&#xff0c;想查询每个学生选修的所有课程 SQL 原生查询 SELECT user_id, GROUP_CONCAT(course_name) as courses FROM user_courses GROUP BY user_id; ThinkPHP 代码…...

小米 MIX FOLD工程固件 更换字库修复分区 资源预览与刷写说明

小米 MIX FOLD机型代号 :cetus 该手机搭载骁龙888旗舰处理器 。对于一些因为字库问题损坏导致的故障,更换字库后要先刷写对应的工程底层修复固件。绑定cpu后在写入miui量产固件。 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此…...

Flutter全局统一自定义导航栏返回按钮

Flutter全局统一自定义导航栏返回按钮 在Flutter开发中&#xff0c;导航栏&#xff08;AppBar&#xff09;是用户界面的重要组成部分&#xff0c;它不仅提供了页面标题&#xff0c;还可能包含返回按钮、导航按钮等。默认情况下&#xff0c;每个Scaffold的AppBar都会包含一个返…...

微信图片的超能力:5大隐秘功能揭秘,让你成为信息处理大师

在数字化时代&#xff0c;微信已成为我们日常生活中不可或缺的通讯工具。 它不仅仅是聊天的平台&#xff0c;更是一个功能强大的信息处理工具。 今天&#xff0c;我们将揭秘微信中图片背后的五大隐秘功能&#xff0c;让你在使用微信时更加得心应手&#xff0c;成为信息处理的…...

python实现RC4加解密算法

RC4算法 一、算法介绍1.1 背景1.2 密钥调度算法(KSA)1.3 伪随机生成算法(PRGA) 二、代码实现三、演示效果 一、算法介绍 1.1 背景 RC4算法是由Ron Rivest在1987年为RSA数据安全公司设计的一种流密码算法&#xff0c;其安全性主要依赖于其密钥流的随机性和不可预测性。该算法因…...