在今天的许多不同企业系统中生成了大量数据,通常很难在这些系统之间提问。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搜索功能,比如说你想创建一个聊天机器人,用来回答关于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 新闻。
共同学习,写下你的评论
评论加载中...
作者其他优质文章