TAG:定义自然语言查询的高效解决方案

原创 精选
人工智能 数据分析
TAG 模型的出现填补了传统数据查询技术与现代语义推理需求之间的空白。通过结合 SQL 查询和大语言模型,TAG 在复杂查询、推理和结果生成方面展现了强大的能力。

作者 | 崔皓

审校 | 重楼

摘要

TAG(Table-Augmented Generation)模型通过结合关系型数据库的精准计算能力和大语言模型的语义推理能力,为复杂的自然语言查询提供了高效解决方案。TAG 的核心流程分为查询合成、查询执行和答案生成三步,能够灵活处理多数据源的交互式查询任务。通过引入语言模型,TAG 不仅可以执行传统 SQL 查询,还能在情感分析、趋势总结等语义推理任务中展现卓越性能。本文详细解析了 TAG 的功能和机制,同时引入 LOTUS 系统作为其具体实现,展示了如何通过模块化语义操作符进一步优化数据查询效率与推理能力。

什么是 TAG

在现代商业和数据分析场景中,许多重要的信息都存储在关系型数据库中,用户需要通过自然语言查询来获取反馈。例如,一个零售经理可能会问:“过去一个月,某个商品类别的销售趋势是什么?”或者“客户对新产品的评价有哪些共性?”这些问题的答案不仅需要从数据库中提取相关信息,还需要进一步结合上下文进行语义推理和总结。

为了解决这些复杂的问题,Table-Augmented Generation (TAG) 应运而生。TAG 模型不仅能够高效处理结构化数据,还通过引入语言模型实现语义推理和复杂的多步推断。这一特性使 TAG 成为解决复杂查询的强大工具。

TAG 模型通过三个主要步骤——查询合成(Query Synthesis)、查询执行(Query Execution)和答案生成(Answer Generation)——结合了语言模型(LM)和数据库系统的优点。例如,在电商分析场景中,TAG 可以从多个数据源提取销售记录,结合时间信息进行趋势分析,并进一步利用语言模型总结出关键洞察,例如“本月销售额增长的主要原因是某爆款商品的热销”。

此外,在情感分析场景中,TAG 也展现了独特的优势。例如,用户查询“客户对某产品的评价是正面还是负面?”时,TAG 能够提取评价文本,结合语言模型进行情感分类,并生成总结,例如“90%的客户反馈是正面的,主要提到产品的性价比和质量”。TAG 在处理多样化的查询时比传统方法表现更好,尤其是在涉及到情感分析、趋势总结等需要推理和通用知识的任务时,表现尤为突出。

为什么需要使用TAG

大家有没有遇到过这种场景,用户提出比较复杂的问题,而系统需要通过关系型数据库进行搜索并给予反馈。比如“总结经典最卖座浪漫电影的评论”。我们需要搜索出最卖座的电影,然后找到该电影的评论信息(多条),最后将这些信息进行汇总形成摘要返回给用户。基本思路是,在数据库中进行多表查询、汇总、聚合等操作,还需要配合大语言模型结合上下文给出答复。

其中最容易让人想到的方式是,通过将自然语言请求转化为数据库查询,执行查询后返回相关结果。这种方式可以准确定位符合条件的数据记录,但这种方式无法进一步总结或推理。这类功能背后的技术实现被称为 Text2SQL,它将自然语言翻译为 SQL 查询语句并在数据库中执行。然而,Text2SQL 的能力仅限于数据的直接检索,对于更复杂的分析或多层次推理,它显得力不从心。

另一种方法是通过语义检索技术实现。这种方法将文本信息存储在向量数据库中,随后通过相似度计算(如余弦相似度)来找到最相关的记录。这一技术被称为 RAG (Retrieval-Augmented Generation)。RAG 的优势在于,它能够结合语言模型生成自然语言答案,并通过向量检索高效处理文本匹配问题。然而,当需要对来自多个数据表的信息进行聚合或复杂推理时,RAG 同样面临挑战。

