面向商业应用的多模式人工智能搜索

2024-11-01 13:05:55 英文原文

作者:Umair Ali Khan

使企业能够从数据中提取真正的价值

Umair Ali Khan

Towards Data Science

商业文档,例如复杂的报告、产品目录、设计文件、财务报表、技术手册和市场分析报告,通常包含多模式数据(文本以及视觉内容,例如图表、图表、地图、照片、信息图表、图表、和蓝图等)。从这些文档中查找正确的信息需要针对客户或公司员工提出的给定查询对文本和相关图像进行语义搜索。例如,可以通过标题、文字描述和图像来描述公司的产品。同样,项目提案可能包括文本、说明预算分配的图表、显示地理覆盖范围的地图以及过去项目的照片的组合。

准确、快速的多模态信息搜索对于提高企业生产力具有重要意义。业务数据通常以文本和图像格式分布在各种来源,这使得有效检索所有相关信息变得困难。虽然生成式人工智能方法,特别是那些利用法学硕士来增强商业知识管理的方法(例如,检索增强生成,图 RAG等),在访问多模式、分散数据方面面临限制。统一不同数据类型的方法允许用户通过自然语言提示查询不同的格式。此功能可以使公司内的员工和管理层受益,并改善客户体验。它可以有多个用例,例如聚类相似主题并发现主题趋势、构建推荐引擎、让客户参与更相关的内容、更快地访问信息以改进决策、提供特定于用户的搜索结果、增强用户交互以感受更加直观和自然,并减少查找信息的时间等等。

在现代人工智能模型中,数据被处理为称为嵌入的数值向量。专门的人工智能模型,称为嵌入模型,将数据转换为数字表示,可用于有效捕获和比较含义或特征的相似性。嵌入对于语义搜索和知识图谱非常有用,并且是当今复杂的法学硕士的基础支柱。

本文探讨了嵌入模型(特别是稍后介绍的多模态嵌入模型)在增强业务应用程序中跨多种数据类型的语义搜索方面的潜力。本文首先向不熟悉嵌入在人工智能中如何工作的读者解释嵌入的概念。然后讨论多模态嵌入的概念,解释如何将多种格式的数据组合成统一的嵌入,以捕获跨模态关系,并且对于业务相关的信息搜索任务非常有用。最后,本文探讨了最近引入的用于业务应用程序语义搜索的多模态嵌入模型。

理解嵌入空间和语义搜索

嵌入存储在向量空间中,其中相似的概念彼此靠近。将嵌入空间想象成一个图书馆,相关主题的书籍被放在一起。例如,在嵌入空间中,“desk”和“chair”等单词的嵌入会彼此靠近,而“airplane”和“baseball”则会相距较远。这种空间排列使模型能够有效地识别和检索相关项目,并增强推荐、搜索和聚类等多项任务。

为了演示如何计算和可视化嵌入,让我们创建一些不同概念的类别。完整的代码可以在GitHub

类别={
"水果": ["苹果"、"香蕉"、"橙子"、"葡萄"、"芒果"、"桃子"、"菠萝"],
"动物": ["狗", "猫", "大象", "老虎", "狮子", "猴子", "兔子"],
“国家”:[“加拿大”、“法国”、“印度”、“日本”、“巴西”、“德国”、“澳大利亚”],
"体育": ["足球"、"篮球"、"网球"、"棒球"、"板球"、"游泳"、"跑步"],
“音乐流派”:[“摇滚”、“爵士”、“古典”、“嘻哈”、“流行”、“蓝调”],
"职业": ["医生"、"工程师"、"教师"、"艺术家"、"厨师"、"律师"、"飞行员"],
"车辆": ["汽车"、"自行车"、"摩托车"、"飞机"、"火车"、"船"、"公共汽车"],
“家具”:[“椅子”,“桌子”,“沙发”,“床”,“书桌”,“书架”,“柜子”],
"情绪": ["快乐", "悲伤", "愤怒", "恐惧", "惊讶", "厌恶", "平静"],
“天气”:[“飓风”、“龙卷风”、“暴风雪”、“热浪”、“雷暴”、“雾”]、
“烹饪”:[“烤”、“煮”、“煎”、“烘烤”、“蒸”、“烤”、“水煮”]

}

