为了账号安全,请及时绑定邮箱和手机立即绑定

用Snowflake Cortex Search提升搜索效果

彻底提高搜索能力的实用指南:实际案例

在今天的许多不同企业系统中生成了大量数据,通常很难在这些系统之间提问。Snowflake Cortex Search 专为非结构化文本数据的模糊搜索而设计。它在增强检索生成的管道优化方面表现更佳,特别是在由生成式 AI 驱动的聊天机器人里。我将通过一个实际案例来介绍 Cortex Search 的功能。

Snowflake 搜索查询?

Cortex Search 是一款用于管理和查询大量非结构化文本数据的工具。它结合了关键词和向量搜索,采用了混合搜索的方法,不同于依赖精确匹配的常规搜索引擎。因此,即使匹配不完全准确,它也能找到与用户查询相关的文档。文档搜索的基础在于,即使存在一些细微变化,如拼写错误或相关短语,也能找到相关结果。这样即使文档有轻微改动,如拼写错误或相关短语的变化,依然能找到相关的文档。

在使用Cortex搜索时,不需要精确的关键词匹配。还可以进行近似匹配,这样你可以根据同义词、拼写错误或意思相近的词获取结果。比如,当你输入“Snowflake”时,搜索引擎会为你提供类似的短语,比如“冬天”的结果,甚至还会显示拼写错误,比如“snowflaking”的结果。

Cortex Search 结合了两种搜索方法:关键词搜索,类似于标准全文搜索,以及向量搜索,它通过评估术语的语义相似程度来进行。这种结合方法增强搜索体验,既保证准确性也注重语义匹配。

构建RAG管道时,作为上下文提供者,Cortex Search是RAG(检索增强生成)管道不可或缺的一部分。Cortex Search帮助LLM(大型语言模型)在基于RAG的聊天机器人中找到回应用户查询的最佳文档。因为聊天机器人需要上下文来提供有意义和准确的答案,这对于GenAI应用来说非常重要。需要澄清的是:Cortex Search只是一个搜索引擎,而不是聊天机器人。

虽然皮层分析员更侧重于结构化数据,比如表格和视图。而皮层搜索则专注于非结构化文本和数据,例如电子邮件、文档等。不论是存放在 Snowflake 表中的文档,还是上传的 PDF 文件,皮层搜索都能自动进行索引处理。皮层搜索会自动更新索引,以确保搜索结果始终反映最新的信息。

RAG聊天机器人的应用场景主要体现在Snowflake客户在这些场景中使用Cortex Search进行测试最多的地方。这种对话式AI正是Cortex Search真正出彩的地方。为了让聊天机器人能够智能地回答问题,它会从索引过的文献中找到相关信息,并将其作为上下文提供给LLM。这在金融服务和生命科学等行业中特别有用,无论是查阅人力资源政策、回答客户支持问题,还是进行研究。相比之下,Cortex Search的能力不仅限于聊天机器人,还涵盖了更传统的搜索需求。想象一下这样的场景:客户需要在产品目录、公司目录或联系人搜索引擎中搜索海量文本。

组织可以利用Cortex搜索来进行内部知识库管理,通过创建提高生产力的解决方案来帮助员工在海量内部内容中浏览。比如,你可以搜索学术文章、GitHub拉取请求或HR政策,而无需记住具体的关键词。

创建一个服务超级简单,可以通过SnowSight或者SQL命令完成。

创建或替换 CORTEX 搜索服务 [如果不存在] <name>  
在 <search_column> 列上  
属性: <col_name> [ , ... ]  
仓库:<warehouse_name>  
目标延迟:'<num> {秒 | 分钟 | 小时 | 天}'  
注释:'<comment>'  
查询: <query>;
流程?

因为它将关键词和向量搜索技术结合得如此好,Cortex Search 超级强大。

  • 每当用户在Cortex Search中输入查询时,查询会被立即使用嵌入模型(如Arctic embed)嵌入到向量空间里。通过将查询与索引中的嵌入文档进行比较,引擎能够执行语义搜索。同时,Cortex Search还会运行常规的关键字搜索,试图找到与查询的词汇精确或相近匹配的文档。
  • 在Cortex Search整合向量和关键字搜索的结果后,结果将根据相关性重新排名。结果是,根据上下文,最相关的文档将优先显示。
  • 一旦您的数据被索引,Cortex Search将负责索引的增量更新。每当向表中添加新行时,Cortex Search都会确保搜索自动反映最新的信息。
Cortex搜索示例

为了展示Cortex搜索功能,比如说你想创建一个聊天机器人,用来回答关于Infostrux Solutions的人力资源手册和Confluence上条目的问题。

  • 第一步:将 PDF 文件手动上传到 Snowflake stage!

  • 步骤 2:在将 PDF 导入 Snowflake 后,您可以使用 Python UDF 或预览功能中的 PDF 解析,并将结果保存到数据表中。
---------------------------------------------------------
-- 创建一个预处理函数,用于执行以下操作:
-- 解析PDF文件并提取文本。
-- 将文本切分成较小的片段以进行索引。
---------------------------------------------------------

