03 | 基于 Embedding 的智能汽车推荐系统

2024/12/26 AI OpenAI Prompt-Engineering 共 8692 字,约 25 分钟

今天我们将使用大语言模型平台的大语言模型与 Embedding(向量嵌入)技术,构建智能购车推荐系统。首先,让我们了解一下 Embedding 的基本概念。

1. Embedding 基础

1.1 Embedding 概述

Embedding 是一种将复杂的数据(如文字、图像、声音等)转化为计算机可处理的向量表示的技术。它在自然语言处理、图像识别、语音分析等任务中有广泛应用。

  • 文字处理:Embedding 将单词映射到向量空间中,向量的距离反映了单词之间的语义相似性。例如,“苹果”和“橘子”的向量可能非常接近,表示它们在语义上是相似的。
  • 图像处理:Embedding 会提取图像中的关键特征(如颜色、形状、风格等),并将这些特征映射为向量。基于这些向量,计算机可以进行图像分类、相似性匹配等操作。
  • 语音处理:Embedding 分析声音的音调、节奏、音色等特征,将其转化为向量,使计算机能有效地进行语音识别和分析。

Embedding 的优势在于:

  1. 简化复杂信息:Embedding 将高维信息转化为低维向量,便于计算机高效处理。
  2. 增强语义理解:通过向量的距离,计算机可以更好地理解语义相似的内容。
  3. 分块处理长文本:Embedding 可以帮助处理长文本,并生成连贯的输出。

这些向量是通过大规模数据训练得到的,捕捉了传统方法难以理解的深层语义关系。

1.2 Embedding 与传统分词的区别

1.2.1 表示方式

  • 传统分词:根据词汇和语法规则将文本拆分为独立的词,词语以离散符号形式表示,彼此之间没有数值关系。
  • Embedding:将词语映射到向量空间,每个词语对应一个多维向量,向量维度根据任务需求设定,常见的有 100 维或 300 维。

1.2.2 语义信息的体现

  • 传统分词:分词只是简单的文本拆分,无法体现词语之间的语义关系。例如,“苹果”和“橘子”虽然都是水果,但分词后没有语义上的联系。
  • Embedding:通过向量的距离体现词语的语义相似性。语义相近的词汇向量距离更近,例如“高兴”和“快乐”的向量比“汽车”的向量距离更近。

1.2.3 对下游任务的影响

  • 传统分词:适用于简单的文本匹配和规则分析,但难以捕捉复杂语义关系,在深度学习任务中的效果有限。
  • Embedding:向量蕴含丰富的语义信息,适用于文本分类、情感分析、机器翻译等任务,有助于提升模型的理解力和任务性能。

2. 基于大语言模型的推荐系统

在汽车推荐领域,大语言模型(如 GPT)和向量嵌入(Embedding)技术正变得越来越重要,尤其是在车辆的推荐系统中,它们提供了全新的技术思路。

2.1 大语言模型的角色

大语言模型(如 GPT)具备强大的自然语言理解和生成能力。通过在海量文本数据上进行预训练,GPT 在处理车辆相关的文本信息时展现出独特的优势。例如,在解析产品描述时,它能深刻理解文本的语义,准确提取出诸如“城市 SUV”、“硬派越野车”或“新能源车型”等关键信息。基于这些信息,系统可以识别车型特点并分类,为推荐系统奠定数据基础。

2.2 向量嵌入技术的作用

向量嵌入技术(如 Word2Vec、Sentence-BERT)可以将车辆的文本描述转化为向量。在这个向量空间中,语义相似的描述将彼此靠近。利用这一特性,通过计算向量之间的相似度(如使用余弦相似度),我们可以快速找到特征相似的车型。

例如,当用户需要一款空间大且舒适的 SUV 时,系统能够基于描述嵌入,从某系列中推荐符合这些条件的车型。这样,推荐变得更加个性化和精准。

2.3 大语言模型与向量嵌入结合的推荐系统

将大语言模型和向量嵌入技术结合起来,便可以构建一个能够“理解”车辆信息并基于语义相似性进行推荐的智能系统。接下来,让我们逐步拆解这个推荐系统的各个模块。

2.3.1 数据预处理

首先,我们需要加载车辆的原始数据,包括车辆的型号、品牌、配置等关键信息。预处理步骤确保数据清洗和结构化,为后续处理提供支持。

2.3.2 关键词生成

通过大语言模型为每辆车生成描述其特点的关键词,这些关键词涵盖车型特征、适用场景和目标用户。系统根据这些关键词生成文本描述,帮助进一步处理。

2.3.3 嵌入生成

将车辆的型号、品牌、关键词等信息拼接,利用先进的文本嵌入模型(如 bge-m3)生成其对应的向量表示。这些向量代表车辆在向量空间中的位置,语义相近的车辆会相互靠近。

