概述
传统商品检索通常依赖人工解析和构建商品的描述字段,将商品信息存入 Elasticsearch 或数据库,然后通过分词查询结合多重条件(类别或其他属性)检索到匹配的商品。
然而,在传统检索中,由于分词算法本身的局限性,经常会遇到语义误匹配的问题。例如,当用户检索'苹果耳机'时,系统往往会出现'苹果'手机和'耳机'配件的相关商品,导致客户体验效果不佳。这是因为传统关键词搜索难以理解词语之间的上下文关系和语义关联。
为了让检索更人性化,我们可以借助 RAG(检索增强生成)技术,在传统分词搜索的基础上融入向量检索的能力,从而获得更贴近人类需求的检索效果。本文将详细介绍如何利用 Python、Elasticsearch 和大语言模型构建一个大规模商品智能检索系统。
名词解释
在开始之前,我们先对本文涉及的关键技术术语进行说明:
- RAG (Retrieval-augmented Generation):检索增强生成。一种通过检索外部知识库来辅助大语言模型生成的技术,旨在减少幻觉并提高回答的准确性。
- ES (Elasticsearch):开源分布式搜索和分析引擎,常用于实时搜索、日志分析、数据可视化等应用。
- BES (Baidu Elasticsearch):百度托管的 Elasticsearch 服务,完全兼容开源 Elasticsearch 的功能,提供企业级稳定性。
- Embedding:向量化技术。将文本对象映射到高维空间,通过向量表示捕捉语义关系和数据结构,使得语义相似的文本在向量空间中距离更近。
- Prompt:提示词。用户或程序向模型提供的输入文本或指令,用于引导模型生成特定类型或内容的响应。
- ERINIE 4.0:文心产业级知识增强大语言模型 4.0 版本,具备强大的自然语言理解和生成能力。
思路分析
整体实现思路主要分为以下几个步骤:
- 数据准备:解析文档中的商品信息,提取有效内容。
- 数据切片:根据规则将长文本切分为适合向量化的片段。
- 向量化:利用 Embedding 模型将文本切片转化为向量。
- 数据存储:将商品信息及其向量信息存储到向量数据库(如 Elasticsearch)。
- 数据检索:将用户查询内容向量化,利用向量检索能力召回最相似的商品切片。
- 重排序:对召回的数据利用重排序算法,按照相似度由高到低重新排序,提升精准度。
- 返回数据处理:利用大模型解读排序后的商品切片信息,结合 Prompt 输出给用户。
本文使用 Python 进行编码实现。整体流程如下所示:
数据准备与数据切片
首先,我们需要准备示例文档。可以使用本文提供的示例数据,也可以自行准备对应的 PDF、Word 等格式的商品信息文档。
准备好数据后,我们使用文档解析组件来提取文档内容。DocParser 支持 PDF、JPG、DOC、TXT、XLS、PPT 等多种文档格式的解析,可获取文档内容、版式信息、位置坐标及表格结构等信息。
以下是解析示例 PDF 文件的代码:
from appbuilder.core.components.doc_parser.doc_parser import DocParser
from appbuilder.core.message import Message
msg = Message(file_path)
parser = DocParser()
parse_result = parser(msg)
page_contents = parse_result.content.page_contents
请注意,PageContent 类型信息比较零散,通常需要手动合并内容以保证语义连贯性:
chunk = []
layout doc.page_layouts:
chunk.append(layout.text)
doc.titles:
chunk.insert(, doc.titles[].text)
doc.tables:
.join(chunk)