为了克服这些局限性,TAG (Table-Augmented Generation) 提供了更强大的解决方案,特别是在多数据源和跨表操作场景中展现了其独特的优势。TAG 不仅能够像 Text2SQL 一样将自然语言查询转化为 SQL 并高效执行,还可以灵活地处理来自多个表的数据关联,同时引入语言模型的推理能力,进一步丰富查询结果的语义表达。

例如,针对“总结经典最卖座浪漫电影的评论”这一请求,TAG 不仅能找到“泰坦尼克号”的相关评论,还能利用语言模型深入分析这些评论内容并生成总结,例如“泰坦尼克号的评论主要提到其出色的叙事和视觉效果”。通过结合数据库的精确计算能力与语言模型的语义推理能力,TAG 成为处理复杂查询和提供上下文丰富答案的最优选择。

Text2SQL、RAG和TAG之间的区别

通过上面“浪漫电影”的例子,我们提到了三个技术,分别是:Text2SQL、RAG以及TAG,他们是AIGC发展不同时代的产物。下面,我们对他们进行一个横向比较。

Text2SQL

它主要通过将自然语言查询转换为SQL查询来执行,适用于那些有明确数据库关系映射的查询。它的问题很明显,无法处理需要语义推理、情感分析或其他复杂推理的查询。例如,无法理解用户查询中的隐含含义,如“哪些客户对产品X的评价是正面的”。

RAG (Retrieval-Augmented Generation)

基于检索的生成方法,它从外部数据库中检索与查询相关的信息,然后通过LM生成答案。通常用于执行基于相关性简单查找的任务。RAG只能处理点查找类问题,不能有效地进行数据聚合、复杂计算或多步推理。例如,无法处理“为什么我的销售在这段时间下降”这样的查询,它涉及到复杂的数据汇总和推理。

TAG (Table-Augmented Generation)

TAG结合了Text2SQL和RAG的优点,通过三个主要步骤(查询合成、查询执行和答案生成)高效地回答自然语言查询。其优势比较明显: 

查询合成:将用户的自然语言查询转换为可执行的数据库查询(SQL)。

查询执行:在数据库中高效执行查询,获取相关数据。

答案生成:结合数据库中的数据和语言模型生成最终的自然语言答案,进行复杂的推理和总结。

TAG的创新在于,除了处理传统数据库查询(如SQL),它还能够处理需要推理、推断世界知识的查询,适用于需要复杂推理和多层次数据交互的查询。

我们将三者的区别整理为如下表格。

从表格可以看出,Text2SQL 的强项在于直接提取结构化数据,RAG 在文本相关性查找方面表现优异,而 TAG 通过结合 SQL 查询和语言模型的语义推理能力,实现了前两者无法完成的复杂查询。TAG 特别适合需要跨表分析、数据聚合和复杂推理的场景,例如总结最经典的浪漫爱情电影评论,或分析客户对新产品的综合反馈。

TAG 的内部机制

TAG 系统在解决复杂自然语言查询时,与传统方法的处理流程有显著不同,特别是在引入推理能力和丰富上下文答案方面表现卓越。

如下图所示,TAG通过以下三个主要步骤, 实现了高效的自然语言查询回答:

查询合成(Query Synthesis): 首先,将用户的自然语言请求转换为可执行的数据库查询。与 Text2SQL 不同,TAG 不仅可以生成 SQL 查询,还能够合成结合多个数据源和类型的复杂查询。例如,请注意以下示例:

用户查询“总结被认为是‘经典’的最卖座浪漫电影的评论”,TAG 将其翻译为如下 SQL 查询:

WITH CRM AS (SELECT * FROM movies WHERE genre = 'Romance' 
AND LLM('{movie_title} is a classic') = 'True')
SELECT * FROM CRM 
WHERE revenue = (SELECT MAX(revenue) FROM CRM);

在此过程中,TAG 使用 LLM 调用 LLM('{movie_title} is a classic') = 'True' 来引入新的推理能力。这一步骤被称为“增强”步骤,因为它扩展了 SQL 查询的能力,让其能够结合数据库之外的上下文信息(例如电影是否被认为是“经典”)。