2.3.4 相似度搜索

用户输入购车需求后,系统将其输入转换为向量表示。通过计算用户查询向量与数据库中车辆向量的相似度(如余弦相似度),系统可以找到与用户需求最匹配的车型。

2.3.5 汽车推荐

基于相似度搜索的结果,系统会将最符合条件的车型按相似度排序,推荐给用户。这样,用户不仅可以得到符合需求的车辆推荐,还能根据个人偏好选择最佳方案。

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。——百度百科

2.1数据预处理

为了构建一个智能的车辆推荐系统,首先需要一个基础数据集。以下是我们准备的一个简单车辆信息数据集,包含车辆型号、品牌、售价和车辆描述等字段。这些字段将被用于后续的特征提取和向量化操作。

车辆型号车辆品牌车辆售价(万元)车辆描述
理想L9理想45.98全尺寸SUV,采用增程式电动技术,提供宽敞的车内空间,搭载智能座舱,拥有舒适的驾乘体验,配备强大的自动驾驶辅助系统,适合家庭出行。
理想L8理想35.98中大型SUV,增程式电动驱动,具备大尺寸显示屏,舒适的座椅和智能交互系统,为用户带来舒适的驾乘体验,兼顾城市与户外出行。
理想ONE理想34.98中大型六座SUV,采用增程式电动,具有舒适的车内空间和丰富的科技配置,是家庭用户的理想之选,提供多种驾驶模式。

这些字段提供了丰富的特征信息,特别是车辆描述这一自然语言数据,为我们使用大语言模型和嵌入技术提供了必要的语义信息基础。我们将利用这些描述生成向量嵌入,后续步骤中,系统将通过计算车辆之间的语义相似度,实现精准推荐。

另外,通过大语言模型平台,我们可以简化数据集生成过程。使用如下 Prompt:

请帮我生成一份理想汽车各个产品型号的数据集要求包含车辆型号车辆品牌车辆售价车辆描述等信息。”

系统即可生成类似的数据集,帮助快速启动推荐系统的开发。

首先,确保安装以下依赖。

%pip install pandas
%pip install numpy
%pip install openai
%pip install scikit-learn

接下来,导入我们需要的库。pandas 用于数据处理,numpy 用于数值计算,cosine_similarity 用于计算向量之间的相似度,dotenv 用于加载环境变量。

import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
from openai import OpenAI
from dotenv import load_dotenv  # 导入 dotenv 库,用于加载环境变量
import os  # 导入 os 库,用于访问操作系统功能

load_dotenv()

这里,我们初始化 OpenAI 客户端并加载车辆推荐系统的数据集。我们选取车辆的型号、品牌、售价和描述等字段,创建一个新的 DataFrame 以便后续处理。


# 初始化OpenAI客户端
client = OpenAI(
    base_url=base_url,
)

# 加载车辆数据集
dataset_path = "data/03_gptv_multl_mod/cars/cars.csv"
df = pd.read_csv(dataset_path)

# 选择需要的列
selected_columns = ['车辆型号', '车辆品牌', '车辆售价(万元)','车辆描述']
df = df[selected_columns].copy()

2.2 生成关键词并保存新数据集

在这一步,我们设计了一个详细的系统提示词,指导大模型为每辆车生成关键词。让我们仔细看看这个提示词的内容。

你是一个专门为汽车标记相关关键词的代理这些关键词可用于在汽车展厅或汽车销售平台搜索这些汽车
你将获得一辆汽车的车辆描述你的目标是为这辆汽车提取关键词
关键词应简洁明了全部小写
关键词可以描述以下内容:
汽车类型 "轿车""suv""mpv" 
汽车主题 "越野性能""新能源""豪华内饰" 
目标用户 "家庭用户""年轻群体""商务人士" 
价格等级 "经济型""中档""高档" 
只有在车辆信息中明确提及时才提取相关关键词
以字符串数组的格式返回关键词例如:
['suv', '新能源', '家庭用户', '中档']

这个提示词清晰地定义了模型的角色(为汽车标记关键词的代理)和目标(根据车辆描述提取关键词)。它还详细说明了关键词应该包含的信息类型,如汽车类型、主题、目标用户、价格等级,并给出了具体的例子。此外,提示词强调只有在车辆信息中明确提及时才提取相关关键词,以确保关键词的准确性。最后,它指定了关键词的格式,即以字符串数组的形式返回。

这样详尽、具体的提示词设计有助于指导模型生成高质量、信息丰富的关键词,为后续的汽车推荐奠定良好的基础。

接下来,生成关键词并保存数据集。