我现在将使用嵌入模型(Cohere™s嵌入英语-v3.0模型(这是本文的重点,将在本示例之后详细讨论)来计算这些概念的嵌入,如以下代码片段所示。需要安装以下库才能运行此代码。

!pip 安装 cohere umap-learn seaborn matplotlib numpy pandas 正则表达式 altair scikit-learn ipython faiss-cpu

该代码计算上述概念的文本嵌入并将它们存储在数值模拟大批。

导入一致性
导入umap
将seaborn导入为sns
将 matplotlib.pyplot 导入为 plt
将 numpy 导入为 np
将 pandas 导入为 pd

# 初始化 Cohere 客户端
co = cohere.Client(api_key=os.getenv("COHERE_API_KEY_2"))
# 扁平化类别和概念
标签=[]
概念=[]
对于类别,categories.items() 中的项目:
labels.extend([类别] * len(项目))
概念.扩展(项目)

# 使用正确的 input_type 为所有概念生成文本嵌入
嵌入 = co.embed(
文本=概念,
模型=“嵌入英语-v3.0”,
input_type="search_document" # 更正的文本输入类型
).嵌入

# 转换为 NumPy 数组
嵌入 = np.array(嵌入)

嵌入可能有数百或数千个无法直接可视化的维度。因此,我们降低了嵌入的维数,使高维数据可以直观地解释。计算嵌入后,以下代码使用 UMAP 将嵌入映射到二维空间(均匀流形逼近和投影)降维方法,以便我们可以绘制和分析相似概念如何聚集在一起。

# 使用 UMAP 降维
减速器 = umap.UMAP(n_neighbors=20, random_state=42)
reduce_embeddings=reducer.fit_transform(embeddings)

# 创建数据框用于可视化
df = pd.DataFrame({
“x”:减少的嵌入[:,0],
“y”:减少的嵌入[:,1],
“类别”:标签,
“概念”:概念
})

# 使用 Seaborn 绘图
plt.figure(figsize=(12, 8))
sns.scatterplot(数据= df,x =“x”,y =“y”,色调=“类别”,样式=“类别”,调色板=“Set2”,s=100)

# 为每个点添加标签
对于范围内的 i(df.shape[0]):
plt.text(df["x"][i] + 0.02, df["y"][i] + 0.02, df["Concept"][i], fontsize=9)

plt.legend(loc="右下")
plt.title(“按类别嵌入的可视化”)
plt.xlabel("UMAP 维度 1")
plt.ylabel("UMAP 维度 2")
plt.savefig("C:/Users/h02317/Downloads/embeddings.png",dpi=600)

plt.show()

这是这些概念在 2D 空间中嵌入的可视化。

嵌入空间中不同概念嵌入的可视化(图片由作者创建)

语义相似的项目在嵌入空间中分组,而具有遥远含义的概念则距离较远(例如,国家与其他类别的聚类距离较远)。

为了说明搜索查询如何映射到该空间内的匹配概念,我们首先将嵌入存储在向量数据库(FAISS向量存储)中。接下来,我们以相同的方式计算查询的嵌入,并在嵌入空间中识别一个“邻域”,其中嵌入与查询的语义紧密匹配。这种接近度是使用查询嵌入与向量数据库中存储的嵌入之间的欧几里得距离或余弦相似度来计算的。

导入一致性
将 numpy 导入为 np
进口再
将 pandas 导入为 pd
从 tqdm 导入 tqdm
从数据集导入load_dataset
导入umap
导入 Altair 作为 alt
从 sklearn.metrics.pairwise 导入 cosine_similarity
进口警告
从 IPython.display 导入显示、Markdown
进口费斯
将 numpy 导入为 np
将 pandas 导入为 pd
从 sklearn.preprocessing 导入标准化
warnings.filterwarnings('忽略')
pd.set_option('display.max_colwidth', None)

# 标准化嵌入(可选,但建议用于余弦相似度)
嵌入 = 归一化(np.array(嵌入))

# 创建FAISS索引
维度 = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension) # L2距离,可以使用IndexFlatIP进行内积(余弦相似度)
index.add(embeddings) # 将嵌入添加到 FAISS 索引

# 嵌入查询
query =“哪个是欧洲最大的国家?”
query_embedding = co.embed(texts=[query], model="embed-english-v3.0", input_type="search_document").embeddings[0]
query_embedding = normalize(np.array([query_embedding])) # 规范化查询嵌入