查询执行(Query Execution): 一旦查询被合成,它就会在数据库中高效执行。TAG 利用数据库的计算能力来处理大规模数据检索和精确计算,而这是语言模型难以直接执行的。

答案生成(Answer Generation): 在最后一步,AI 模型基于检索到的数据生成上下文的答案。通过增强步骤提供的语义推理能力,TAG 能够将上下文信息、通用知识以及特定领域的理解融入答案中,从而显著提升回答的准确性和自然性。例如,TAG 在答案生成过程中,利用大语言模型的多层次推理能力,对检索到的内容进行深度语义解析,并结合额外的上下文知识(如领域术语和用户查询背景)生成自然语言答案。

在上述示例中,TAG 系统可以总结返回的电影评论,生成答案如“泰坦尼克号的评论主要提到其出色的叙事和视觉效果”,而这种总结得益于语言模型对评论内容的多步推理与聚合分析能力。

下面让我们近距离解析,TAG 处理自然语言查询的三个步骤:

查询合成(Query Synthesis)

查询合成的核心是将用户的自然语言请求转化为数据库可以执行的查询 。这一过程包含两个关键任务:

推断相关数据:确定回答查询所需的数据,例如从数据库表的模式(schema)中推断出相关字段。

语义解析:利用语言模型的语义推理能力,将自然语言请求转化为可执行的查询(例如 SQL)。

当用户查询:“总结最高票房的经典浪漫电影的评论”,系统生成的 SQL 查询:结合了关系表字段(如 movie_title、review、revenue 和 genre),并利用语言模型过滤符合“经典”条件的记录。

查询执行(Query Execution)

查询执行步骤的核心是利用数据库引擎高效地执行生成的查询 ,并返回相关数据表 。此步骤可以通过支持 LM(语言模型) 操作的数据库 API 实现更复杂的计算和推理。在上述示例中,生成的 SQL 查询首先过滤出浪漫电影,并通过 LM 判断哪些电影属于“经典”范畴,接着按票房排名找到最高票房的电影,并返回与该电影相关的评论数据表 。

答案生成(Answer Generation)

答案生成步骤通过语言模型的语义推理能力,根据用户请求 和查询结果数据 生成最终的自然语言答案 。

TAG 系统对返回的 (例如“泰坦尼克号”的评论数据)进行语义分析,总结评论内容,并生成自然语言答案,例如“泰坦尼克号的评论大多是积极的,观众对其叙事和视觉效果赞誉有加”。

TAG 的研究方向

除了上面对多表查询方面的表现以外,TAG 模型在查询类型、数据模型、执行引擎以及生成模式等多个方面都展现了独特的优势和扩展可能性。

首先,TAG 在查询类型的多样性上表现出色。它不仅能够处理简单的点查询,比如用户希望快速检索单行或少量数据的任务,还能应对复杂的聚合查询。例如,一个零售经理可能需要总结过去一个月内的销售趋势,这需要 TAG 在数据库中整合多行数据并利用语言模型进行逻辑推理。此外,TAG 还能胜任情感分析和分类等需要语义推理的高级任务。

其次,TAG 的底层数据模型设计灵活,能够适配多种数据类型。传统的结构化数据,如关系型数据库中的表格信息,能够通过 TAG 得到高效处理。同时,TAG 还能处理半结构化和非结构化数据,比如自由文本、图像、视频和音频,这为多模态数据的集成提供了可能性。这种灵活性让 TAG 在多样化的数据场景中都有应用空间。

TAG 的数据库执行引擎支持多种实现方式,使其适用于不同的查询需求。对于结构化数据,TAG 通过 SQL 查询的生成和执行实现高效数据检索。对于语义检索场景,TAG 能够将自然语言查询转化为向量嵌入,并通过相似性匹配实现高效数据查找。此外,TAG 还可以集成新兴的增强型执行方法,比如语义操作符模型,它允许开发者在数据库中直接执行复杂的语义过滤和排序操作。