# 定义生成关键词的系统提示
keywords_system_prompt = '''
你是一个专门为汽车标记相关关键词的代理。这些关键词可用于在汽车展厅或汽车销售平台搜索这些汽车。
你将获得一辆汽车的车辆描述,你的目标是为这辆汽车提取关键词。
关键词应简洁明了,全部小写。
关键词可以描述以下内容:
- 汽车类型,如 "轿车"、"suv"、"皮卡" 等
- 汽车主题,如 "越野性能"、"新能源"、"豪华内饰" 等
- 目标用户,如 "家庭用户"、"年轻群体"、"商务人士" 等
- 价格等级,如 "经济型"、"中档"、"高档" 等
只有在车辆信息中明确提及时,才提取相关关键词。
以字符串数组的格式返回关键词,例如:
['suv', '新能源', '家庭用户', '中档']
'''

# 定义生成关键词的函数
def generate_keywords(description):
    response = client.chat.completions.create(
    model="gpt-4o",
    temperature=0.2,
    messages=[
        {
            "role": "system",
            "content": keywords_system_prompt
        },
        {
            "role": "user",
            "content": f"车辆描述: {description}"
        }
    ],
    max_tokens=100,
    )
    return response.choices[0].message.content

# 为每辆车生成关键词
df['关键词'] = df['车辆描述'].apply(generate_keywords)

# 保存带有关键词的数据集
data_path = "data/03/cars/TextEmbedding/cars_tagged_and_captioned.csv"
df.to_csv(data_path, index=False)

生成的 csv 内容如下:

车辆型号,车辆品牌,车辆售价(万元),车辆描述,关键词
理想L9,理想,45.98,全尺寸SUV,采用增程式电动技术,提供宽敞的车内空间,搭载智能座舱,拥有舒适的驾乘体验,配备强大的自动驾驶辅助系统,适合家庭出行。,"['suv', '增程式电动', '宽敞空间', '智能座舱', '家庭用户', '自动驾驶辅助']"
理想L8,理想,35.98,中大型SUV,增程式电动驱动,具备大尺寸显示屏,舒适的座椅和智能交互系统,为用户带来舒适的驾乘体验,兼顾城市与户外出行。,"['suv', '增程式电动', '大尺寸显示屏', '舒适座椅', '智能交互系统', '家庭用户']"
理想ONE,理想,34.98,中大型六座SUV,采用增程式电动,具有舒适的车内空间和丰富的科技配置,是家庭用户的理想之选,提供多种驾驶模式。,"['suv', '增程式电动', '大六座', '舒适空间', '科技配置', '家庭用户']"

2.3 生成嵌入向量并保存

接下来,我们定义获取嵌入向量的函数 get_embedding,它使用 bge-m3 模型为给定的文本生成嵌入向量。我们将每辆车的车辆型号、车辆品牌和关键词拼接成一个字符串,然后调用此函数生成其嵌入向量。

# 定义获取嵌入向量的函数
def get_embedding(value, model="default/bge-m3"):
    embeddings = client.embeddings.create(
      model=model,
      input=value,
      encoding_format="float"
    )  
    return embeddings.data[0].embedding

# 嵌入车辆型号、车辆品牌和关键词
df['embedding'] = df.apply(lambda x: get_embedding(f"{x['车辆型号']} {x['车辆品牌']} {x['关键词']}"), axis=1)

# 将嵌入向量转换为字符串以便保存到 CSV 文件
df['embedding_str'] = df['embedding'].apply(lambda x: ','.join(map(str, x)))

# 保存带有关键词和嵌入向量的数据集
data_path = "data/03/cars/TextEmbedding//cars_with_keywords_and_embeddings.csv"
df.to_csv(data_path, index=False)

这里,我们对 DataFrame 的每一行应用 get_embedding 函数,为每辆车生成嵌入向量,将嵌入向量转换为字符串以便保存,并将带有关键词和嵌入向量的数据集保存到 CSV 文件中。

车辆型号,车辆品牌,车辆售价(万元),车辆描述,关键词,embedding,embedding_str
理想L9,理想,45.98,全尺寸SUV,采用增程式电动技术,提供宽敞的车内空间,搭载智能座舱,拥有舒适的驾乘体验,配备强大的自动驾驶辅助系统,适合家庭出行。,"['suv', '增程式电动', '宽敞空间', '智能座舱', '家庭用户', '自动驾驶辅助']","[-0.04605172201991081, -0.04282350838184357, -0.05152125284075737, -0.015073901042342186, -0.031202122569084167, 0.009863092564046383, 0.03835892304778099, -0.0065855346620082855, 0.002312426222488284, -0.023381615057587624, 0.011963952332735062, 0.013710983097553253, 0.010265165008604527, -0.027636829763650894, -0.0025148766580969095, -0.03026479296386242, 0.011163360439240932, -0.023443661630153656, 0.021101271733641624, -0.04796310514211655, -0.005220355000346899, 0.028663000091910362, 0.048656098544597626, -0.00686237495392561, -0.03423630818724632, -0.0194962527602911, 0.017649829387664795, 0.003501537488773465, 0.02035154402256012, 0.018558217212557793, 0.007230079732835293, -0.04511991888284683, 0.01267722062766552, -0.008269169367849827, -0.016543567180633545, -0.025857189670205116, -0.04044906795024872, -0.017910990864038467, -0.04063061252236366, 0.011746585369110107, -0.018979638814926147, 0.0004104207328055054, 0.00860813818871975, 0.015235782600939274, 0.020279744639992714, -0.027650849893689156, -0.0022506460081785917, -0.019605277106165886, -0.0041670650243759...

