采用大语言模型进行查询重写——Query Rewriting via Large Language Models

news2024/11/25 0:27:29

文章:Query Rewriting via Large Language Models,https://arxiv.org/abs/2403.09060

摘要

查询重写是在将查询传递给查询优化器之前处理编写不良的查询的最有效技术之一。 手动重写不可扩展,因为它容易出错并且需要深厚的专业知识。 类似地,传统的查询重写算法只能处理一小部分查询:基于规则的技术不能推广到新的查询模式,并且基于综合的技术无法处理复杂的查询。 幸运的是,大型语言模型(大语言模型)的兴起,配备了广泛的常识和先进的推理能力,为解决一些以前未解决的问题带来了希望。

在本文中,我们提出了GenRewrite,这是第一个利用大语言模型进行查询重写的整体系统。 我们引入了自然语言重写规则(NLR2)的概念,并使用它们作为大语言模型的提示,同时也是将知识从重写一个查询转移到另一个查询的手段,从而随着时间的推移变得更聪明、更有效。 我们提出了一种新颖的反例引导技术,可以迭代地纠正重写查询中的语法和语义错误,显着减少大语言模型成本和验证所需的手动工作量。 GenRewrite 将 99 个 TPC 查询(最复杂的公共基准)中的 22 个加快了 2 倍以上,这比最先进的传统查询重写和 2.1 的覆盖率高出 2.5 倍至 3.2 倍x 高于开箱即用的大语言模型基线。

1.介绍

低效查询是几乎所有使用数据库产品的组织中的一个主要问题。 这些编写糟糕的查询(可能由缺乏经验的用户编写或由商业智能 (BI) 或其他工具自动生成)通常是性能缓慢的主要驱动因素(在云数据库的情况下,成本过高,例如 Snowflake (Dageville 等人,2016) 或 BigQuery (Fernandes 和 Bernardino,2015))。 因此,查询重写(SQL-to-SQL)是提高性能和降低成本的关键步骤,因为如果查询优化器给出一个写得不好的查询,那么查询优化器找到更有效的查询计划的机会就会大大降低。首先。 查询重写,无论是手动还是自动完成,仍然是一项具有挑战性的任务。

手动查询重写的挑战。 对总体成本和性能影响最大的写得不好的查询往往也相当复杂。 例如,由 Looker (loo, tics) 自动生成的跨多个页面的 OLAP 查询并不罕见。 确保重写的查询保留原始的语义需要深入了解数据库模式、约束和查询意图,因此即使对于经验丰富的数据库专家来说也是一项耗时且容易出错的任务。 事实上,可能存在数千甚至数百万个此类查询,这使得手动方法成为一项艰巨的任务。

自动查询重写的传统方法的局限性。 尽管进行了大量的研究,自动重写技术仍然存在一些重大缺陷,这些缺陷长期以来限制了其在实践中的有效性。 在这里,最常见的方法是依赖一组“重写规则”,它们是基于模式匹配的语法转换。 如果规则中表达的模式与输入查询匹配,则规则会将匹配的部分替换为对应部分,从而生成语义上等效的查询,并且可能运行得更快。 无论规则是由专家制定和提供的(Bruno等人,2022;Pirahesh等人,1992;Ahmed等人,2006)还是自动推断(Wang等人,2022) ; Ding 等人, 2023),基于规则的查询重写器与提供给它的重写规则集一样有效。 根据定义,基于规则的查询重写器1 仅限于输入查询与其现有规则之一匹配的情况,因此从根本上无法优化之前未见过的新查询模式(Dong等人,2023)。 虽然基于综合的查询重写不需要先验规则(Dong 等人, 2023),但实际上它只处理简单的查询(例如,SlabCity (Dong 等人, 2023) t1> 只能优化 22 个 TPC-H 查询中的 2 个和 99 个 TPC-DS 查询中的 3 个)。