在生成模式方面,TAG 提供了从简单到复杂的多种实现选项。简单的生成模式如单次语言模型调用,适用于快速回答的任务。而复杂的生成模式则通过多步迭代或递归的方式实现更深层次的推理和数据整合。例如,对于需要在多行数据中发现隐含关系的任务,TAG 能够利用语言模型多次调用生成完整且语义丰富的答案。

TAG功能虽然强大,如果需要落地应用必须经过最佳实践,于是就有了 LOTUS。LOTUS 构建在 TAG 的理论基础之上,进一步优化了查询执行的效率,并提供了类似 Pandas 的直观 API,使开发者可以通过声明式的语义操作符快速实现复杂的数据查询任务。LOTUS 还通过模块化设计支持扩展,能够集成不同的数据源和多种 AI 模型,从而为复杂自然语言查询提供了更加高效的解决方案。

LOTUS:基于LLM的数据查询引擎

LOTUS 是一个结合了结构化和非结构化数据处理能力的查询引擎,它让基于大语言模型(LLM)的数据处理变得快速且简单。

基本介绍

LOTUS(LLMs Over Tables of Unstructured and Structured Data)提供了一种声明式编程模型和优化的查询引擎,可以针对结构化和非结构化数据构建强大的基于推理的查询管道。LOTUS 通过类似 Pandas 的简单直观 API 实现语义操作符,简化了开发人员编写 AI 驱动查询的复杂性。

基本概念

LOTUS 的核心是语义操作符(Semantic Operator)编程模型:

  • 语义操作符:对一个或多个数据集进行声明式转换,这些转换通过自然语言表达式参数化,并可由多种 AI 算法实现。
  • 扩展关系模型:语义操作符能够对包含传统结构化数据和非结构化字段(如自由文本)的表操作。
  • 模块化与组合性:操作符支持编写高级逻辑的 AI 管道,查询引擎负责高效执行。

LOTUS 支持的主要语义操作符包括:

  • sem_map:将每条记录映射为基于自然语言描述的属性。例如,可以将商品描述转换为更具体的类别标签,例如将“iPhone 13”映射为“智能手机”。
  • sem_filter:筛选符合自然语言谓词的记录。例如,筛选出所有“价格大于100元且评分高于4星”的商品,通过语言模型解析谓词条件进行精确筛选。
  • sem_agg:对所有记录进行聚合,例如总结出“所有商品的平均价格”和“评分最高的商品”。
  • sem_topk:根据自然语言指定的排序规则选出前K条记录。例如,“找出评分最高的前5个商品”。
  • sem_join:基于自然语言谓词连接两个数据集。例如,将订单数据与用户数据通过自然语言谓词“匹配下单金额大于500元的用户及其订单”进行跨表关联。
  • sem_sim_join:基于语义相似性连接两个数据集。例如,将一列文章标题与另一列新闻摘要通过内容相似度进行匹配。
  • sem_search:在文本列中执行语义搜索。例如,“在评论列中查找提到‘服务很好’的所有记录”。

支持模型

LOTUS 支持以下三种主要模型类别:

LM(语言模型):

基于 LiteLLM 库构建,支持所有 LiteLLM 支持的模型(如 OpenAI、Ollama 和 vLLM)。

可参考 LiteLLM 文档了解更多使用示例。

RM(检索模型):

使用 SentenceTransformers 提供的模型进行语义检索。

可通过 SentenceTransformersRM 类加载任意模型。

Reranker(重排序模型):

使用 SentenceTransformers 提供的 CrossEncoder 模型进行语义重排序。

安装指南

要安装 LOTUS,请按照以下步骤操作:

创建 Conda 环境:

conda create -n lotus python=3.10 -y
conda activate lotus

使用 pip 安装 LOTUS:

pip install lotus-ai

如果在 Mac 上运行,请通过 Conda 安装 FAISS:

仅 CPU 版本:

conda install -c pytorch faiss-cpu=1.8.0

GPU (+CPU) 版本:

conda install -c pytorch -c nvidia faiss-gpu=1.8.0

通过上述步骤,你即可快速搭建 LOTUS 环境,为后续的代码开发和测试做好准备。

LOTUS 的模块化设计使得它能够灵活支持各种应用场景,并为复杂自然语言查询提供了高效解决方案。