# 搜索最近邻居
k = 5 # 最近邻居的数量
距离,索引 = index.search(query_embedding, k)

# 格式化并显示结果
结果 = pd.DataFrame({
'texts': [concepts[i] for i in indices[0]],
“距离”:距离[0]
})
显示(Markdown(f“查询:{query}”))
# 将DataFrame转换为markdown格式
def print_markdown_results(df):
markdown_text = f“最近邻居:\n\n”
markdown_text += "| 文本 | 距离 |\n"
markdown_text += "|--------|----------|\n"
对于 _,df.iterrows() 中的行:
markdown_text += f"| {row['texts']} | {row['distance']:.4f} |\n"
显示(Markdown(markdown_text))

# 以markdown形式显示结果
print_markdown_results(结果)

以下是与查询最接近的前 5 个匹配项,按照与查询嵌入存储概念之间的最小距离进行排名。

表示查询与概念相似度的前 5 个最小距离(作者提供的图片)

如图所示,France 是给定概念中此查询的正确匹配项。在可视化嵌入空间中,查询的位置属于“国家/地区”组。

语义搜索的整个流程如下图所示。

使用文本嵌入进行语义搜索的描述(作者提供的图片)

多模态嵌入

文本嵌入已成功用于语义搜索和检索增强生成(RAG)。为此目的使用了几种嵌入模型,例如OpenAI 的,谷歌,连贯,以及其他。同样,几个开源模型也可以在抱脸平台如全MiniLM-L6-v2。虽然这些模型对于文本到文本的语义搜索非常有用,但它们无法处理图像数据,而图像数据是商业文档中的重要信息源。此外,企业通常需要在没有适当元数据的情况下从文档或庞大的图像存储库中快速搜索相关图像。

一些多模态嵌入模型部分解决了这个问题,例如OpenAI 的 CLIP,它连接文本和图像,可用于识别图像中的各种视觉概念并将其与其名称相关联。然而,它的文本输入能力非常有限,并且对于纯文本甚至文本到图像检索任务表现出较低的性能。

文本和图像嵌入模型的组合也用于将文本和图像数据聚类到单独的空间中;然而,它会导致偏向于纯文本数据的弱搜索结果。在多模态 RAG 中,文本嵌入模型和多模态 LLM 的组合用于从文本和图像中进行回答。有关开发多模式 RAG 的详细信息,请阅读我的以下文章。

多模态嵌入模型应该能够在单个数据库中包含图像和文本数据,与维护两个单独的数据库相比,这将降低复杂性。通过这种方式,模型将优先考虑数据背后的含义,而不是偏向于特定的模态。

在共享嵌入空间中存储文本和图像嵌入的多模态嵌入模型(图片由作者提供)

通过将所有模态存储在单个嵌入空间中,该模型将能够将文本与相关图像连接起来,并检索和比较不同格式的信息。这种统一的方法增强了搜索相关性,并允许更直观地探索共享嵌入空间内的互连信息。

探索业务用例的多模式嵌入模型

Cohere最近推出多模态嵌入模型,嵌入3,它可以从文本和图像生成嵌入并将它们存储在统一的嵌入空间中。根据 Cohere 的博客,该模型在各种多模式任务(例如零样本、文本到图像、图形和图表、电子商务目录和设计文件等)中显示出令人印象深刻的性能。

在本文中,我将探讨 Cohere 的多模态嵌入模型,该模型适用于客户从在线产品目录中搜索产品的业务场景中的文本到图像、文本到文本和图像到图像检索任务使用文本查询或图像。在在线产品目录中使用文本到图像、文本到文本和图像到图像检索为企业和客户带来了多种优势。这种方法允许客户通过键入查询或上传图像以灵活的方式搜索产品。例如,看到自己喜欢的商品的客户可以上传照片,模型将从目录中检索视觉上相似的产品以及有关该产品的所有详细信息。同样,客户可以通过描述特定产品的特征而不是使用确切的产品名称来搜索特定产品。

该用例涉及以下步骤。

  1. 演示如何使用以下方法从产品目录中解析多模式数据(文本和图像)骆驼解析
  2. 使用 Cohere 的多模态模型创建多模态索引嵌入英语-v3.0。创建多模式检索器并针对给定查询测试它。
  3. 使用提示模板创建多模态查询引擎,以查询多模态向量数据库以执行文本到文本和文本到图像任务(组合)
  4. 从矢量数据库中检索相关图像和文本并将其发送给法学硕士以生成最终响应。
  5. 测试图像到图像检索任务。
  6. 我使用 OpenAI 的 DALL-E 图像生成器生成了一家虚构公司的示例家具目录。