大型语言模型(大语言模型)。 大型语言模型(大语言模型)在执行复杂和开放式任务方面取得的巨大成功也为解决一些最困难的数据库问题带来了新的希望。 研究人员已使用大语言模型进行文本到 SQL (Fu 等人,2023;Gao 等人,2023;Sun 等人,[n.d.];Katsogiannis-Meimarakis 和 Koutrika,2023;Pourreza 和 Rafiei,2024 ) 以及其他一些领域,例如数据清理和集成(Narayan 等人, 2022; Suhara 等人, 2022)、表格处理(Li 等人, 2023;陆等人,2024)和数据库诊断(周等人,2023),它们的查询重写潜力在很大程度上尚未被开发。 在人类专家或现有规则无法重写查询的情况下,例如复杂查询或新查询模式,大语言模型是否可以利用其广泛的常识和高级推理能力来发现重写机会? 如果是这样,这可以大大减轻人类专家的负担,并允许更多的查询从重写中受益。 据我们所知,本文是第一篇专注于回答这个问题的论文:如何最好地利用大语言模型进行查询重写以及如何应对所涉及的挑战。

使用大语言模型的挑战。 使用大语言模型进行查询重写存在几个挑战:(1)幼稚的策略,即提示只是要求大语言模型“将给定的查询重写为更有效的形式,同时保留等价性”,只能重写一个小的查询子集 (§ 5.2); (2) 由于 SQL 语言的复杂性以及所谓的“幻觉”问题(Zhang 等人, 2023; Tonmoy 等人, 2024),大语言模型产生不可信的反应; (3)由于大语言模型无法进行实验并且缺乏特定于数据库的成本模型,因此它们重写的查询在许多情况下并不比原始查询快; (4) 多次调用一个大语言模型在时间和成本上都是昂贵的;最后(5)虽然提供提示可以帮助大语言模型,但提供太多或不相关的提示也会使大语言模型感到困惑,导致错误的反应。

我们的方法。 为了解决上述挑战,我们推出了GenRewrite,这是第一个利用大语言模型进行查询重写的整体系统。 我们引入自然语言重写规则(NLR2)的概念,它是总结重写的文本解释。 我们使用大语言模型本身来生成 NLR2,然后将其用于三个目的。 NLR2 1)作为提示帮助大语言模型提供更好的重写,2)通过提供人类可读的解释使重写更容易理解和验证,最重要的是,3)允许GenRewrite 将通过重写一个查询而获得的知识转移到另一个查询中,从而随着时间的推移变得更聪明、更有效。 由于 NLR2 没有机密信息(例如列或架构名称),因此甚至可以使用先前训练的 GenRewrite 的存储库来引导 GenRewrite 的 NLR2 存储库以用于新的工作负载> 在另一个工作负载上。

为了避免冗余规则,这反过来又会混淆大语言模型,我们为每个 NLR2 维护一个效用分数,以便仅向大语言模型提供那些与当前查询最相关的规则作为提示。 最后,为了最大限度地降低大语言模型成本并最大限度地减少人工验证所需的人力,GenRewrite不会丢弃错误的重写。 相反,它使用一种新颖的反例引导技术来迭代纠正重写查询中的语法和语义错误。
在这里插入图片描述
高级工作流程。图1显示了整个工作流程,这是一个迭代过程。 在每次迭代中,工作负载中的每个查询都会经历三个阶段,以找到比之前迭代中发现的更好的重写:1 建议重写、2 纠正重写、3 评估重写。 此外,GenRewrite 维护一个自然语言重写规则 (NLR2) 存储库,用于跨工作负载中的查询进行知识传输。 1从中选择适当的NLR2作为建议新重写的提示。 1 还将所有新发现的 NLR2 合并回存储库中。 2根据大语言模型提供的反例迭代细化重写,以消除语义和句法错误。 3 评估重写的等效性和性能,并相应地更新所使用的 NLR2 的实用分数。 这个过程一直持续到没有发现额外的改进并且重写集稳定为止。

目标用例。 GenRewrite 使用默认的时间预算 30 秒,但用户可以灵活地选择不同的时间或金钱预算。 对于多次执行同一查询的任何场景,每个查询的一次性成本都是合理的。 例如,商业智能 (BI) 仪表板每天对最新数据运行相同的查询,因此这些查询需要重写和优化一次并重复使用多次。 其他示例包括数据库支持的 Web 应用程序、报告工具、批处理作业以及 dbt (dbt, ouse) 和其他数据转换脚本。 事实上,Microsoft 集群中超过 60% 的作业都是重复性的(Jindal 等人,2018),这意味着用户可以调用 GenRewrite 作为识别任何优化的最后一步在运行工作负载之前,以最大程度地减少执行时间和资源消耗。

贡献。 我们做出以下贡献:

(1) 据我们所知,我们首次对查询重写的大语言模型进行了深入分析,强调了该领域未来研究的挑战和机遇(§3)。
(2) 我们推出GenRewrite,这是一个利用大语言模型进行自主查询重写的整体工具。 它通过引入(i)自然语言重写规则(NLR2)的概念来解决使用大语言模型的关键挑战,以找到更好的重写和有效的知识转移,(ii)NLR2的效用分数以最大限度地减少大语言模型引起的混乱不相关或太多的规则,以及(iii)反例引导的迭代修正方法。 (§4)。
(3) 我们在最复杂的公共基准 TPC-DS 上评估了 GenRewrite,将 99 个查询中的 22 个加快了 2 倍以上,这比现有技术的覆盖率高了 2.5 倍到 3.2 倍。 art 传统查询重写,比开箱即用的大语言模型性能高 2.1 倍 (§5)。

2.背景和动机

2.1.传统查询重写的局限性

尽管人类专家花费了数十年的努力来制定一套广泛的重写规则,但许多查询仍然无法通过基于规则的方法重写为更有效的形式(Dong等人,2023)。 这是因为重写规则捕获的查询模式从根本上是有限的。 在重写机会避开现有规则的情况下,利用常识就变得至关重要,因为常识在识别计算冗余和探索替代方法以实现相同结果方面发挥着至关重要的作用。 为了说明这一点,我们提供了来自 TPC-DS (tpc, mark) 的示例查询,这是一个对商业智能系统的挑战进行建模的行业标准基准。
在这里插入图片描述
在这里插入图片描述

清单 2 中的示例查询源自 TPC-DS 基准的第 11 季度,以提高可读性,旨在查找 1998 年至 1999 年 Web 销售增长率高于商店销售增长率的客户同一时期。 该查询首先创建一个通用表表达式 (CTE) year_total,该表达式使用 UNION ALL 合并每个客户每年的商店和网络销售数据(第 2-4 行和第 6-8 行) (第 5 行)。 然后,它对销售类型和年份列应用过滤器,以提取每个客户 1998 年和 1999 年的商店和网络销售数据(第 22-29 行),并将结果连接到客户 ID 上,以便于比较各个客户的销售数据。不同年份和销售类型的同一客户(第 19-21 行)。 最后,它筛选出网络销售增长率高于商店销售增长率的客户(第 30-31 行)。 更一般地,编写得不好的查询可能会使用UNION ALL来组合多个数据源,使用单个列来标记每个部分,然后在标签列上应用过滤器以单独使用每个部分。 在这种情况下,组合和过滤操作会相互抵消,应该从查询中删除,以获得更好的性能和可读性。 修改后的查询(如清单 3 所示)仅进行了两项更改:(1) 分别为商店和网络销售数据生成两个 CTE,而不是将它们合并为一个,(2) 删除有关销售类型的过滤器在主查询中。 因此,当在 TPC-DS 比例因子设置为 10 的 PostgreSQL 上进行测试时,观察到的加速约为 9 倍,将执行时间从 18 分钟减少到 2 分钟。 显着的加速不仅仅归因于避免与销售类型列上的 UNION ALL 和谓词相关的所有计算。 相反,观察到的性能差距还归因于这样一个事实:在 PostgreSQL 中,查询中的谓词越多,低估基数的趋势就越明显。 显然,原始查询比修订后的查询有更多的谓词,并且由于基数严重低估,PostgreSQL 在原始查询中选择了嵌套循环连接而不是排序合并连接。 除了性能提升之外,这种重写还增强了模块化和可维护性。

为了通过模式匹配规则解决这种计算冗余,最初的挑战在于识别标签列。 然后,必须跟踪子查询结果的使用情况并确定组合结果是否未被使用。 这种用法可能出现在谓词子句、case when 子句或外部查询块内的任何部分中。 考虑到多种可能的模式,尽管设计了许多规则,但我们仍然可能无法覆盖所有情况以消除不必要的 UNION ALL。 然而,人类观察者在看到上面的例子时,会直观地认识到“组合然后分裂”的过程实际上没有任何作用,应该从查询中删除。 这种直觉源于一般知识而不是明确的规则。 鉴于人类专家的时间和资源有限,手动检查每个查询是否存在潜在的冗余是不可行的。 虽然人类的智慧仍然是无价的,但像 GPT-4 等编码大量常识的大型语言模型(大语言模型)可能会成为潜在的游戏规则改变者,从而实现自动识别和利用重写机会。