示例代码与解释

以下代码展示了 LOTUS 的一个简单用例,通过 sem_join 操作实现课程和技能的语义匹配。用户通过自然语言定义查询逻辑,LOTUS 结合语言模型执行查询,最终返回结果。

import pandas as pd
import lotus
from lotus.models import LM

# configure the LM, and remember to export your API key
lm = LM(model="gpt-4o-mini")
lotus.settings.configure(lm=lm)

# create dataframes with course names and skills
courses_data = {
    "Course Name": [
        "History of the Atlantic World",
        "Riemannian Geometry",
        "Operating Systems",
        "Food Science",
        "Compilers",
        "Intro to computer science",
    ]
}
skills_data = {"Skill": ["Math", "Computer Science"]}
courses_df = pd.DataFrame(courses_data)
skills_df = pd.DataFrame(skills_data)

# lotus sem join 
res = courses_df.sem_join(skills_df, "Taking {Course Name} will help me learn {Skill}")
print(res)

# Print total LM usage
lm.print_total_usage()

我们将上述代码代码进行详细拆解如下:

初始化环境和数据:

import pandas as pd

courses_data = {
    "Course Name": [
        "History of the Atlantic World",
        "Riemannian Geometry",
        "Operating Systems",
        "Food Science",
        "Compilers",
        "Intro to computer science",
    ]
}
skills_data = {"Skill": ["Math", "Computer Science"]}

courses_df = pd.DataFrame(courses_data)
skills_df = pd.DataFrame(skills_data)
print("Courses DataFrame:")
print(courses_df)
print("\nSkills DataFrame:")
print(skills_df)

配置 gpt-4o-mini 作为语言模型。创建两个数据框 courses_df 和 skills_df,分别包含课程名称和技能。courses_df 包含课程名称,这些课程可能涉及到多个领域。skills_df 列出了技能名称,这些技能对应课程的学习目标。数据框为后续的语义连接操作提供了清晰的输入。两个集合的对象"Course Name"和"Skill" 会在后面的代码中进行语义关联。

语义连接操作:

from lotus.models import LM
import lotus

# 配置语言模型
lm = LM(model="gpt-4o-mini")
lotus.settings.configure(lm=lm)

# 语义连接
res = courses_df.sem_join(skills_df, "Taking {Course Name} will help me learn {Skill}")
print("\nResult of Semantic Join:")
print(res)

sem_join 操作基于自然语言模板,通过语言模型解析 Course Name 和 Skill 之间的语义关系。这里通过”{}” 包括两个数据集中的对象,用来表示需要处理具体对象的语义关系。想判断课程(Course Name)与技能(Skill)之间的关系,“History of the Atlantic World” 是否与“Math”匹配由语言模型判断。

执行上述代码得到如下结果:

清楚地看到课程(Course Name)与技能(Skill)之间的关系。Sem_join是LOTUS众多操作之中的一种,它的功能就是将两个不同数据集的数据进行关联。通过执行过程我们发现它也遵循TAG的三个步骤:

查询合成(Query Synthesis):

自然语言模板定义了匹配逻辑(如 "Taking {Course Name} will help me learn {Skill}")。

查询执行(Query Execution):

LOTUS 的 sem_join 调用语言模型完成语义匹配,并返回匹配结果。

答案生成(Answer Generation):

匹配结果以 Pandas 数据框形式返回,便于进一步分析和使用。

深入源代码

由于好奇sem_join 功能是如何实现的,我们通过Github查看了对应的源码。

通过分析,sem_join 的功能主要通过以下五个步骤实现,每个步骤对应不同的核心函数和逻辑。

第一步:输入数据的准备与转换

首先,sem_join 接收两个输入数据序列(l1 和 l2),并将它们转换为多模态信息,为后续的语义处理提供基础。

代码中使用了 task_instructions.df2multimodal_info 函数,将输入的 Pandas Series 转换为模型可处理的格式:

left_multimodal_data = task_instructions.df2multimodal_info(l1.to_frame(col1_label), [col1_label])
right_multimodal_data = task_instructions.df2multimodal_info(l2.to_frame(col2_label), [col2_label])