该目录包含 4 个类别,总共 36 张产品图片及描述。这是产品目录第一页的快照。

合成产品目录首页(作者供图)

完整的代码和示例数据可在GitHub。让我们逐步讨论一下。

Cohere 的嵌入模型按以下方式使用。

model_name =“嵌入英语-v3.0”
api_key =“COHERE_API_KEY”
input_type_embed = "search_document" #对于图像嵌入,input_type_embed = "image"
# 创建一个一致的客户端。
co = cohere.Client(api_key)
text = ['苹果','椅子','芒果']
嵌入 = co.embed(texts=list(text),
模型=模型名称,
input_type=input_type_embed).embeddings

该模型可以使用 Cohere 的试用 API 密钥进行测试,方法是在其上创建免费帐户网站

为了演示如何提取多模态数据,我使用了骆驼解析从目录中提取产品图像和文本。这个过程在我的中有详细介绍上一篇文章骆驼解析可以通过创建一个帐户来使用骆驼云网站获取 API 密钥。免费的 API 密钥允许每天 1000 页的信用额度。

需要安装以下库才能运行本文中的代码。

!pip 安装 Nest-asyncio python-dotenv llama-parse qdrant-client

以下代码从环境文件 (.环境)。OpenAI 的多模式法学硕士,GPT-4o,用于生成最终响应。

导入操作系统
导入时间
导入nest_asyncio
从输入导入列表
从 dotenv 导入 load_dotenv

从 llama_parse 导入 LlamaParse
从 llama_index.core.schema 导入 ImageDocument、TextNode
从 llama_index.embeddings.cohere 导入 CohereEmbedding
从 llama_index.multi_modal_llms.openai 导入 OpenAIMultiModal
从 llama_index.core 导入设置
从 llama_index.core.indices 导入 MultiModalVectorStoreIndex
从 llama_index.vector_stores.qdrant 导入 QdrantVectorStore
从 llama_index.core 导入 StorageContext
导入qdrant_client
从 llama_index.core 导入 SimpleDirectoryReader
# 加载环境变量
加载_dotenv()
Nest_asyncio.apply()

# 设置 API 密钥
COHERE_API_KEY = os.getenv("COHERE_API_KEY")
LLAMA_CLOUD_API_KEY = os.getenv("LLAMA_CLOUD_API_KEY")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

以下代码使用以下命令从目录中提取文本和图像节点骆驼解析。提取的文本和图像保存到指定路径。