2.2.大语言模型背景

本节简要概述了本文其余部分中使用的 LLM 相关术语。

Token 。 标记是大语言模型用来处理语言的单元或构建块。 例如,字符串“tokenization”被分解为两个词符“词符”和“ization”,而像“the”这样的短常用词则被表示为单个词符(ope,tion) 。 使用大语言模型的成本通常由输入和输出中的标记数量决定。

零样本提示与少样本提示。 成功使用大语言模型的关键是找到最优提示,俗称提示工程(goo,e AI)。 根据提示中提供的示例数量,提示工程分为两种场景:零样本提示(高等人,2023)和少样本提示(顾等人,2023) 。 零样本提示中没有提供示例。 图4显示了一个简单的提示,仅包含输入查询本身和简洁的一句话重写指令。 相反,在少样本提示中,向大语言模型提供有限数量的示例,使其能够从输入示例中识别显式或隐式模式并生成相应的输出。 例如,在文本到 SQL 的上下文中,少样本提示中的示例可能包括数据库模式、自然语言查询和相应的 SQL 查询作为解决方案。
在这里插入图片描述

3.使用大语言模型进行查询重写的经验教训

我们进行了全面的实验来研究大语言模型对于重写各种查询并提高其性能的适用性。 具体来说,我们仔细审查了大语言模型建议的每个重写,并评估其正确性和延迟。 我们特别注意辨别哪些问题可以有效解决,哪些问题不能有效解决,以及哪些条件可以将后者转化为前者。 Our study not only provided valuable insight int the capabilities of LLMs and the challenges associated with using it for query rewriting but also contributed to the development and refinement of GenRewrite that is presented in §4. 下面我们总结了影响 GenRewrite 设计决策的主要经验教训。

Lesson 1:即使有简单的提示,大语言模型在某些工作负载上也非常有效。 推理查询的性能问题并确保正确重写是一项艰巨的任务。 令人惊讶的是,即使是如图4所示的简单提示,大语言模型通过理解查询中固有的语义,也能找到许多显着提高性能但被重写规则甚至人类忽略的重写机会。专家。 零样本提示对于大语言模型训练语料库中复杂度低、频率高的查询效果最好。 一个典型的例子是 Leetcode 工作负载 (lee, Code)。 例如,考虑一下 LeetCode 问题 #176,其中的目标是从 Employee 表中找到第二高的薪水。 图5中的Q1是该问题的人工编写的解决方案(由LeetCode参与者提交),而Q2是大语言模型生成的重写。 当在随机填充一百万行的数据库上执行时,Q2 比 Q1 快大约 2000 倍。 优化过程涉及通过推理深入理解查询意图:(1)确定 Q1 的目标是找到第二高的薪水,(2)意识到有另一种方法可以实现相同的目标,即:首先使用子查询找到最高工资,然后将所有工资与该最高工资进行比较以找到第二个最大值,最后(3)认识到Q2通过减少所需的比较次数来实现性能改进。
在这里插入图片描述
Lesson 2:随着查询复杂性的增加,大语言模型很难识别重写机会。 虽然大语言模型在理解数据语义、执行推理和生成代码方面表现出了卓越的能力,但众所周知,它们的能力并不是无限的。 同样,随着查询变得更加复杂,大语言模型识别重写机会的能力就会减弱。 虽然大语言模型仍然有可能发现重写机会,但可能性的降低需要大语言模型运行更多的迭代,从而导致成本显着升高。 在§2.1中,我们演示了如何通过消除不必要的UNION ALL将Q11优化为更有效的形式。 TPC-DS 基准测试中的 Q4 和 Q74 也存在类似的问题。 特别是 Q4,是更复杂的一个,其词符数量最高(Q4 为 1,170,而 Q11 为 723,Q74 为 591),与 UNION ALL 组合的段最多(3 个,其他为 2),以及最高的连接数(第 4 季度为 5 个,其他为 3 个)。 尽管进行了多次尝试(使用图 4 中显示的提示运行了 10 次),但 Q4 的重写均未建议删除 UNION ALL,这一修改可以显着减少执行时间。 相反,Q11 的 10 次尝试中有 4 次和 Q74 的 10 次尝试中有 6 次朝着正确的重写方向发展。 这一观察提出了一个问题:我们是否可以通过知识迁移弥合大语言模型可以优化的查询和大语言模型不能优化的查询之间的差距,从而使大语言模型能够优化更广泛的查询,特别是那些高度复杂的查询。 这是我们 NLR2 概念背后的主要动机。

