96SEO 2026-02-23 13:06 13
。

我们从一个基础的聊天机器人开始#xff0c;然后逐步添加了更复杂的组件#xff0c;例如记忆、非参数化知识和外部工具。
借助LangChain的预构建组件以及Streamlit的UI渲染#xff0c;这一切都变得相对简单。
尽…在上一章中我们介绍了构建对话应用程序的核心步骤。
我们从一个基础的聊天机器人开始然后逐步添加了更复杂的组件例如记忆、非参数化知识和外部工具。
借助LangChain的预构建组件以及Streamlit的UI渲染这一切都变得相对简单。
尽管对话应用程序通常被视为生成式AI和LLM的“舒适区”但这些模型实际上涵盖了更广泛的应用领域。
在本章中我们将讨论如何使用LLM来增强推荐系统结合嵌入和生成模型。
我们将学习如何使用LangChain作为框架创建一个利用最先进的LLM的推荐系统应用程序。
推荐系统的定义及其演变LLM如何影响这一研究领域使用LangChain构建推荐系统
针对所有自学遇到困难的同学们我帮大家系统梳理大模型学习脉络将这份
分享出来包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等,
[CSDN大礼包全网最全《LLM大模型入门进阶学习资源包》免费分享安全链接放心点击]()
Face账号和用户访问令牌。
一个OpenAI账号和用户访问令牌。
Python版本3.7.1或更高版本。
请确保安装了以下Python包langchain、python-dotenv、huggingface_hub、streamlit、lancedb、openai和tiktoken。
这些包可以通过在终端中使用pip
本章的代码可以在本书的GitHub仓库中找到地址是github.com/PacktPublis…
推荐系统是一种计算机程序旨在为电子商务网站和社交网络等数字平台的用户推荐物品。
它利用大型数据集来建立用户喜好和兴趣的模型然后向个人用户推荐类似的物品。
根据使用的方法和数据推荐系统可以分为不同的类型。
以下是一些常见的类型
协同过滤这种类型的推荐系统使用具有类似偏好的其他用户的评分或反馈。
它假设过去喜欢某些物品的用户将来会喜欢类似的物品。
例如如果用户A和用户B都喜欢电影X和Y那么如果用户B也喜欢电影Z算法可能会将电影Z推荐给用户A。
协同过滤可以进一步分为两种子类型基于用户的协同过滤和基于物品的协同过滤
基于用户的协同过滤查找与目标用户相似的用户并推荐他们喜欢的物品。
基于物品的协同过滤查找与目标用户喜欢的物品相似的物品并推荐这些物品。
基于内容的过滤这种类型的推荐系统使用物品本身的特征或属性推荐与目标用户之前喜欢或互动过的物品相似的物品。
它假设喜欢某个物品特定特征的用户会喜欢其他具有相似特征的物品。
与基于物品的协同过滤的主要区别在于后者使用用户行为模式进行推荐而基于内容的过滤则使用物品本身的信息。
例如如果用户A喜欢电影XX是一部由演员Y主演的喜剧片那么算法可能会推荐电影ZZ也是一部由演员Y主演的喜剧片。
混合过滤这种类型的推荐系统结合了协同过滤和基于内容的过滤方法以克服它们的一些局限性并提供更准确和多样化的推荐。
例如YouTube使用混合过滤根据观看了类似视频的其他用户的评分和观看次数以及视频本身的特征和类别推荐视频。
基于知识的过滤这种类型的推荐系统使用有关领域和用户需求或偏好的显式知识或规则推荐满足特定标准或约束的物品。
它不依赖于其他用户的评分或反馈而是基于用户的输入或查询。
例如如果用户A想购买一台具有特定规格和预算的笔记本电脑算法可能会推荐一台符合这些标准的笔记本电脑。
基于知识的推荐系统在评分历史很少或没有可用时或者物品复杂且可定制时效果很好。
在上述框架内可以使用各种机器学习技术我们将在下一节中讨论这些技术。
现代推荐系统使用机器学习ML技术来基于以下数据更好地预测用户的偏好
用户行为数据关于用户与产品交互的见解。
这些数据可以从用户评分、点击和购买记录等因素中获取。
用户人口统计数据指用户的个人信息包括年龄、教育背景、收入水平和地理位置等详细信息。
产品属性数据涉及产品特征的信息例如书籍的类型、电影的演员阵容或食品中的特定菜系。
K近邻KNN是一种可以用于分类和回归问题的机器学习算法。
它通过找到距离新数据点最近的k个数据点k是用户在初始化算法之前设置的并使用它们的标签或值来进行预测。
KNN基于一个假设即相似的数据点可能具有相似的标签或值。
KNN可以应用于推荐系统中的协同过滤包括基于用户的协同过滤和基于物品的协同过滤
是一种协同过滤方法它使用具有类似品味或偏好的其他用户的评分或反馈来推荐物品。
例如假设我们有三位用户Alice、Bob
Charlie。
他们都在网上购买书籍并对其进行评分。
Alice
都喜欢高评分《哈利·波特》系列和《霍比特人》这本书。
系统会发现这个模式并认为
是另一种协同过滤方法它使用物品的属性或特征来向目标用户推荐类似的物品。
例如考虑同样的用户及其对书籍的评分。
系统注意到《哈利·波特》系列和《霍比特人》都得到了
推荐《霍比特人》。
这是因为系统假设既然《哈利·波特》和《霍比特人》相似都被相同的用户喜欢Charlie
可扩展性当处理大数据集时KNN可能变得计算密集且缓慢因为它需要计算所有物品或用户之间的距离。
冷启动问题对于新物品或新用户KNN面临挑战因为它们缺乏足够的交互历史数据难以找到有意义的邻居。
数据稀疏性在数据稀疏的情况下KNN性能可能会下降因为缺少足够的邻居信息来做出准确的预测。
特征相关性KNN将所有特征视为等同并假设所有特征在相似性计算中同等重要。
这在某些场景下可能并不成立有些特征可能比其他特征更重要。
K值选择选择适当的K值邻居数量可能是主观的并且会影响推荐的质量。
K值太小可能导致噪声K值太大可能导致推荐过于宽泛。
一般来说KNN适用于小数据集、噪声较少的场景以免异常值、缺失值等影响距离度量和动态数据KNN是一种基于实例的方法不需要重新训练可以快速适应变化。
矩阵分解是一种用于推荐系统的技术用于基于历史数据分析和预测用户偏好或行为。
它通过将一个大的矩阵分解为两个或多个较小的矩阵揭示出数据模式中的潜在特征从而解决所谓的“维度灾难”。
维度灾难指的是处理高维数据时出现的挑战。
这导致复杂性增加、数据稀疏以及由于数据需求指数增长和潜在的过拟合而导致的分析和建模困难。
在推荐系统的背景下这种技术用于预测用户-物品交互矩阵中缺失的值该矩阵表示用户与各种物品如电影、产品或书籍的交互情况。
例如假设你有一个矩阵其中行代表用户列代表电影单元格包含评分从1到5分。
然而并非所有用户都对所有电影进行了评分导致矩阵中存在许多缺失条目
电影1电影2电影3电影4用户14-5-用户2-3-2用户354-3
矩阵分解旨在将此矩阵分解为两个矩阵一个是用户矩阵另一个是电影矩阵维度数量减少即潜在因素。
这些潜在因素可能代表像类型偏好或特定电影特征等属性。
通过将这些矩阵相乘你可以预测缺失的评分并推荐用户可能喜欢的电影。
将一个矩阵分解为三个单独的矩阵其中中间矩阵包含代表数据中不同成分重要性的奇异值。
它广泛用于数据压缩、降维和推荐系统中的协同过滤。
主成分分析PCA
是一种通过将数据转换到与主成分对齐的新坐标系中来降低数据维度的技术。
这些成分捕捉了数据中最重要的变异性从而实现高效的分析和可视化。
非负矩阵分解NMF
将矩阵分解为两个具有非负值的矩阵。
它通常用于主题建模、图像处理和特征提取其中成分代表非负属性。
在推荐系统的背景下可能最流行的技术是SVD得益于其可解释性、灵活性以及处理缺失值和性能的能力。
以下是如何在Python中使用numpy模块应用SVD的示例
np.linalg.svd(user_movie_matrix,
np.diag(s[:num_latent_factors])
np.maximum(reconstructed_matrix,
在这个示例中U矩阵包含用户相关的信息s矩阵包含奇异值V矩阵包含电影相关的信息。
通过选择一定数量的潜在因子num_latent_factors可以在降维的情况下重构原始矩阵同时在np.linalg.svd函数中设置full_matricesFalse参数以确保分解的矩阵被截断为与选定的潜在因子数量一致的维度。
这些预测的评分可以用于向用户推荐具有较高预测评分的电影。
矩阵分解使推荐系统能够发现用户偏好中的隐藏模式并基于这些模式进行个性化推荐。
矩阵分解在推荐系统中广泛使用尤其是在处理包含大量用户和物品的大型数据集时因为它能够高效地捕捉潜在因子或者当你希望基于潜在因子提供个性化推荐时因为它为每个用户和物品学习了独特的潜在表示。
然而它也存在一些缺陷与KNN的技术类似
冷启动问题与KNN类似矩阵分解在处理交互历史有限或不存在的新物品或用户时面临挑战。
由于它依赖于历史数据无法为新物品或用户提供有效的推荐。
数据稀疏性随着用户和物品数量的增加用户-物品交互矩阵变得越来越稀疏从而导致准确预测缺失值的挑战。
可扩展性对于大型数据集执行矩阵分解可能计算代价高且耗时。
上下文限制矩阵分解通常仅考虑用户-物品交互忽略了时间、地点或其他用户属性等上下文信息。
针对所有自学遇到困难的同学们我帮大家系统梳理大模型学习脉络将这份
分享出来包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等,
[CSDN大礼包全网最全《LLM大模型入门进阶学习资源包》免费分享安全链接放心点击]()
神经网络NN用于推荐系统以通过从数据中学习复杂模式来提高推荐的准确性和个性化。
以下是神经网络在此上下文中常见的应用方式
使用神经网络的协同过滤神经网络可以通过将用户和物品嵌入到连续的向量空间来建模用户-物品交互。
这些嵌入捕捉用户偏好和物品特征的潜在特征。
神经协同过滤模型将这些嵌入与神经网络架构相结合以预测用户与物品之间的评分或交互。
基于内容的推荐在基于内容的推荐系统中神经网络可以学习物品内容的表示例如文本、图像或音频。
这些表示捕捉物品特征和用户偏好。
像卷积神经网络CNN和递归神经网络RNN这样的神经网络用于处理和学习物品内容从而实现个性化的基于内容的推荐。
序列模型在用户交互具有时间序列的场景中例如点击流或浏览历史RNN或其变体如长短期记忆网络LSTM可以捕捉用户行为中的时间依赖性并进行序列推荐。
自编码器和变分自编码器VAEs
自编码器是一种用于无监督学习和降维的神经网络架构。
它们由编码器和解码器组成。
编码器将输入数据映射到低维潜在空间表示而解码器则尝试从编码表示中重构原始输入数据。
变分自编码器VAEs是传统自编码器的扩展它引入了概率元素。
VAEs不仅学习将输入数据编码到潜在空间还使用概率方法对该潜在空间的分布进行建模。
这使得可以从学习到的潜在空间中生成新的数据样本。
VAEs用于生成任务如图像合成、异常检测和数据插补。
在自编码器和VAEs中核心思想是学习输入数据在潜在空间中的压缩和有意义的表示这对包括特征提取、数据生成和降维在内的各种任务都有用。
这些表示可以用于通过在潜在空间中识别相似的用户和物品来进行推荐。
事实上NN独特的架构特点使其能够应用以下技术
边信息集成NN可以结合其他用户和物品属性如人口统计信息、位置或社交关系通过从多种数据源学习来改进推荐。
深度强化学习在某些场景中可以使用深度强化学习来优化推荐系统从用户反馈中学习并建议能够最大化长期奖励的行动。
NN提供了灵活性和捕捉数据中复杂模式的能力使其非常适合推荐系统。
然而为了达到最佳性能它们也需要精心设计、训练和调整。
NN还带来了一些挑战包括以下几点
复杂性增加NN特别是深度神经网络DNN由于其分层结构可能变得非常复杂。
随着隐藏层和神经元的增加模型学习复杂模式的能力也会增强。
训练需求NN是重型模型其训练需要特殊的硬件要求包括GPU这可能非常昂贵。
潜在的过拟合过拟合发生在ANN在训练数据上表现异常好但在未见过的数据上无法推广时。
选择合适的架构、处理大型数据集和调整超参数对于有效使用NN进行推荐至关重要。
尽管近年来取得了相关的进展但上述技术仍存在一些缺陷主要是它们具有任务特定性。
例如一个基于评分预测的推荐系统无法处理需要推荐与用户口味相符的前k个物品的任务。
实际上如果我们将这种限制扩展到其他“LLM之前”的AI解决方案我们可能会发现一些相似之处实际上正是这种任务特定的情况正在被LLM以及更广泛的Large
Models所革命化它们高度泛化并且能够根据用户的提示和指令适应各种任务。
因此关于LLM在多大程度上能够增强现有推荐模型的研究正在广泛展开。
在接下来的部分中我们将参考最近的论文和博客讨论这些新方法背后的理论。
在前几章中我们了解了如何通过三种主要方式定制LLM预训练、微调和提示。
根据Wenqi
Fan等人撰写的论文《大语言模型时代的推荐系统》Recommender
预训练为推荐系统预训练LLM是使LLM能够获取广泛的世界知识和用户偏好的重要步骤并能够以零样本或少量样本适应不同的推荐任务。
Gang等人在论文《推荐作为语言处理RLP统一的预训练、个性化提示与预测范式》Recommendation
P5是一个使用大语言模型LLM构建推荐系统的统一文本到文本范式。
它包含三个步骤
**预训练**基于T5架构的基础语言模型在大规模网络语料库上进行预训练并在推荐任务上进行微调。
**个性化提示**根据用户的行为数据和上下文特征为每个用户生成个性化提示。
**预测**将个性化提示输入到预训练的语言模型中生成推荐。
P5基于这样的理念即LLM可以编码广泛的世界知识和用户偏好并可以通过零样本或少量样本适应不同的推荐任务。
微调从头开始训练一个LLM是一项非常计算密集的活动。
一个替代且影响较小的方法是通过微调来定制一个用于推荐系统的LLM。
全模型微调根据特定任务的推荐数据集更改整个模型的权重。
参数高效微调仅更改一小部分权重或开发可训练的适配器以适应特定任务。
提示将LLM定制为推荐系统的第三种也是“最轻量”的方法是提示。
根据作者的说法有三种主要的提示LLM的技术
常规提示通过设计文本模板或提供一些输入输出示例将下游任务统一为语言生成任务。
上下文学习使LLM能够基于上下文信息学习新任务而无需进行微调。
思维链通过提供多个示例来描述思维链作为提示中的示例从而增强LLM的推理能力。
作者还讨论了每种技术的优势和挑战并提供了一些采用这些技术的现有方法的示例。
无论是哪种类型提示都是测试通用LLM能否处理推荐系统任务的最快方式。
LLM在推荐系统领域的应用正在引起研究界的兴趣并且如上所述已经有了一些有趣的结果。
在下一节中我们将使用提示方法并利用LangChain作为AI编排器的能力来实现我们自己的推荐应用程序。
现在我们已经讨论了一些关于推荐系统的理论以及LLM如何增强它们的最新研究让我们开始构建我们的推荐应用程序——一个名为MovieHarbor的电影推荐系统。
目标是使其尽可能通用也就是说我们希望我们的应用程序能够通过对话界面处理各种推荐任务。
我们将模拟所谓的“冷启动”场景即用户与推荐系统的第一次交互此时我们没有用户的偏好历史。
我们将利用一个包含文本描述的电影数据库来实现这一目的。
使用包含每部电影文本描述的数据集的原因是这样我们可以获得文本的嵌入。
让我们开始构建我们的MovieHarbor应用程序。
为了将LLM应用于我们的数据集我们首先需要对数据进行预处理。
初始数据集包含了多个列但我们感兴趣的列如下
Genres电影的适用类型列表。
Title电影标题。
Overview剧情的文本描述。
Vote_average给定电影的评分范围为1到10。
Vote_count给定电影的评分次数。
我不会在这里列出整个代码您可以在本书的GitHub仓库中找到完整代码地址是
首先我们将genres列转换为numpy数组这比数据集中原始的字典格式更容易处理
md[genres].apply(ast.literal_eval)
接下来我们将vote_average和vote_count列合并为一个列这个列是根据投票数量的加权评分。
我还将行限制在95百分位数的投票数量以内以便去除最低投票数以防止结果偏斜
calculate_weighted_rate(vote_average,
md[md[vote_count].notnull()][vote_count].astype(int)
calculate_weighted_rate(row[vote_average],
接下来我们创建一个名为combined_info的新列在该列中我们将合并所有要提供给LLM的上下文元素。
这些元素包括电影标题、简介、类型和评分
我们将电影的combined_info进行分词以便在嵌入时获得更好的结果
get_embeddingembedding_encoding
tiktoken.get_encoding(embedding_encoding)#
md_final.combined_info.apply(lambda
cl100k_base是OpenAI的嵌入API使用的一个分词器的名称。
分词器是一种工具它将文本字符串分割为称为token的单元然后这些token可以被神经网络处理。
不同的分词器有不同的规则和词汇来决定如何分割文本以及使用哪些token。
cl100k_base分词器基于字节对编码BPE算法它从大型语料库中学习子词单元的词汇。
cl100k_base分词器具有10万个token的词汇量这些token大多是常见的单词和单词片段但也包括一些标点符号、格式和控制的特殊token。
它可以处理多种语言和领域的文本并且每个输入最多可以编码8191个token。
md_final.rename(columns{embedding:
md_final.rename(columns{combined_info:
现在我们有了最终的数据集需要将其存储在一个向量数据库中。
为此我们将使用LanceDB这是一个开源的、带有持久存储的向量搜索数据库它极大地简化了嵌入的检索、过滤和管理并且还与LangChain提供了原生集成。
您可以通过以下命令轻松安装LanceDB
现在我们已经准备好了所有的基础数据和工具可以开始处理这些嵌入并构建我们的推荐系统了。
我们将从冷启动场景中的一个简单任务开始并逐步增加LangChain组件的复杂性。
之后我们还将尝试基于内容的场景以通过各种任务挑战我们的LLM。
针对所有自学遇到困难的同学们我帮大家系统梳理大模型学习脉络将这份
分享出来包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等,
[CSDN大礼包全网最全《LLM大模型入门进阶学习资源包》免费分享安全链接放心点击]()
在前面的章节中我们了解了冷启动场景——即在没有用户背景信息的情况下首次与用户互动——是推荐系统经常遇到的问题。
我们对用户的信息越少越难以将推荐与他们的偏好相匹配。
在本节中我们将使用LangChain和OpenAI的LLM模拟一个冷启动场景采用以下高级架构
在之前的部分中我们已经将嵌入保存到LanceDB中。
现在我们将构建一个LangChain的RetrievalQA检索器这是一个专为基于索引的问答而设计的链组件。
在我们的例子中我们将使用向量存储作为我们的索引检索器。
该链的想法是根据用户的查询返回最相似的前k部电影使用余弦相似度作为距离度量这是默认的度量方式。
docsearch.similarity_search(query)
以下是对应的输出我将显示输出的一个截断版本仅展示四个文档来源中的第一个
如您所见每个文档旁边都显示了所有的变量作为元数据并且距离也被作为得分报告。
距离越小用户查询与电影文本嵌入之间的接近程度越大。
一旦我们收集到最相似的文档我们就想要生成一个对话式的响应。
为此除了使用嵌入模型外我们还将使用OpenAI的完成模型GPT-3并将其与RetrievalQA结合
RetrievalQA.from_chain_type(llmOpenAI(),
retrieverdocsearch.as_retriever(),
由于我们设置了return_source_documentsTrue参数我们还可以检索文档来源
注意第一个报告的文档并不是模型推荐的文档。
这可能是因为评分较低而《变形金刚》则是第三个结果。
这是一个很好的例子展示了LLM如何在相似度之外考虑多个因素来向用户推荐电影。
模型能够生成对话式的答案但它仍然只使用了可用信息的一部分——文本概述。
如果我们希望我们的MovieHarbor系统也利用其他变量该怎么办我们可以通过两种方式来解决这个任务
“过滤器”方式这种方法包括在我们的检索器中添加一些过滤器作为kwargs这些可能是应用程序在响应用户之前所需的。
例如这些问题可能与电影的类型有关。
例如假设我们只想提供类型被标记为喜剧的电影结果。
你可以使用以下代码来实现
RetrievalQA.from_chain_type(llmOpenAI(),
chain_typestuff,retrieverdocsearch.as_retriever(search_kwargs{data:
过滤器也可以在元数据级别操作例如在以下示例中我们只想过滤评分高于7的结果
RetrievalQA.from_chain_type(llmOpenAI(),
chain_typestuff,retrieverdocsearch.as_retriever(search_kwargs{filter:
“代理”方式这可能是解决问题最创新的方式。
使我们的链成为代理意味着将检索器转换为工具代理在需要时可以利用这些工具包括其他变量。
通过这样做用户只需使用自然语言提供他们的偏好代理就可以在需要时检索最有希望的推荐。
让我们看看如何通过代码实现这一点特别要求一个动作电影因此过滤类型变量
langchain.agents.agent_toolkits
langchain.agents.agent_toolkits
create_conversational_retrieval_agent
docsearch.as_retriever(return_source_documentsTrue)
create_retriever_tool(retriever,movies,Searches
create_conversational_retrieval_agent(llm,
让我们看看思维链和输出始终基于根据余弦相似度得出的最相似的四部电影的结果
最后我们可能还希望使我们的应用程序更加符合其作为推荐系统的目标。
为此我们需要进行一些提示工程。
使用LangChain的预构建组件如RetrievalQA链的优势之一是它们自带预配置的、精心策划的提示模板。
在覆盖现有提示之前最好先检查它这样你就可以看到组件已经预期的变量在{}中。
print(qa.combine_documents_chain.llm_chain.prompt.template)
例如假设我们希望系统为每个用户的请求返回三个建议并简要描述剧情和用户可能喜欢它的原因。
以下是一个可能符合此目标的示例提示
PromptTemplate(templatetemplate,
PromptTemplate(templatetemplate,
RetrievalQA.from_chain_type(llmOpenAI(),chain_typestuff,retrieverdocsearch.as_retriever(),return_source_documentsTrue,chain_type_kwargschain_type_kwargs)
我们还可以在提示中加入我们希望设置为欢迎页面的对话预备问题收集到的信息。
例如在让用户输入自然语言问题之前我们可能希望询问他们的年龄、性别和喜欢的电影类型。
为此我们可以在提示中插入一个部分其中包含用户共享的信息然后将此提示部分与我们将传递给链的最终提示结合。
下面是一个示例为简单起见我们将直接设置变量而不向用户询问
PromptTemplate(templateCOMBINED_PROMPT,
RetrievalQA.from_chain_type(llmOpenAI(),chain_typestuff,retrieverdocsearch.as_retriever(),return_source_documentsTrue,chain_type_kwargschain_type_kwargs)
如您所见系统考虑了用户提供的信息。
当我们构建MovieHarbor的前端时我们将使这些信息成为动态的作为向用户提出的预备问题。
在上一节中我们讨论了冷启动场景在这种情况下系统对用户一无所知。
有时推荐系统已经掌握了一些关于用户的背景信息将这些知识嵌入我们的应用程序中是非常有用的。
举个例子假设我们有一个用户数据库系统已经存储了所有注册用户的信息如年龄、性别、国家等以及用户已经观看的电影及其评分。
为了实现这一点我们需要设置一个自定义提示以便能够从源中检索这些信息。
为了简单起见我们将创建一个包含用户信息的样本数据集该数据集只包含两个记录对应两个用户。
每个用户将展示以下变量用户名、年龄、性别以及一个包含已观看电影及其评分的字典。
让我们分解这个架构并检查每个步骤以构建最终的基于内容的系统聊天机器人从可用的用户数据开始
正如之前讨论的那样我们现在对用户的偏好有了一些了解。
更具体地说假设我们有一个包含用户属性姓名、年龄、性别以及他们对一些电影的评分评分从1到10不等的数据集。
以下是用于创建该数据集的代码
enumerate(data[movies]):movie_dict
现在我们要做的是应用与冷启动提示相同的逻辑并使用变量进行格式化。
不同之处在于这里我们不再要求用户提供这些变量的值而是直接从用户数据集中收集这些信息。
因此我们首先定义提示块
然后我们按如下方式格式化user_info块假设与系统交互的用户是Alice
df.loc[df[username]Alice][age][0]
df.loc[df[username]Alice][gender][0]
df[movies][0].items():output_string
PromptTemplate(templateCOMBINED_PROMPT,
RetrievalQA.from_chain_type(llmOpenAI(),chain_typestuff,retrieverdocsearch.as_retriever(),return_source_documentsTrue,chain_type_kwargschain_type_kwargs)
如您所见模型现在能够根据用户过去偏好的信息作为上下文从模型的元提示中检索向Alice推荐一系列电影。
请注意在这个场景中我们使用了一个简单的pandas数据框作为数据集。
在生产环境中存储与任务相关的变量如推荐任务的最佳实践是使用特征存储。
特征存储是旨在支持机器学习工作流的数据系统它们允许数据团队存储、管理和访问用于训练和部署机器学习模型的特征。
此外LangChain还提供了与一些最流行的特征存储的原生集成
Feast这是一个开源的机器学习特征存储。
它允许团队定义、管理、发现和服务特征。
Feast支持批处理和流数据源并与各种数据处理和存储系统集成。
Feast使用BigQuery进行离线特征存储并使用BigTable或Redis进行在线特征服务。
Tecton这是一个托管的特征平台提供了构建、部署和使用机器学习特征的完整解决方案。
Tecton允许用户在代码中定义特征对其进行版本控制并按照最佳实践将其部署到生产中。
此外它还与现有数据基础设施和机器学习平台如SageMaker和Kubeflow集成并使用Spark进行特征转换使用DynamoDB进行在线特征服务。
Featureform这是一个虚拟特征存储将现有的数据基础设施转变为特征存储。
Featureform允许用户使用标准特征定义和Python
SDK创建、存储和访问特征。
它编排和管理特征工程和物化所需的数据管道并兼容多种数据系统如Snowflake、Redis、Spark和Cassandra。
AzureML
Store这是一个新的工作空间类型允许用户发现、创建和操作化特征。
此服务与现有的数据存储、特征管道和机器学习平台如Azure
Databricks和Kubeflow集成。
此外它使用SQL、PySpark、SnowPark或Python进行特征转换并使用Parquet/S3或Cosmos
您可以在LangChain的博客上关于LangChain与特征存储的集成信息。
现在我们已经了解了基于LLM的推荐系统的逻辑是时候为我们的MovieHarbor提供一个GUI了。
为此我们将再次利用Streamlit并假设冷启动场景。
和往常一样您可以在本书的GitHub仓库中找到完整的Python代码Building-LLM-Powered-Applications。
和第六章的Globebotter应用程序一样在这种情况下您也需要创建一个.py文件通过streamlit
file.py在终端中运行。
在我们的例子中该文件将被命名为movieharbor.py。
st.set_page_config(page_titleMovieHarbor,
md.explode(genres)[genres].unique())#
RetrievalQA.from_chain_type(llmOpenAI(),
chain_typestuff,retrieverdocsearch.as_retriever(search_kwargs{data:
query})st.write(result[result])
通过这些步骤您现在已经创建了一个完整的、基于内容的电影推荐系统的前端应用程序用户可以通过简单的界面输入他们的偏好并获取个性化的电影推荐。
所以你可以看到仅仅通过几行代码我们就能够为MovieHarbor搭建一个网页应用程序。
基于这个模板你可以使用Streamlit的组件来自定义布局并将其调整为基于内容的场景。
此外你还可以根据自己的需求定制提示使推荐系统按照你的偏好进行操作。
在本章中我们探讨了LLM如何改变我们处理推荐系统任务的方式。
我们从分析构建推荐应用程序的当前策略和算法开始区分了各种场景协同过滤、基于内容、冷启动等以及不同的技术KNN、矩阵分解和神经网络。
接着我们进入了一个新的、正在兴起的研究领域即如何将LLM的强大功能应用于这个领域并探讨了最近几个月内进行的各种实验。
利用这些知识我们构建了一个由LLM驱动的电影推荐应用程序使用LangChain作为AI编排器Streamlit作为前端展示了LLM如何凭借其推理能力和泛化能力革新这一领域。
这只是一个示例说明了LLM不仅能开启新的前沿还能增强现有的研究领域。
针对所有自学遇到困难的同学们我帮大家系统梳理大模型学习脉络将这份
分享出来包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等,
[CSDN大礼包全网最全《LLM大模型入门进阶学习资源包》免费分享安全链接放心点击]()
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback