概述
传统商品检索通常依赖人工解析和构建商品的描述字段,将商品信息存入 Elasticsearch 或数据库,然后通过分词查询结合多重条件(如类别或其他属性)检索匹配的商品。
然而,在传统检索中,由于分词机制的局限性,经常会出现误匹配问题。例如,检索'苹果耳机'时,系统可能会返回'苹果'手机或'耳机'配件的相关商品,导致客户体验不佳。
为了解决这一问题并提升检索的人性化程度,我们可以借助检索增强生成(RAG)技术。该技术在传统分词搜索的基础上融入向量检索能力,能够捕捉语义层面的相似性,从而获得更贴近人类需求的检索效果。
名词解释
在开始之前,明确本文涉及的关键技术术语:
- RAG:检索增强生成 (Retrieval-augmented Generation),一种通过检索外部知识库来增强大语言模型生成能力的架构。
- ES:Elasticsearch,开源分布式搜索和分析引擎,支持实时搜索、日志分析等。
- BES:百度 Elasticsearch,百度托管的 Elasticsearch 服务,兼容开源功能。
- Embedding:向量化技术,将对象或概念映射到高维空间,用于捕捉语义关系。
- Prompt:用户或程序向模型提供的输入文本或指令,引导模型生成特定响应。
- ERINIE 4.0:百度文心产业级知识增强大语言模型 4.0 版本。
实现思路
整体实现流程包含以下关键步骤:
- 数据准备:解析文档中的商品信息。
- 数据切片:按照一定规则对信息进行切分,以适应模型输入限制。
- 向量化:对切片信息调用 Embedding 模型进行向量化处理。
- 数据存储:将商品信息及其向量信息存储到向量数据库(如 BES)。
- 数据检索:将用户查询内容向量化,利用向量检索能力召回近似商品切片。
- 重排序:对召回数据利用重排序算法按相似度重新排序。
- 返回数据处理:利用大模型解读排序后的信息,输出给用户。
本文采用 Python 进行编码实现。整体流程如下图所示:
![图:系统架构图]
数据准备与数据切片
首先准备示例文档以解析商品信息。可以使用百度千帆 AppBuilder 的文档解析组件提取内容。
DocParser 支持 PDF、JPG、DOC、TXT、XLS、PPT 等 17 种文档格式,可解析得到文档内容、版式信息、位置坐标及表格结构。
解析示例 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 = []
for layout in doc.page_layouts:
chunk.append(layout.text)
# 标题置顶
if doc.titles:
chunk.insert(0, doc.titles[0].text)
doc.tables:
.join(chunk)