请注意,正确的重写方向,例如在 Q74 的重写中消除不必要的 UNION ALL 的建议,并不能保证对原始查询的无错误或等效重写。 此类查询的复杂性加剧了在不引入错误的情况下操作其元素的挑战。

Lesson 3:当提示中提供合适的重写提示时,大语言模型可以优化以前难以优化的查询。 由于零样本提示对于查询重写任务并不普遍有效,因此在提示中纳入精确的指导变得至关重要。 从文本到 SQL 任务中使用的少样本提示中汲取灵感(Sun 等人, [n.d.]),一种方法是为大语言模型提供示例,其中包括输入查询及其优化版本。 然而,另一种策略也有希望。 考虑这样的场景:人类专家分析两个可以使用相同想法进行优化的查询,例如 Q4 和 Q74。 人们想到的见解是,这两个查询都可以从“避免不必要的 UNION ALL”中受益。 事实上,将这种见解作为提示集成到提示中始终会导致大语言模型建议在不同的尝试中删除 UNION ALL。 与少样本提示方法相比,后一种方法有两个好处:(1)它需要更少的标记,从而降低成本并加速重写生成过程,(2)提示很容易被人类解释,促进更快的调试。 然而,由于人类专家的时间限制,手动分析每个查询并提出有益的重写提示是不切实际的。 因此,需要一种自动化方法来识别为每个查询量身定制的重写提示。

详细文章内容见Query Rewriting via Large Language Models,https://arxiv.org/abs/2403.09060

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

异常-模块-包-Python