CREATE OR REPLACE FUNCTION pdf_text_chunker_cortex(file_url STRING)
    RETURNS TABLE (chunk VARCHAR)
    LANGUAGE PYTHON
    RUNTIME_VERSION = '3.9'
    HANDLER = 'pdf_text_chunker'
    PACKAGES = ('snowflake-snowpark-python', 'PyPDF2', 'langchain')
    AS
$
from snowflake.snowpark.types import StringType, StructField, StructType
from langchain.text_splitter import RecursiveCharacterTextSplitter
from snowflake.snowpark.files import SnowflakeFile
import PyPDF2, io
import logging
import pandas as pd

class pdf_text_chunker:

    def read_pdf(self, file_url: str) -> str:
        logger = logging.getLogger("udf_logger")
        logger.info(f"正在打开文件 {file_url}")

        with SnowflakeFile.open(file_url, 'rb') as f:
            buffer = io.BytesIO(f.readall())

        reader = PyPDF2.PdfReader(buffer)
        text = ""
        for page in reader.pages:
            try:
                text += page.extract_text().replace('\n', ' ').replace('\0', ' ')
            except:
                text = "无法提取内容"
                logger.warn(f"从文件 {file_url} 的页面 {page} 提取内容失败")

        return text

    def process(self, file_url: str):
        text = self.read_pdf(file_url)

        text_splitter = RecursiveCharacterTextSplitter(
            chunk_size = 2000,  # 根据需要调整此值(例如,2000)
            chunk_overlap = 300,  # 重叠以保持片段的上下文
            length_function = len
        )

        chunks = text_splitter.split_text(text)
        df = pd.DataFrame(chunks, columns=['chunk'])

        yield from df.itertuples(index=False, name=None)
$;

-------------------------------------------------------------------
-- 接下来,创建一个表来存储从PDF文件中解析出的数据。
-------------------------------------------------------------------

CREATE OR REPLACE TABLE docs_chunks_table_cortex AS
    SELECT
        relative_path,
        build_scoped_file_url(@docs_stage, relative_path) AS file_url,
        -- 通过将relative_path与片段连接,保留文件标题信息
        CONCAT(relative_path, ': ', func.chunk) AS chunk,
        'English' AS language
    FROM
        directory(@docs_stage),
        TABLE(pdf_text_chunker_cortex(build_scoped_file_url(@docs_stage, relative_path))) AS func;
  • 步骤 3:使用 Cortex Search 服务来构建解析文本的索引,以准备查询,以便进行查询。
    -------------------------
    -- 创建名为 lab_cortex 的 CORTEX 搜索服务
    -------------------------

    设置 warehouse = CURRENT_WAREHOUSE();

    创建或替换名为 lab_cortex 的 CORTEX 搜索服务
        针对 chunk
        属性 language
        仓库 = $warehouse
        目标滞后为 1 小时
        AS (
        SELECT
            chunk,
            relative_path,
            file_url,
            language
        FROM docs_chunks_table_cortex
        )。 -- 从 docs_chunks_table_cortex 表中选择相关列

我开启了上下文,使其以我的文件为背景,并问了是否可以给客户赠送价值5000美元(USD)的礼物。

Cortex Search 在基本的聊天机器人(chatbot)配置下,会根据用户查询提取文档的相关内容。现在我们试着问相同的问题,但没有我的文档作为背景来回答。

举个例子来说,比如说,我上传了我的假期记录文件,“奥古斯托·罗萨还剩下多少天假期?”

我能把我的工作笔记本借给朋友吗?

现在用户可以更轻松地通过这个简单的过程搜索大量非结构化数据,而不再需要翻阅无数的文件。

结论部分

企业可以利用Cortex Search的可扩展性,将其部署到30多个Snowflake区域。Cortex Search的快速且极其准确的向量关键词查找是其与Python和REST API等特性的集成结果。因为Cortex Search设计得可以无缝地整合到Snowflake的数据平台中,企业可以利用现有的数据管道和工具。这是一个简单的实施方式,可以满足许多内部需求。

Cortex Search 提供了一种新颖而强大的方法,用于查询 Snowflake 的未结构化文本数据。得益于 Cortex Search 的混合搜索功能,您可以自信地设计下一代聊天机器人或传统搜索引擎,确保用户获得最佳和最相关的搜索结果。由于其自动索引和与 RAG 管道的交互,任何 Snowflake 生态系统中的 AI 应用程序都离不开它。企业可以通过使用 Cortex Search 来挖掘未结构化数据并获得洞察,从而构建更好和更快速响应的 AI 应用程序。

我的名字是奥古斯托·罗萨,我是Infostrux Solutions的工程副总裁。我也非常荣幸成为2024年的Snowflake Data Super Hero,和Snowflake技术专家。

感谢你读这篇博客。你可以在LinkedIn关注我。

关注 Infostrux Medium 博客 https://medium.com/infostruxolutions 以获取最有趣的数据工程技术和 Snowflake 新闻。

(Note: There seems to be a typo in the URL in the expert suggestion, it mentions "infostruxolutions" instead of "infostrux-solutions". Since the original source text has a hyphen, I've kept it consistent here.)

Corrected version:
关注 Infostrux Medium 博客 https://medium.com/infostrux-solutions 获取最有趣的数据工程技术与 Snowflake 新闻。

参考来源:
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消