# 提取文本节点
def get_text_nodes(json_list: List[dict]) -> List[TextNode]:
返回 json_list 中页面的 [TextNode(text=page["text"],metadata={"page": page["page"]})

# 提取图像节点
def get_image_nodes(json_objs: List[dict], download_path: str) -> List[ImageDocument]:
image_dicts = parser.get_images(json_objs, download_path=download_path)
返回 [ImageDocument(image_path=image_dict["path"]) for image_dict in image_dicts]

# 将文本节点中的文本保存到文件中
def save_texts_to_file(text_nodes, file_path):
texts = [text_nodes 中节点的node.text]
all_text = "\n\n".join(文本)
打开(file_path,“w”,encoding =“utf-8”)作为文件:
文件.write(all_text)

# 定义文件路径
FILE_NAME =“家具.docx”
IMAGES_DOWNLOAD_PATH = "解析数据"

# 初始化 LlamaParse 解析器
解析器 = LlamaParse(
api_key=LLAMA_CLOUD_API_KEY,
result_type =“降价”,

# 解析文档并提取JSON数据
json_objs = parser.get_json_result(FILE_NAME)
json_list = json_objs[0]["页面"]

#获取文本节点
text_nodes = get_text_nodes(json_list)

#提取图片到指定路径
image_documents = get_image_nodes(json_objs, IMAGES_DOWNLOAD_PATH)

# 将提取的文本保存到.txt 文件中
file_path =“parsed_data/extracted_texts.txt”
save_texts_to_file(文本节点,文件路径)

这是显示其中一个节点的提取文本和元数据的快照。

LlamaParse 提取的文本节点(作者提供的图片)

我将文本数据保存到 .TXT文件。这是 中的文字内容。TXT文件看起来像。

.txt 文件中存储的文本快照(作者提供的图片)

这是文件夹中已解析数据的结构

提取的产品图像及其文字描述

请注意,文字描述与其各自的图像无关。目的是证明嵌入模型可以检索文本以及相关图像来响应查询,因为共享嵌入空间中文本和相关图像彼此靠近存储。

Cohere 的试用 API 允许有限的 API 速率(每分钟 5 次 API 调用)。为了嵌入目录中的所有图像,我创建了以下自定义类,以将提取的图像发送到嵌入模型,并有一定的延迟(30秒,也可以测试更小的延迟)。

延迟=30
# 定义自定义嵌入类,每次嵌入后具有固定延迟
类 DelayCohereEmbedding(CohereEmbedding):
def get_image_embedding_batch(self, img_file_paths, show_progress=False):
嵌入 = []
对于 img_file_paths 中的 img_file_path:
嵌入 = self.get_image_embedding(img_file_path)
embeddings.append(嵌入)
print(f"休眠 {delay} 秒")
time.sleep(tsec) # 每次嵌入后添加固定的 12 秒延迟
返回嵌入

# 在设置中设置自定义嵌入模型
Settings.embed_model = DelayCohereEmbedding(
api_key=COHERE_API_KEY,
model_name="embed-english-v3.0"

以下代码从目录加载已解析的文档并创建一个多模式奎德兰特矢量数据库和索引(采用自LlamaIndex 实施)。

# 从目录加载文档
文档 = SimpleDirectoryReader("parsed_data",
required_exts=[".jpg", ".png", ".txt"],
except_hidden=False).load_data()

# 设置 Qdrant 矢量存储
客户端 = qdrant_client.QdrantClient(path="furniture_db")
text_store = QdrantVectorStore(客户端=客户端,collection_name =“text_collection”)
image_store = QdrantVectorStore(客户端=客户端,collection_name =“image_collection”)
storage_context = StorageContext.from_defaults(vector_store=text_store, image_store=image_store)

# 创建多模态向量索引
索引 = MultiModalVectorStoreIndex.from_documents(
文件,
存储上下文=存储上下文,
image_embed_model=设置.embed_model,

最后,创建多模态检索器以从多模态向量数据库中检索匹配的文本和图像节点。检索到的文本节点和图像的数量由下式定义相似度top_k图像相似度top_k

retrieve_engine = index.as_retriever(similarity_top_k=4, image_similarity_top_k=4)

让我们测试查询的检索器 –给我找一把带金属支架的椅子—。辅助函数显示图像绘制检索到的图像。

###测试猎犬
从 llama_index.core.response.notebook_utils 导入 display_source_node
从 llama_index.core.schema 导入 ImageNode
将 matplotlib.pyplot 导入为 plt
从 PIL 导入图像

def display_images(file_list, grid_rows=2, grid_cols=3, limit=9):
”“”
显示网格中文件路径列表中的图像。
参数:
- file_list:图像文件路径列表。
- grid_rows:网格中的行数。
- grid_cols:网格中的列数。
- 限制:显示的最大图像数。
”“”
plt.figure(figsize=(16, 9))
计数 = 0

对于 idx,enumerate(file_list) 中的 file_path:
如果 os.path.isfile(file_path) 且 count < limit:
img = Image.open(文件路径)
plt.subplot(grid_rows, grid_cols, count + 1)
plt.imshow(img)
plt.axis('关闭')
计数 += 1

plt.tight_layout()
plt.show()

query =“给我找一把带金属支架的椅子”
检索结果=检索器引擎.检索(查询)

检索到的图像 = []
对于检索结果中的 res_node:
if isinstance(res_node.node, ImageNode):
returned_image.append(res_node.node.metadata[“file_path”])
别的:
显示源节点(res_node,源长度=200)

显示图像(检索图像)

文本节点和检索器检索到的图像如下所示。

多模式检索器检索的文本节点和图像

此处检索的文本节点和图像接近查询嵌入,但并非所有节点和图像都相关。下一步是将这些文本节点和图像发送到多模式法学硕士以细化选择并生成最终响应。提示模板qa_tmpl_str指导法学硕士在此选择和回复生成过程中的行为。

导入日志记录
从 llama_index.core.schema 导入 NodeWithScore、ImageNode、MetadataMode

# 使用明确的指令定义模板
qa_tmpl_str = (
“上下文信息如下。\n”
“----------\n”
“{context_str}\n”
“----------\n”
“使用提供的上下文和图像(而不是先验知识),”
“回答查询。仅包含与答案直接相关的图像的图像路径。\n”
“您的回复应采用以下格式:\n”
“结果:[根据上下文提供答案]\n”
“相关图像路径:仅用逗号分隔的相关图像的图像路径数组\n”
“查询:{query_str}\n”
“回答: ”

qa_tmpl = 提示模板(qa_tmpl_str)
# 初始化多模式LLM
multimodal_llm = OpenAIMultiModal(模型=“gpt-4o”,温度= 0.0,max_tokens = 1024)
# 使用检索器和提示模板设置查询引擎
query_engine = index.as_query_engine(
llm=multimodal_llm,
text_qa_template=qa_tmpl,
检索器=retriever_engine

以下代码创建上下文字符串ctx_str 为提示模板qa_tmpl_str通过准备具有有效路径和元数据的图像节点。它还将查询字符串与提示模板一起嵌入。然后,提示模板以及嵌入的上下文被发送到 LLM 以生成最终响应。

# 提取底层节点
节点 = [retrieve_results 中节点的节点.node]

# 使用有效路径和元数据创建 ImageNode 实例
图像节点 = []
对于节点中的 n:
如果 n.metadata 和 n.metadata["file_path"].lower().endswith(('.png', '.jpg')) 中的“file_path”:
# 按照 LLM 的预期添加仅包含路径和 mimetype 的 ImageNode
图像节点 = 图像节点(
image_path=n.metadata["文件路径"],
image_mimetype="image/jpeg" if n.metadata["file_path"].lower().endswith('.jpg') else "image/png")
image_nodes.append(NodeWithScore(node=image_node))
logging.info(f"为路径创建的ImageNode:{n.metadata['file_path']}")
logging.info(f"为 LLM 准备的 ImageNode 总数:{len(image_nodes)}")

# 创建提示的上下文字符串

ctx_str = "\n\n".join(
[n.get_content(metadata_mode=MetadataMode.LLM).strip() 用于节点中的 n]

# 设置提示格式

fmt_prompt = qa_tmpl.format(context_str=ctx_str, query_str=query)
# 使用多模式 LLM 生成响应

llm_response = multimodal_llm.complete(
提示=fmt_提示,
image_documents=[image_node.node for image_node in image_nodes], # 仅传递带路径的 ImageNode
最大令牌数=300

# 将响应转换为文本并进行处理

response_text = llm_response.text # 从LLM响应中提取实际文本内容
# 提取“相关图像路径:”之后的图像路径

image_paths = re.findall(r'相关图像路径:\s*(.*)', response_text)
如果图像路径:
# 如果存在多个路径,则用逗号分隔路径并去除任何多余的空格
image_paths = [path.strip() for image_paths[0].split(",") 中的路径]
# 从显示的响应中过滤掉“相关图像路径”部分

Filtered_response = re.sub(r'相关图像路径:.*', '', response_text).strip()
显示(Markdown(f“**查询**:{查询}”))

# 打印过滤后的响应,不带图像路径

显示(Markdown(f“{filtered_response}”))
如果 image_paths!=['']:

# 使用 image_paths 数组中收集的路径绘制图像
显示图像(图像路径)
LLM 针对上述查询生成的最终(过滤后)响应如下所示。

法学硕士的最终(过滤后)回复(作者提供的图片)

这表明嵌入模型成功地将文本嵌入与图像嵌入连接起来,并检索相关结果,然后由法学硕士进一步细化。

下面显示了更多测试查询的结果。

木制餐桌和木椅的搜索结果(作者提供的图片)

时尚办公桌的搜索结果(作者提供的图片)
经典老式床头柜的搜索结果
现在让我们测试图像到图像任务的多模态嵌入模型。

我们使用不同的产品图像(不在目录中)并使用检索器来获取匹配的产品图像。以下代码使用修改后的辅助函数检索匹配的产品图像显示图像

将 matplotlib.pyplot 导入为 plt
从 PIL 导入图像
导入操作系统

def display_images(输入图像路径,匹配图像路径):
”“”
将输入图像与具有适当标签的匹配图像一起绘制。
”“”
# 显示的总图像(输入 + 第一个匹配)
总图像数 = 1 + len(匹配图像路径)

# 定义图形大小
plt.figure(figsize=(7, 7))

# 显示输入图像
plt.subplot(1,total_images,1)
如果 os.path.isfile(input_image_path):
输入图像 = Image.open(输入图像路径)
plt.imshow(输入图像)
plt.title("给定图像")
plt.轴(“关闭”)

# 显示匹配的图像
对于 idx,枚举中的 img_path(matched_image_paths):
如果 os.path.isfile(img_path):
匹配的图像 = Image.open(img_path)
plt.subplot(1,total_images,idx + 2)
plt.imshow(匹配图像)
plt.title("找到匹配项")
plt.轴(“关闭”)

plt.tight_layout()
plt.show()

# 指定路径的示例用法
input_image_path = 'C:/Users/h02317/Downloads/Trial2.png'

检索结果=检索器引擎.image_to_image_retrieve(输入图像路径)
检索到的图像 = []
对于检索结果中的资源:
retrieve_images.append(res.node.metadata[“file_path”])

# 调用并排显示图像的函数
显示图像(输入图像路径,检索图像[:2])

输入和输出(匹配)图像的一些结果如下所示。

输入图像和多模态检索器检索到的匹配图像(作者提供的图像)
输入图像和多模态检索器检索到的匹配图像(作者提供的图像)

这些结果表明,这种多模态嵌入模型在文本到文本、文本到图像和图像到图像任务中提供了令人印象深刻的性能。该模型可以进一步探索具有大型文档的多模式 RAG,以增强不同数据类型的检索体验。

此外,多模态嵌入模型在各种业务应用中具有良好的潜力,包括个性化推荐、内容审核、跨模态搜索引擎和客户服务自动化。这些模型可以使公司开发出更丰富的用户体验和更高效的知识检索系统。

如果您喜欢这篇文章,请点赞这篇文章并在 Medium 和/或上关注我领英

GitHub

有关完整的代码参考,请查看我的存储库:

关于《面向商业应用的多模式人工智能搜索》的评论


暂无评论

发表评论

摘要

提供的文本描述了多模态嵌入模型的实现,该模型集成了用于问答、图像检索和跨模态搜索等任务的文本和视觉信息。以下是该文档要点的摘要:1. **设置和安装**:- 环境设置包括安装必要的 Python 包,如“transformers”、“langchain”等。- 使用 Hugging Face Transformers 库加载嵌入和模型。2. **为 LLM 输入准备节点**:- 图像节点和文本节点是根据文件中的元数据(例如“.jpg”或“.png”)准备的。- 提取文本内容并对其进行格式化,以创建提示的上下文字符串,从而通过相关信息增强问答任务。3. **快速工程和响应处理**:- 提示模板(`qa_tmpl`)用于格式化用户查询以及检索到的上下文。- 使用“完整”方法调用多模式法学硕士,以根据文本和视觉输入生成响应。- 响应的后处理包括提取输出中提到的相关图像路径。4. **显示结果**:- 辅助函数“display_images”将给定图像与检索到的匹配项一起绘制以进行视觉验证。- 代码展示了针对多模式模型运行不同类型查询的各种示例(例如,搜索带椅子的木制餐桌、办公桌)。5. **图像到图像检索**:- 演示如何使用输入产品图像从数据库/目录中检索类似图像。- 包括显示功能来显示给定和检索的图像以进行比较。6. **结论和进一步应用**:- 该系统在文本到文本、文本到图像和图像到图像检索等各种任务中被评估为有效。- 讨论了潜在的商业应用,例如个性化推荐、内容审核、跨模态搜索引擎等,强调模型的通用性和实用性。### 要点- **多模态嵌入**:系统的核心是多模态嵌入模型,可以有效处理文本和图像数据。- **LLM 集成**:通过将 LLM 与嵌入相结合,系统可以通过上下文图像增强复杂的问答功能。- **视觉验证**:检索和显示相关视觉内容以及文本响应的能力可增强用户体验并验证查询结果。### 未来的方向该实现建议进一步探索大规模多模式检索系统,以处理涉及大量文档和不同数据类型的复杂查询。这为丰富的客户服务自动化、个性化推荐和先进的知识管理工具等领域开辟了可能性。有关详细的代码参考和完整的实现细节,作者建议查看文章末尾链接的 GitHub 存储库。