师从黑马程序员 异常的概念 异常演示 捕获异常的方法 try:fopen("D:/abc.txt","r",encoding"UTF-8") except:print("出现异常了,因为文件不存在,我将open的模式,改为w模式去打开")fopen("D:/a…

继阿里EMO后,腾讯也提出了AniPortrait:用于生成由音频和参考肖像图像驱动的高质量动画

腾讯提出了一种新颖的框架-AniPortrait,用于生成由音频和参考肖像图像驱动的高质量动画。通俗讲,就是给张照片生成说话的视频。类似阿里的EMO,大家先可以简单看下效果。 相关链接 论文:arxiv.org/abs/2403.17694 代码&#xff1a…

【技术访谈】与Babbage项目团队畅谈BSV区块链的新代码库

​​发表时间:2024年3月12日 BSV区块链协会近期宣布上线了JavaScript和TypeScript SDK,后者旨在为开发者提供先进的统一核心代码库,以便利开发者在BSV区块链上开发具备可扩展性的应用程序。 新上线的SDK替代了此前被广泛使用的、但已长期不再…

家用洗地机如何选?四款2024高性能洗地机力荐

家庭清洁是每个家庭都需要面对的日常任务,而一款高效、实用的洗地机能够极大地减轻我们的清洁负担。然而,在众多洗地机品牌和型号中选择一款适合自己的产品并不容易。本文将为您提供一份全面的洗地机选购指南,帮助您了解各种洗地机的特点和功…

el-form表单去除部分校验结果

需求说明 如图: 当点击右边的叉时, 需要删除这个输入框,删除这个输入框只需要一个变量就可以解决。 但使用v-show的方式去除这个输入框的时候,但下面的校验信息却没有消失 解决方法 找了半天,表单局部重置的方法&a…

收下这份地表最强参会指南,4月16日,玩转百度Create大会不迷路

欢迎来到英杰社区: https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区: https://bbs.csdn.net/topics/617897397 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步&#xff…

windows qt打包保姆级教学

windows qt打包保姆级教学 简述打包打包进阶 简述 在windows下开发的qt程序,想在其他windows计算机上运行,而那个计算机没有qt环境,执行时候会报错各种dll找不到,那么就需要将自己开发的qt程序和用到的库打包。 打包 这里先编译…

Transformer的代码实现 day03(Positional Encoding)

Positional Encoding的理论部分 注意力机制是不含有位置信息,这也就表明:“我爱你”,“你爱我”这两者没有区别,而在现实世界中,这两者有区别。所以位置编码是在进行注意力计算之前,给输入加上一个位置信息…

真·面试题总结——JVM虚拟机

JVM虚拟机 JVM虚拟机规范与实现 JVM虚拟机规范 JVM虚拟机实现 JVM的常见实现 JVM虚拟机物理架构 JVM虚拟机的运转流程 JVM类加载过程 JVM类加载器及类加载器类型 JVM类加载器双亲委派机制 JVM运行时数据区的内存模型 JVM运行时数据区的内存模型:程序计数器…

使用OpenCV4.9的随机生成器和文本

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 4.9基本绘图 下一篇:OpenCV系列文章目录(持续更新中......) 目标 在本教程中,您将学习如何: 使用随机数生…

Java中的可变字符串

Java中的可变字符串 一、什么是可变字符串二、可变字符串的使用场景以及使用步骤1.新建一个可变字符串2.可变字符串的一系列方法 一、什么是可变字符串 可变字符串是Java.lang包下的 在我们学习到JDBC的时候需要将原有的sql语句根据不同的差异添加一段新的关键字或者单词&…

C语言_第一轮笔记_指针

8.1 密码开锁 地址和指针 一般以变量所在的内存单元的第一个字节的地址作为他的地址NULL的值为0,代表空指针 指针变量的定义 类型名 *指针变量名类型名指定指针变量所指向变量的类型指针声明符*在定义指针变量时被使用,说明被定义的那个变量是指针指针变…

护眼台灯十大排名品牌有哪些?2024护眼台灯十大排名品牌推荐

在当今的教育环境中,学生们面临着相当沉重的学业压力。放学后,许多孩子便投入到无休止的作业之中,常常夜深人静时还未完成。作为家长,孩子的视力健康自然成为了我们心中的一块大石。夜间学习时,灯光的质量至关重要。标…

批量转换图片神器,支持tiff图片转换成png格式,图片高效转换

在数字图像处理领域,格式转换一直是关键且必要的环节。尤其对于设计师、摄影师、网站开发者等专业人士来说,能够快速、高效地将图片从一种格式转换为另一种格式,是提升工作效率和保障项目质量的关键。今天,我们荣幸地向您推荐一款…

低压配电室数字孪生实现区域内的无人值守

众所周知,电力设备的精益管控、精益检修与精益维护对于电网智慧化转型的重要性。因此数字孪生公司深圳华锐视点利用精湛的数字孪生、虚拟仿真、3D建模和图形图像技术,集成数据采集、监控预警、计划维护、数据分析、决策支持等核心模块,为电力…

从零开始构建gRPC的Go服务

介绍 Protocol Buffers and gRPC是用于定义通过网络有效通信的微服务的流行技术。许多公司在Go中构建gRPC微服务,发布了他们开发的框架,本文将从gRPC入门开始,一步一步构建一个gRPC服务。 背景 之前在B站看过一个gRPC教学视频,…

Linux进程控制(改)

Linux进程控制 进程 内核数据结构(struct task_struct,struct mm_struct,页表) 代码和数据 在Linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程 1.进程创建 ./程序fork&am…

GPS坐标转换为百度地图坐标并显示到百度地图上

百度地图有个坐标识取系统:https://api.map.baidu.com/lbsapi/getpoint/index.html,打开链接如下: 如上图,可以搜索某一个位置,然后会出现该位置的许多选择,选择一个就会显示出对应的百度地图的坐标&#x…

抖音小店正确的起店方法是什么?别再闭门造车了,快来学习!

大家好,我是电商糖果 随着抖音卖货的火爆的,开抖音小店的商家也越来越多。 很多没有电商经验的朋友就发现,想要起店非常难。 有的好一两个月了,都不出单。 糖果做抖音小店有四年时间了,也经营了多家小店。 这里就…

从零开始:如何进入IT行业

微信扫码体验我自己做的小程序(很有意思哦~~【坏笑】): 随着科技的飞速发展,IT行业已经成为了许多人梦寐以求的职业之一。不过,对于那些没有任何相关经验或技能的人来说,进入这个领域…