2.4 加载数据并进行汽车搜索

加载这个数据之后,就可以进行搜索并推荐相关汽车了。下面,我们从 CSV 文件中加载带有关键词和嵌入向量的数据集,并将嵌入向量从字符串转换回列表形式。

# 从 CSV 文件加载带有关键词和嵌入向量的数据集
df_search = pd.read_csv(data_path)
df_search['embedding'] = df_search['embedding_str'].apply(lambda x: list(map(float, x.split(','))))

# 定义根据输入文本搜索的函数
def search_from_input_text(query, n=2):
    embedded_value = get_embedding(query)
    df_search['similarity'] = df_search['embedding'].apply(lambda x: cosine_similarity(np.array(x).reshape(1,-1), np.array(embedded_value).reshape(1, -1)))
    most_similar = df_search.sort_values('similarity', ascending=False).iloc[:n]
    return most_similar

代码中定义了根据输入文本搜索相似汽车的函数 search_from_input_text。给定用户输入的查询文本,该函数首先使用 get_embedding 函数为查询文本生成嵌入向量。然后计算查询向量与数据集中每辆车嵌入向量之间的余弦相似度,将结果存储在 similarity 列中,按相似度降序排列,取前 n 辆车作为搜索结果返回。

为了测试推荐系统,我们输入一个查询文本“给我推荐一辆适合年轻群体的经济型 SUV”,然后调用 search_from_input_text 函数搜索最相似的汽车。

# 测试输入文本搜索
user_input = "给我推荐一辆适合年轻群体的经济型 SUV"
res = search_from_input_text(user_input)
print(f"搜索词: {user_input}\n")
for index, row in res.iterrows():
    print(f"{row['车辆型号']} ({row['车辆品牌']}) - 关键词: {row['关键词']}")

输出结果:

搜索词: 给我推荐一辆适合年轻群体的经济型 SUV

理想L9 (理想) - 关键词: ['suv', '增程式电动', '宽敞空间', '智能座舱', '家庭用户', '自动驾驶辅助']
理想L8 (理想) - 关键词: ['suv', '增程式电动', '大尺寸显示屏', '舒适座椅', '智能交互系统', '家庭用户']

5. 技术总结与应用展望

在本篇文章中,我们构建了一个基于大语言模型和向量嵌入的推荐系统,为汽车推荐提供了一个有效的解决方案。通过数据预处理、关键词生成、嵌入向量计算以及相似度搜索,我们创建了一个能够根据用户需求提供精准推荐的系统。以下是对技术实现的总结及其应用展望:

5.1 技术总结

数据预处理与关键词生成: 通过定义详细的系统提示词,我们指导大模型生成相关的汽车关键词。这些关键词准确描述了汽车的类型、主题、目标用户和价格等级,为后续的推荐提供了坚实的基础。

嵌入向量计算: 使用 OpenAI 的 Embedding 模型为汽车生成了高质量的嵌入向量。这些嵌入向量捕捉了汽车描述的语义特征,使得推荐系统能够基于文本内容进行高效的相似度计算。

相似度计算与搜索: 利用余弦相似度度量,我们实现了基于用户查询的相似度搜索。该方法能够有效地找到与用户需求最匹配的汽车,并进行个性化推荐。

5.2 技术应用领域

汽车销售与展示平台: 本推荐系统可以直接集成到汽车销售和展示平台中,帮助用户快速找到符合其需求的汽车,提高平台的用户体验和销售转化率。

智能助手与顾客支持: 在智能汽车助手或客户支持系统中应用此技术,能够根据用户的具体需求提供个性化的汽车推荐,提升用户满意度和服务质量。

市场分析与产品优化: 企业可以利用推荐系统分析用户偏好和市场需求,从而优化汽车产品设计和营销策略,增强市场竞争力。

数据驱动的决策支持: 通过集成推荐系统,企业可以基于用户数据做出更有针对性的决策,提高资源配置的效率和效果。

通过不断改进和应用这些技术,我们能够在汽车行业及相关领域中实现更高效、更智能的推荐服务,推动行业的智能化发展,并为用户提供更为精准和个性化的服务体验。

文档信息

Search

    Table of Contents

    京ICP备2021015985号-1