这一步的主要作用是将数据框的列名与具体的上下文绑定,为语言模型生成语义匹配提供丰富的背景信息。

第二步:构造语义连接任务

通过自然语言模板描述连接逻辑,例如 "Taking {Course Name} will help me learn {Skill}",并将其传递给语言模型进行解析和处理。

在代码中,模板被注入到语义过滤器中,通过调用

task_instructions.merge_multimodal_info 函数合并多模态数据:
modified_docs = task_instructions.merge_multimodal_info([i1], right_multimodal_data)

合并后的数据被传递给语言模型,用于执行语义匹配任务。

第三步:语义过滤与模型推理

语义过滤是 sem_join 的核心部分。通过调用 sem_filter 函数,sem_join 利用语言模型对数据对进行语义推理,判断哪些记录匹配。

语义过滤的核心代码如下:

output = sem_filter(
    modified_docs,
    model,
    user_instruction,
    examples_multimodal_data=examples_multimodal_data,
    examples_answers=examples_answers,
    cot_reasoning=cot_reasoning,
    default=default,
    strategy=strategy,
    show_progress_bar=False,
)

模型的输出包括匹配结果、原始输出和解释信息,为最终的连接结果提供依据。

第四步:结果组合与优化

在语义过滤的基础上,sem_join 将所有匹配记录整合为一个结果集合。对于高置信度和低置信度的匹配记录,系统通过优化策略减少模型调用次数,提升运行效率。

结果组合部分的代码如下:

join_results.extend(
    [
        (id1, ids2[i], explanation)
        for i, (output, explanation) in enumerate(zip(outputs, explanations))
        if output
    ]
)

优化逻辑通过函数 join_optimizer 实现,选择成本最低的连接计划,进一步提升连接效率。

第五步:输出结果与分析

最后,sem_join 将语义连接的结果封装为 SemanticJoinOutput 对象,包含匹配记录、过滤结果、模型原始输出和解释信息。用户可以通过返回的数据框进一步分析连接结果。

返回结果的代码如下:

return SemanticJoinOutput(
    join_results=join_results,
    filter_outputs=filter_outputs,
    all_raw_outputs=all_raw_outputs,
    all_explanations=all_explanations,
)

总结

TAG 模型的出现填补了传统数据查询技术与现代语义推理需求之间的空白。通过结合 SQL 查询和大语言模型,TAG 在复杂查询、推理和结果生成方面展现了强大的能力。本文不仅分析了 TAG 的理论基础,还通过 LOTUS 系统的实例演示了其实际应用潜力。LOTUS 的模块化设计和直观 API 为开发者实现复杂语义查询提供了便利工具,表明 TAG 和 LOTUS 在多数据源、跨领域数据分析中的重要地位和广阔前景。

作者介绍

崔皓,51CTO社区编辑,资深架构师,拥有18年的软件开发和架构经验,10年分布式架构经验。

责任编辑:姜华 来源: 51CTO内容精选
相关推荐

2024-01-11 17:06:20

2022-01-10 21:53:53

通信5G行业

2023-09-14 20:49:57

光通信光纤

2012-12-28 18:09:21

2021-12-09 13:45:28

云计算云计算环境SaaS

2024-12-31 15:03:57

2024-03-11 15:17:53

2021-01-05 05:20:12

通信行业

2023-02-02 21:40:50

2019-01-04 12:37:46

SD-WAN网络架构软件定义网络

2017-12-25 13:55:21

JavaJava 9甲骨文

2023-08-14 08:34:14

GolangHttp

2024-12-10 15:39:44

2020-07-14 08:45:13

Flink特性jira

2019-01-04 12:51:04

物联网IoT趋势预测

2025-01-06 10:43:31

2023-07-31 14:01:25

数据中心SDN

2023-03-16 17:28:59

技术AI

2021-02-16 23:50:01

投资加密货币基金

2021-03-25 10:30:40

云计算IT行业Comp
点赞
收藏

51CTO技术栈公众号