当前位置: 首页 > news >正文

商务网站建设与维护补考试卷微信小程序开发者文档

商务网站建设与维护补考试卷,微信小程序开发者文档,网站建设与网页设计实践报告,2023年不用做核酸了吗在上一章中#xff0c;我们介绍了构建对话应用程序的核心步骤。我们从一个基础的聊天机器人开始#xff0c;然后逐步添加了更复杂的组件#xff0c;例如记忆、非参数化知识和外部工具。借助LangChain的预构建组件以及Streamlit的UI渲染#xff0c;这一切都变得相对简单。尽…在上一章中我们介绍了构建对话应用程序的核心步骤。我们从一个基础的聊天机器人开始然后逐步添加了更复杂的组件例如记忆、非参数化知识和外部工具。借助LangChain的预构建组件以及Streamlit的UI渲染这一切都变得相对简单。尽管对话应用程序通常被视为生成式AI和LLM的“舒适区”但这些模型实际上涵盖了更广泛的应用领域。 在本章中我们将讨论如何使用LLM来增强推荐系统结合嵌入和生成模型。我们将学习如何使用LangChain作为框架创建一个利用最先进的LLM的推荐系统应用程序。 在本章中我们将涵盖以下主题 推荐系统的定义及其演变LLM如何影响这一研究领域使用LangChain构建推荐系统 针对所有自学遇到困难的同学们我帮大家系统梳理大模型学习脉络将这份 LLM大模型资料 分享出来包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 有需要的小伙伴可以 扫描下方二维码领取↓↓↓ [CSDN大礼包全网最全《LLM大模型入门进阶学习资源包》免费分享安全链接放心点击]() 技术要求 要完成本书中的任务您需要以下内容 一个Hugging Face账号和用户访问令牌。一个OpenAI账号和用户访问令牌。Python版本3.7.1或更高版本。 请确保安装了以下Python包langchain、python-dotenv、huggingface_hub、streamlit、lancedb、openai和tiktoken。这些包可以通过在终端中使用pip install命令轻松安装。 本章的代码可以在本书的GitHub仓库中找到地址是github.com/PacktPublis… 推荐系统简介 推荐系统是一种计算机程序旨在为电子商务网站和社交网络等数字平台的用户推荐物品。它利用大型数据集来建立用户喜好和兴趣的模型然后向个人用户推荐类似的物品。 根据使用的方法和数据推荐系统可以分为不同的类型。以下是一些常见的类型 协同过滤这种类型的推荐系统使用具有类似偏好的其他用户的评分或反馈。它假设过去喜欢某些物品的用户将来会喜欢类似的物品。例如如果用户A和用户B都喜欢电影X和Y那么如果用户B也喜欢电影Z算法可能会将电影Z推荐给用户A。 协同过滤可以进一步分为两种子类型基于用户的协同过滤和基于物品的协同过滤 基于用户的协同过滤查找与目标用户相似的用户并推荐他们喜欢的物品。基于物品的协同过滤查找与目标用户喜欢的物品相似的物品并推荐这些物品。 基于内容的过滤这种类型的推荐系统使用物品本身的特征或属性推荐与目标用户之前喜欢或互动过的物品相似的物品。它假设喜欢某个物品特定特征的用户会喜欢其他具有相似特征的物品。与基于物品的协同过滤的主要区别在于后者使用用户行为模式进行推荐而基于内容的过滤则使用物品本身的信息。例如如果用户A喜欢电影XX是一部由演员Y主演的喜剧片那么算法可能会推荐电影ZZ也是一部由演员Y主演的喜剧片。 混合过滤这种类型的推荐系统结合了协同过滤和基于内容的过滤方法以克服它们的一些局限性并提供更准确和多样化的推荐。例如YouTube使用混合过滤根据观看了类似视频的其他用户的评分和观看次数以及视频本身的特征和类别推荐视频。 基于知识的过滤这种类型的推荐系统使用有关领域和用户需求或偏好的显式知识或规则推荐满足特定标准或约束的物品。它不依赖于其他用户的评分或反馈而是基于用户的输入或查询。例如如果用户A想购买一台具有特定规格和预算的笔记本电脑算法可能会推荐一台符合这些标准的笔记本电脑。基于知识的推荐系统在评分历史很少或没有可用时或者物品复杂且可定制时效果很好。 在上述框架内可以使用各种机器学习技术我们将在下一节中讨论这些技术。 现有的推荐系统 现代推荐系统使用机器学习ML技术来基于以下数据更好地预测用户的偏好 用户行为数据关于用户与产品交互的见解。这些数据可以从用户评分、点击和购买记录等因素中获取。用户人口统计数据指用户的个人信息包括年龄、教育背景、收入水平和地理位置等详细信息。产品属性数据涉及产品特征的信息例如书籍的类型、电影的演员阵容或食品中的特定菜系。 截至目前一些最流行的ML技术包括K近邻K-nearest neighbors、降维dimensionality reduction和神经网络。让我们详细了解这些方法。 K近邻算法 K近邻KNN是一种可以用于分类和回归问题的机器学习算法。它通过找到距离新数据点最近的k个数据点k是用户在初始化算法之前设置的并使用它们的标签或值来进行预测。KNN基于一个假设即相似的数据点可能具有相似的标签或值。 KNN可以应用于推荐系统中的协同过滤包括基于用户的协同过滤和基于物品的协同过滤 基于用户的KNN 是一种协同过滤方法它使用具有类似品味或偏好的其他用户的评分或反馈来推荐物品。例如假设我们有三位用户Alice、Bob 和 Charlie。他们都在网上购买书籍并对其进行评分。Alice 和 Bob 都喜欢高评分《哈利·波特》系列和《霍比特人》这本书。系统会发现这个模式并认为 Alice 和 Bob 的品味相似。如果 Bob 还喜欢《权力的游戏》这本书而 Alice 尚未阅读系统就会向 Alice 推荐《权力的游戏》。这是因为系统假设既然 Alice 和 Bob 有相似的品味那么 Alice 也可能喜欢《权力的游戏》。基于物品的KNN 是另一种协同过滤方法它使用物品的属性或特征来向目标用户推荐类似的物品。例如考虑同样的用户及其对书籍的评分。系统注意到《哈利·波特》系列和《霍比特人》都得到了 Alice 和 Bob 的喜欢所以系统认为这两本书是相似的。如果 Charlie 读过并喜欢《哈利·波特》系统就会向 Charlie 推荐《霍比特人》。这是因为系统假设既然《哈利·波特》和《霍比特人》相似都被相同的用户喜欢Charlie 也可能喜欢《霍比特人》。 KNN是一种在推荐系统中广受欢迎的技术但它也存在一些缺陷 可扩展性当处理大数据集时KNN可能变得计算密集且缓慢因为它需要计算所有物品或用户之间的距离。冷启动问题对于新物品或新用户KNN面临挑战因为它们缺乏足够的交互历史数据难以找到有意义的邻居。数据稀疏性在数据稀疏的情况下KNN性能可能会下降因为缺少足够的邻居信息来做出准确的预测。特征相关性KNN将所有特征视为等同并假设所有特征在相似性计算中同等重要。这在某些场景下可能并不成立有些特征可能比其他特征更重要。K值选择选择适当的K值邻居数量可能是主观的并且会影响推荐的质量。K值太小可能导致噪声K值太大可能导致推荐过于宽泛。 一般来说KNN适用于小数据集、噪声较少的场景以免异常值、缺失值等影响距离度量和动态数据KNN是一种基于实例的方法不需要重新训练可以快速适应变化。 此外在推荐系统领域还广泛使用了其他技术如矩阵分解。 矩阵分解 矩阵分解是一种用于推荐系统的技术用于基于历史数据分析和预测用户偏好或行为。它通过将一个大的矩阵分解为两个或多个较小的矩阵揭示出数据模式中的潜在特征从而解决所谓的“维度灾难”。 定义 维度灾难指的是处理高维数据时出现的挑战。这导致复杂性增加、数据稀疏以及由于数据需求指数增长和潜在的过拟合而导致的分析和建模困难。 在推荐系统的背景下这种技术用于预测用户-物品交互矩阵中缺失的值该矩阵表示用户与各种物品如电影、产品或书籍的交互情况。 例如假设你有一个矩阵其中行代表用户列代表电影单元格包含评分从1到5分。然而并非所有用户都对所有电影进行了评分导致矩阵中存在许多缺失条目 电影1电影2电影3电影4用户14-5-用户2-3-2用户354-3 表7.1带有缺失数据的数据集示例 矩阵分解旨在将此矩阵分解为两个矩阵一个是用户矩阵另一个是电影矩阵维度数量减少即潜在因素。这些潜在因素可能代表像类型偏好或特定电影特征等属性。通过将这些矩阵相乘你可以预测缺失的评分并推荐用户可能喜欢的电影。 矩阵分解有不同的算法包括 奇异值分解SVD 将一个矩阵分解为三个单独的矩阵其中中间矩阵包含代表数据中不同成分重要性的奇异值。它广泛用于数据压缩、降维和推荐系统中的协同过滤。主成分分析PCA 是一种通过将数据转换到与主成分对齐的新坐标系中来降低数据维度的技术。这些成分捕捉了数据中最重要的变异性从而实现高效的分析和可视化。非负矩阵分解NMF 将矩阵分解为两个具有非负值的矩阵。它通常用于主题建模、图像处理和特征提取其中成分代表非负属性。 在推荐系统的背景下可能最流行的技术是SVD得益于其可解释性、灵活性以及处理缺失值和性能的能力。以下是如何在Python中使用numpy模块应用SVD的示例 import numpy as np # 你的用户-电影评分矩阵用实际数据替换 user_movie_matrix np.array([[4, 0, 5, 0],[0, 3, 0, 2],[5, 4, 0, 3] ]) # 应用SVD U, s, V np.linalg.svd(user_movie_matrix, full_matricesFalse) # 潜在因子的数量可以根据需要选择 num_latent_factors 2 # 使用选定的潜在因子重构原始矩阵 reconstructed_matrix U[:, :num_latent_factors] np.diag(s[:num_latent_factors]) V[:num_latent_factors, :] # 将负值替换为0 reconstructed_matrix np.maximum(reconstructed_matrix, 0) print(重构矩阵:) print(reconstructed_matrix) 以下是输出结果 重构矩阵: [[4.2972542 0. 4.71897811 0. ][1.08572801 2.27604748 0. 1.64449028][4.44777253 4.36821972 0.52207171 3.18082082]] 在这个示例中U矩阵包含用户相关的信息s矩阵包含奇异值V矩阵包含电影相关的信息。通过选择一定数量的潜在因子num_latent_factors可以在降维的情况下重构原始矩阵同时在np.linalg.svd函数中设置full_matricesFalse参数以确保分解的矩阵被截断为与选定的潜在因子数量一致的维度。 这些预测的评分可以用于向用户推荐具有较高预测评分的电影。矩阵分解使推荐系统能够发现用户偏好中的隐藏模式并基于这些模式进行个性化推荐。 矩阵分解在推荐系统中广泛使用尤其是在处理包含大量用户和物品的大型数据集时因为它能够高效地捕捉潜在因子或者当你希望基于潜在因子提供个性化推荐时因为它为每个用户和物品学习了独特的潜在表示。然而它也存在一些缺陷与KNN的技术类似 冷启动问题与KNN类似矩阵分解在处理交互历史有限或不存在的新物品或用户时面临挑战。由于它依赖于历史数据无法为新物品或用户提供有效的推荐。数据稀疏性随着用户和物品数量的增加用户-物品交互矩阵变得越来越稀疏从而导致准确预测缺失值的挑战。可扩展性对于大型数据集执行矩阵分解可能计算代价高且耗时。上下文限制矩阵分解通常仅考虑用户-物品交互忽略了时间、地点或其他用户属性等上下文信息。 因此近年来人们探索了神经网络NN作为替代方案以缓解这些缺陷。 针对所有自学遇到困难的同学们我帮大家系统梳理大模型学习脉络将这份 LLM大模型资料 分享出来包括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 Foundation Models所革命化它们高度泛化并且能够根据用户的提示和指令适应各种任务。因此关于LLM在多大程度上能够增强现有推荐模型的研究正在广泛展开。在接下来的部分中我们将参考最近的论文和博客讨论这些新方法背后的理论。 LLMs 如何改变推荐系统 在前几章中我们了解了如何通过三种主要方式定制LLM预训练、微调和提示。根据Wenqi Fan等人撰写的论文《大语言模型时代的推荐系统》Recommender systems in the Era of Large Language Models (LLMs)这些技术也可以用来将LLM定制为推荐系统 预训练为推荐系统预训练LLM是使LLM能够获取广泛的世界知识和用户偏好的重要步骤并能够以零样本或少量样本适应不同的推荐任务。 **注意** 一个推荐系统LLM的示例是P5由Shijie Gang等人在论文《推荐作为语言处理RLP统一的预训练、个性化提示与预测范式》Recommendation as Language Processing (RLP): A Unified Pretrain, Personalized Prompt Predict Paradigm (P5)中提出。 P5是一个使用大语言模型LLM构建推荐系统的统一文本到文本范式。它包含三个步骤 1. **预训练**基于T5架构的基础语言模型在大规模网络语料库上进行预训练并在推荐任务上进行微调。 1. **个性化提示**根据用户的行为数据和上下文特征为每个用户生成个性化提示。 1. **预测**将个性化提示输入到预训练的语言模型中生成推荐。P5基于这样的理念即LLM可以编码广泛的世界知识和用户偏好并可以通过零样本或少量样本适应不同的推荐任务。 微调从头开始训练一个LLM是一项非常计算密集的活动。一个替代且影响较小的方法是通过微调来定制一个用于推荐系统的LLM。 更具体地说论文的作者回顾了两种主要的微调LLM的策略 全模型微调根据特定任务的推荐数据集更改整个模型的权重。参数高效微调仅更改一小部分权重或开发可训练的适配器以适应特定任务。 提示将LLM定制为推荐系统的第三种也是“最轻量”的方法是提示。根据作者的说法有三种主要的提示LLM的技术 常规提示通过设计文本模板或提供一些输入输出示例将下游任务统一为语言生成任务。上下文学习使LLM能够基于上下文信息学习新任务而无需进行微调。思维链通过提供多个示例来描述思维链作为提示中的示例从而增强LLM的推理能力。作者还讨论了每种技术的优势和挑战并提供了一些采用这些技术的现有方法的示例。 无论是哪种类型提示都是测试通用LLM能否处理推荐系统任务的最快方式。 LLM在推荐系统领域的应用正在引起研究界的兴趣并且如上所述已经有了一些有趣的结果。在下一节中我们将使用提示方法并利用LangChain作为AI编排器的能力来实现我们自己的推荐应用程序。 实现一个基于LLM的推荐系统 现在我们已经讨论了一些关于推荐系统的理论以及LLM如何增强它们的最新研究让我们开始构建我们的推荐应用程序——一个名为MovieHarbor的电影推荐系统。目标是使其尽可能通用也就是说我们希望我们的应用程序能够通过对话界面处理各种推荐任务。我们将模拟所谓的“冷启动”场景即用户与推荐系统的第一次交互此时我们没有用户的偏好历史。我们将利用一个包含文本描述的电影数据库来实现这一目的。 为此我们将使用Kaggle上的Movie recommendation data数据集该数据集可以在 此处 获取。 使用包含每部电影文本描述的数据集的原因是这样我们可以获得文本的嵌入。让我们开始构建我们的MovieHarbor应用程序。 数据预处理 为了将LLM应用于我们的数据集我们首先需要对数据进行预处理。初始数据集包含了多个列但我们感兴趣的列如下 Genres电影的适用类型列表。Title电影标题。Overview剧情的文本描述。Vote_average给定电影的评分范围为1到10。Vote_count给定电影的评分次数。 我不会在这里列出整个代码您可以在本书的GitHub仓库中找到完整代码地址是 此处但我会分享数据预处理的主要步骤 首先我们将genres列转换为numpy数组这比数据集中原始的字典格式更容易处理 import pandas as pd import ast # 将字典的字符串表示转换为实际的字典 md[genres] md[genres].apply(ast.literal_eval) # 转换 genres 列 md[genres] md[genres].apply(lambda x: [genre[name] for genre in x]) 接下来我们将vote_average和vote_count列合并为一个列这个列是根据投票数量的加权评分。我还将行限制在95百分位数的投票数量以内以便去除最低投票数以防止结果偏斜 # 计算加权评分 (IMDb 公式) def calculate_weighted_rate(vote_average, vote_count, min_vote_count10):return (vote_count / (vote_count min_vote_count)) * vote_average (min_vote_count / (vote_count min_vote_count)) * 5.0# 防止结果偏斜的最低投票数 vote_counts md[md[vote_count].notnull()][vote_count].astype(int) min_vote_count vote_counts.quantile(0.95)# 创建新列 weighted_rate md[weighted_rate] md.apply(lambda row: calculate_weighted_rate(row[vote_average], row[vote_count], min_vote_count), axis1) 接下来我们创建一个名为combined_info的新列在该列中我们将合并所有要提供给LLM的上下文元素。这些元素包括电影标题、简介、类型和评分 md_final[combined_info] md_final.apply(lambda row: fTitle: {row[title]}. Overview: {row[overview]} Genres: {, .join(row[genres])}. Rating: {row[weighted_rate]}, axis1).astype(str) 我们将电影的combined_info进行分词以便在嵌入时获得更好的结果 import pandas as pd import tiktoken import os import openaiopenai.api_key os.environ[OPENAI_API_KEY] from openai.embeddings_utils import get_embeddingembedding_encoding cl100k_base # text-embedding-ada-002 的编码 max_tokens 8000 # text-embedding-ada-002 的最大值是8191 encoding tiktoken.get_encoding(embedding_encoding)# 忽略过长的文本 md_final[n_tokens] md_final.combined_info.apply(lambda x: len(encoding.encode(x))) md_final md_final[md_final.n_tokens max_tokens] 定义 cl100k_base是OpenAI的嵌入API使用的一个分词器的名称。分词器是一种工具它将文本字符串分割为称为token的单元然后这些token可以被神经网络处理。不同的分词器有不同的规则和词汇来决定如何分割文本以及使用哪些token。 cl100k_base分词器基于字节对编码BPE算法它从大型语料库中学习子词单元的词汇。cl100k_base分词器具有10万个token的词汇量这些token大多是常见的单词和单词片段但也包括一些标点符号、格式和控制的特殊token。它可以处理多种语言和领域的文本并且每个输入最多可以编码8191个token。 我们使用text-embedding-ada-002嵌入文本 md_final[embedding] md_final.overview.apply(lambda x: get_embedding(x, engineembedding_model)) 在更改了一些列的名称并删除不必要的列后最终的数据集如下所示 让我们来看一下随机一行文本 md[text][0] 输出结果如下 Title: GoldenEye. Overview: James Bond must unmask the mysterious head of the Janus Syndicate and prevent the leader from utilizing the GoldenEye weapons system to inflict devastating revenge on Britain. Genres: Adventure, Action, Thriller. Rating: 6.173464373464373 我们将进行的最后一次修改是更改一些命名约定和数据类型如下所示 md_final.rename(columns{embedding: vector}, inplaceTrue) md_final.rename(columns{combined_info: text}, inplaceTrue) md_final.to_pickle(movies.pkl) 现在我们有了最终的数据集需要将其存储在一个向量数据库中。为此我们将使用LanceDB这是一个开源的、带有持久存储的向量搜索数据库它极大地简化了嵌入的检索、过滤和管理并且还与LangChain提供了原生集成。您可以通过以下命令轻松安装LanceDB pip install lancedb 然后我们可以将数据存储在LanceDB中 import lancedburi data/sample-lancedb db lancedb.connect(uri) table db.create_table(movies, md) 现在我们已经准备好了所有的基础数据和工具可以开始处理这些嵌入并构建我们的推荐系统了。我们将从冷启动场景中的一个简单任务开始并逐步增加LangChain组件的复杂性。之后我们还将尝试基于内容的场景以通过各种任务挑战我们的LLM。 针对所有自学遇到困难的同学们我帮大家系统梳理大模型学习脉络将这份 LLM大模型资料 分享出来包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 有需要的小伙伴可以 扫描下方二维码领取↓↓↓ [CSDN大礼包全网最全《LLM大模型入门进阶学习资源包》免费分享安全链接放心点击]() 在冷启动场景中构建一个QA推荐聊天机器人 在前面的章节中我们了解了冷启动场景——即在没有用户背景信息的情况下首次与用户互动——是推荐系统经常遇到的问题。我们对用户的信息越少越难以将推荐与他们的偏好相匹配。 在本节中我们将使用LangChain和OpenAI的LLM模拟一个冷启动场景采用以下高级架构 在之前的部分中我们已经将嵌入保存到LanceDB中。现在我们将构建一个LangChain的RetrievalQA检索器这是一个专为基于索引的问答而设计的链组件。在我们的例子中我们将使用向量存储作为我们的索引检索器。该链的想法是根据用户的查询返回最相似的前k部电影使用余弦相似度作为距离度量这是默认的度量方式。 让我们开始构建这个链 我们仅使用电影的简介作为信息输入 from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import LanceDB import osos.environ[OPENAI_API_KEY] embeddings OpenAIEmbeddings() docsearch LanceDB(connectiontable, embeddingembeddings)query Im looking for an animated action movie. What could you suggest to me? docs docsearch.similarity_search(query) docs 以下是对应的输出我将显示输出的一个截断版本仅展示四个文档来源中的第一个 [Document(page_contentTitle: Hitman: Agent 47. Overview: An assassin teams up with a woman to help her find her father and uncover the mysteries of her ancestry. Genres: Action, Crime, Thriller. Rating: 5.365800865800866, metadata{genres: array([Action, Crime, Thriller], dtypeobject), title: Hitman: Agent 47, overview: An assassin teams up with a woman to help her find her father and uncover the mysteries of her ancestry., weighted_rate: 5.365800865800866, n_tokens: 52, vector: array([-0.00566491, -0.01658553, […] 如您所见每个文档旁边都显示了所有的变量作为元数据并且距离也被作为得分报告。距离越小用户查询与电影文本嵌入之间的接近程度越大。 一旦我们收集到最相似的文档我们就想要生成一个对话式的响应。为此除了使用嵌入模型外我们还将使用OpenAI的完成模型GPT-3并将其与RetrievalQA结合 qa RetrievalQA.from_chain_type(llmOpenAI(), chain_typestuff, retrieverdocsearch.as_retriever(), return_source_documentsTrue) query Im looking for an animated action movie. What could you suggest to me? result qa({query: query}) result[result] 让我们看看输出结果 I would suggest Transformers. It is an animated action movie with genres of Adventure, Science Fiction, and Action, and a rating of 6. 由于我们设置了return_source_documentsTrue参数我们还可以检索文档来源 result[source_documents][0] 以下是输出结果 Document(page_contentTitle: Hitman: Agent 47. Overview: An assassin teams up with a woman to help her find her father and uncover the mysteries of her ancestry. Genres: Action, Crime, Thriller. Rating: 5.365800865800866, metadata{genres: array([Action, Crime, Thriller], dtypeobject), title: Hitman: Agent 47, overview: An assassin teams up with a woman to help her find her father and uncover the mysteries of her ancestry., weighted_rate: 5.365800865800866, n_tokens: 52, vector: array([-0.00566491, -0.01658553, -0.02255735, ..., -0.01242317, -0.01303058, -0.00709073], dtypefloat32), _distance: 0.42414575815200806}) 注意第一个报告的文档并不是模型推荐的文档。这可能是因为评分较低而《变形金刚》则是第三个结果。这是一个很好的例子展示了LLM如何在相似度之外考虑多个因素来向用户推荐电影。 模型能够生成对话式的答案但它仍然只使用了可用信息的一部分——文本概述。如果我们希望我们的MovieHarbor系统也利用其他变量该怎么办我们可以通过两种方式来解决这个任务 “过滤器”方式这种方法包括在我们的检索器中添加一些过滤器作为kwargs这些可能是应用程序在响应用户之前所需的。例如这些问题可能与电影的类型有关。 例如假设我们只想提供类型被标记为喜剧的电影结果。你可以使用以下代码来实现 df_filtered md[md[genres].apply(lambda x: Comedy in x)] qa RetrievalQA.from_chain_type(llmOpenAI(), chain_typestuff,retrieverdocsearch.as_retriever(search_kwargs{data: df_filtered}), return_source_documentsTrue) query Im looking for a movie with animals and an adventurous plot. result qa({query: query}) 过滤器也可以在元数据级别操作例如在以下示例中我们只想过滤评分高于7的结果 qa RetrievalQA.from_chain_type(llmOpenAI(), chain_typestuff,retrieverdocsearch.as_retriever(search_kwargs{filter: {weighted_rate__gt:7}}), return_source_documentsTrue) “代理”方式这可能是解决问题最创新的方式。使我们的链成为代理意味着将检索器转换为工具代理在需要时可以利用这些工具包括其他变量。通过这样做用户只需使用自然语言提供他们的偏好代理就可以在需要时检索最有希望的推荐。 让我们看看如何通过代码实现这一点特别要求一个动作电影因此过滤类型变量 from langchain.agents.agent_toolkits import create_retriever_tool from langchain.agents.agent_toolkits import create_conversational_retrieval_agent from langchain.chat_models import ChatOpenAIllm ChatOpenAI(temperature0) retriever docsearch.as_retriever(return_source_documentsTrue) tool create_retriever_tool(retriever,movies,Searches and returns recommendations about movies. ) tools [tool] agent_executor create_conversational_retrieval_agent(llm, tools, verboseTrue) result agent_executor({input: suggest me some action movies}) 让我们看看思维链和输出始终基于根据余弦相似度得出的最相似的四部电影的结果 Entering new AgentExecutor chain... Invoking: movies with {genre: action} [Document(page_contentThe action continues from [REC], […] Here are some action movies that you might enjoy: 1. [REC]² - The action continues from [REC], with a medical officer and a SWAT team sent into a sealed-off apartment to control the situation. It is a thriller/horror movie. 2. The Boondock Saints - Twin brothers Conner and Murphy take swift retribution into their own hands to rid Boston of criminals. It is an action/thriller/crime movie. 3. The Gamers - Four clueless players are sent on a quest to rescue a princess and must navigate dangerous forests, ancient ruins, and more. It is an action/comedy/thriller/foreign movie. 4. Atlas Shrugged Part III: Who is John Galt? - In a collapsing economy, one man has the answer while others try to control or save him. It is a drama/science fiction/mystery movie. Please note that these recommendations are based on the genre action and may vary in terms of availability and personal preferences.Finished chain. 最后我们可能还希望使我们的应用程序更加符合其作为推荐系统的目标。为此我们需要进行一些提示工程。 注意 使用LangChain的预构建组件如RetrievalQA链的优势之一是它们自带预配置的、精心策划的提示模板。在覆盖现有提示之前最好先检查它这样你就可以看到组件已经预期的变量在{}中。 要探索现有的提示你可以运行以下代码 print(qa.combine_documents_chain.llm_chain.prompt.template) 输出结果如下 Use the following pieces of context to answer the question at the end. If you dont know the answer, just say that you dont know, dont try to make up an answer. {context} Question: {question} Helpful Answer: 例如假设我们希望系统为每个用户的请求返回三个建议并简要描述剧情和用户可能喜欢它的原因。以下是一个可能符合此目标的示例提示 from langchain.prompts import PromptTemplatetemplate You are a movie recommender system that help users to find movies that match their preferences. Use the following pieces of context to answer the question at the end. For each question, suggest three movies, with a short description of the plot and the reason why the user might like it. If you dont know the answer, just say that you dont know, dont try to make up an answer. {context} Question: {question} Your response:PROMPT PromptTemplate(templatetemplate, input_variables[context, question]) 现在我们需要将其传递到我们的链中 PROMPT PromptTemplate(templatetemplate, input_variables[context, question]) chain_type_kwargs {prompt: PROMPT} qa RetrievalQA.from_chain_type(llmOpenAI(),chain_typestuff,retrieverdocsearch.as_retriever(),return_source_documentsTrue,chain_type_kwargschain_type_kwargs) query Im looking for a funny action movie, any suggestion? result qa({query:query}) print(result[result]) 得到以下输出 1. A Good Day to Die Hard: An action-packed comedy directed by John Moore, this movie follows Iconoclastic, take-no-prisoners cop John McClane as he travels to Moscow to help his wayward son Jack. With the Russian underworld in pursuit, and battling a countdown to war, the two McClanes discover that their opposing methods make them unstoppable heroes. 2. The Hidden: An alien is on the run in America and uses the bodies of anyone in its way as a hiding place. With lots of innocent people dying in the chase, this action-packed horror movie is sure to keep you laughing. 3. District B13: Set in the ghettos of Paris in 2010, this action-packed science fiction movie follows an undercover cop and ex-thug as they try to infiltrate a gang in order to defuse a neutron bomb. A thrilling comedy that will keep you laughing. 我们还可以在提示中加入我们希望设置为欢迎页面的对话预备问题收集到的信息。例如在让用户输入自然语言问题之前我们可能希望询问他们的年龄、性别和喜欢的电影类型。为此我们可以在提示中插入一个部分其中包含用户共享的信息然后将此提示部分与我们将传递给链的最终提示结合。下面是一个示例为简单起见我们将直接设置变量而不向用户询问 from langchain.prompts import PromptTemplatetemplate_prefix You are a movie recommender system that help users to find movies that match their preferences. Use the following pieces of context to answer the question at the end. If you dont know the answer, just say that you dont know, dont try to make up an answer. {context}user_info This is what we know about the user, and you can use this information to better tune your research: Age: {age} Gender: {gender}template_suffix Question: {question} Your response:user_info user_info.format(age18, genderfemale) COMBINED_PROMPT template_prefix \n user_info \n template_suffix print(COMBINED_PROMPT) 输出结果如下 You are a movie recommender system that help users to find movies that match their preferences. Use the following pieces of context to answer the question at the end. If you dont know the answer, just say that you dont know, dont try to make up an answer. {context} This is what we know about the user, and you can use this information to better tune your research: Age: 18 Gender: female Question: {question} Your response: 现在让我们格式化提示并传递到我们的链中 PROMPT PromptTemplate(templateCOMBINED_PROMPT, input_variables[context, question]) chain_type_kwargs {prompt: PROMPT} qa RetrievalQA.from_chain_type(llmOpenAI(),chain_typestuff,retrieverdocsearch.as_retriever(),return_source_documentsTrue,chain_type_kwargschain_type_kwargs) result qa({query: query}) result[result] 我们得到以下输出 Sure, I can suggest some action movies for you. Here are a few examples: A Good Day to Die Hard, Goldfinger, Ong Bak 2, and The Raid 2. All of these movies have high ratings and feature thrilling action elements. I hope you find something that you enjoy! 如您所见系统考虑了用户提供的信息。当我们构建MovieHarbor的前端时我们将使这些信息成为动态的作为向用户提出的预备问题。 构建基于内容的系统 在上一节中我们讨论了冷启动场景在这种情况下系统对用户一无所知。有时推荐系统已经掌握了一些关于用户的背景信息将这些知识嵌入我们的应用程序中是非常有用的。举个例子假设我们有一个用户数据库系统已经存储了所有注册用户的信息如年龄、性别、国家等以及用户已经观看的电影及其评分。 为了实现这一点我们需要设置一个自定义提示以便能够从源中检索这些信息。为了简单起见我们将创建一个包含用户信息的样本数据集该数据集只包含两个记录对应两个用户。每个用户将展示以下变量用户名、年龄、性别以及一个包含已观看电影及其评分的字典。 以下是表示这一高级架构的示意图 让我们分解这个架构并检查每个步骤以构建最终的基于内容的系统聊天机器人从可用的用户数据开始 正如之前讨论的那样我们现在对用户的偏好有了一些了解。更具体地说假设我们有一个包含用户属性姓名、年龄、性别以及他们对一些电影的评分评分从1到10不等的数据集。以下是用于创建该数据集的代码 import pandas as pd data {username: [Alice, Bob],age: [25, 32],gender: [F, M],movies: [[(Transformers: The Last Knight, 7), (Pokémon: Spell of the Unknown, 5)],[(Bon Cop Bad Cop 2, 8), (Goon: Last of the Enforcers, 9)]] } # 将 movies 列转换为字典 for i, row_movies in enumerate(data[movies]):movie_dict {}for movie, rating in row_movies:movie_dict[movie] ratingdata[movies][i] movie_dict # 创建一个 pandas DataFrame df pd.DataFrame(data) df.head() 得到以下输出 图7.4样本用户数据集 现在我们要做的是应用与冷启动提示相同的逻辑并使用变量进行格式化。不同之处在于这里我们不再要求用户提供这些变量的值而是直接从用户数据集中收集这些信息。因此我们首先定义提示块 template_prefix You are a movie recommender system that help users to find movies that match their preferences. Use the following pieces of context to answer the question at the end. If you dont know the answer, just say that you dont know, dont try to make up an answer. {context} user_info This is what we know about the user, and you can use this information to better tune your research: Age: {age} Gender: {gender} Movies already seen alongside with rating: {movies} template_suffix Question: {question} Your response: 然后我们按如下方式格式化user_info块假设与系统交互的用户是Alice age df.loc[df[username]Alice][age][0] gender df.loc[df[username]Alice][gender][0] movies # 遍历字典并输出电影名称和评分 for movie, rating in df[movies][0].items():output_string fMovie: {movie}, Rating: {rating} \nmovies output_string user_info user_info.format(ageage, gendergender, moviesmovies) COMBINED_PROMPT template_prefix \n user_info \n template_suffix print(COMBINED_PROMPT) 以下是输出结果 You are a movie recommender system that help users to find movies that match their preferences. Use the following pieces of context to answer the question at the end. If you dont know the answer, just say that you dont know, dont try to make up an answer. {context} This is what we know about the user, and you can use this information to better tune your research: Age: 25 Gender: F Movies already seen alongside with rating: Movie: Transformers: The Last Knight, Rating: 7 Movie: Pokémon: Spell of the Unknown, Rating: 5 Question: {question} Your response: 现在让我们在链中使用这个提示 PROMPT PromptTemplate(templateCOMBINED_PROMPT, input_variables[context, question]) chain_type_kwargs {prompt: PROMPT} qa RetrievalQA.from_chain_type(llmOpenAI(),chain_typestuff,retrieverdocsearch.as_retriever(),return_source_documentsTrue,chain_type_kwargschain_type_kwargs) query Can you suggest me some action movie based on my background? result qa({query: query}) result[result] 我们得到以下输出 Based on your age, gender, and the movies youve already seen, I would suggest the following action movies: The Raid 2 (Action, Crime, Thriller; Rating: 6.71), Ong Bak 2 (Adventure, Action, Thriller; Rating: 5.24), Hitman: Agent 47 (Action, Crime, Thriller; Rating: 5.37), and Kingsman: The Secret Service (Crime, Comedy, Action, Adventure; Rating: 7.43). 如您所见模型现在能够根据用户过去偏好的信息作为上下文从模型的元提示中检索向Alice推荐一系列电影。 请注意在这个场景中我们使用了一个简单的pandas数据框作为数据集。在生产环境中存储与任务相关的变量如推荐任务的最佳实践是使用特征存储。特征存储是旨在支持机器学习工作流的数据系统它们允许数据团队存储、管理和访问用于训练和部署机器学习模型的特征。 此外LangChain还提供了与一些最流行的特征存储的原生集成 Feast这是一个开源的机器学习特征存储。它允许团队定义、管理、发现和服务特征。Feast支持批处理和流数据源并与各种数据处理和存储系统集成。Feast使用BigQuery进行离线特征存储并使用BigTable或Redis进行在线特征服务。Tecton这是一个托管的特征平台提供了构建、部署和使用机器学习特征的完整解决方案。Tecton允许用户在代码中定义特征对其进行版本控制并按照最佳实践将其部署到生产中。此外它还与现有数据基础设施和机器学习平台如SageMaker和Kubeflow集成并使用Spark进行特征转换使用DynamoDB进行在线特征服务。Featureform这是一个虚拟特征存储将现有的数据基础设施转变为特征存储。Featureform允许用户使用标准特征定义和Python SDK创建、存储和访问特征。它编排和管理特征工程和物化所需的数据管道并兼容多种数据系统如Snowflake、Redis、Spark和Cassandra。AzureML Managed Feature Store这是一个新的工作空间类型允许用户发现、创建和操作化特征。此服务与现有的数据存储、特征管道和机器学习平台如Azure Databricks和Kubeflow集成。此外它使用SQL、PySpark、SnowPark或Python进行特征转换并使用Parquet/S3或Cosmos DB进行特征存储。 您可以在LangChain的博客上关于LangChain与特征存储的集成信息。 使用Streamlit开发前端 现在我们已经了解了基于LLM的推荐系统的逻辑是时候为我们的MovieHarbor提供一个GUI了。为此我们将再次利用Streamlit并假设冷启动场景。和往常一样您可以在本书的GitHub仓库中找到完整的Python代码Building-LLM-Powered-Applications。 和第六章的Globebotter应用程序一样在这种情况下您也需要创建一个.py文件通过streamlit run file.py在终端中运行。在我们的例子中该文件将被命名为movieharbor.py。 现在让我们总结一下构建前端应用程序的关键步骤 配置应用程序网页 import streamlit as st st.set_page_config(page_titleMovieHarbor, page_icon) st.header( Welcome to MovieHarbor, your favourite movie recommender) 导入凭证并建立与LanceDB的连接 load_dotenv() openai_api_key os.environ[OPENAI_API_KEY] embeddings OpenAIEmbeddings() uri data/sample-lancedb db lancedb.connect(uri) table db.open_table(movies) docsearch LanceDB(connectiontable, embeddingembeddings)# 导入电影数据集 md pd.read_pickle(movies.pkl) 创建小部件供用户定义他们的特征和电影偏好 # 为用户输入创建侧边栏 st.sidebar.title(Movie Recommendation System) st.sidebar.markdown(Please enter your details and preferences below:)# 询问用户年龄、性别和最喜欢的电影类型 age st.sidebar.slider(What is your age?, 1, 100, 25) gender st.sidebar.radio(What is your gender?, (Male, Female, Other)) genre st.sidebar.selectbox(What is your favourite movie genre?, md.explode(genres)[genres].unique())# 根据用户输入过滤电影 df_filtered md[md[genres].apply(lambda x: genre in x)] 定义参数化的提示块 template_prefix You are a movie recommender system that helps users to find movies that match their preferences. Use the following pieces of context to answer the question at the end. If you dont know the answer, just say that you dont know, dont try to make up an answer. {context}user_info This is what we know about the user, and you can use this information to better tune your research: Age: {age} Gender: {gender}template_suffix Question: {question} Your response:user_info user_info.format(ageage, gendergender) COMBINED_PROMPT template_prefix \n user_info \n template_suffix print(COMBINED_PROMPT) 设置RetrievalQA链 # 设置链 qa RetrievalQA.from_chain_type(llmOpenAI(), chain_typestuff,retrieverdocsearch.as_retriever(search_kwargs{data: df_filtered}), return_source_documentsTrue) 为用户插入搜索栏 query st.text_input(Enter your question:, placeholderWhat action movies do you suggest?) if query:result qa({query: query})st.write(result[result]) 就这样您可以通过在终端中运行streamlit run movieharbor.py来查看最终结果。运行结果如下所示 通过这些步骤您现在已经创建了一个完整的、基于内容的电影推荐系统的前端应用程序用户可以通过简单的界面输入他们的偏好并获取个性化的电影推荐。 所以你可以看到仅仅通过几行代码我们就能够为MovieHarbor搭建一个网页应用程序。基于这个模板你可以使用Streamlit的组件来自定义布局并将其调整为基于内容的场景。此外你还可以根据自己的需求定制提示使推荐系统按照你的偏好进行操作。 总结 在本章中我们探讨了LLM如何改变我们处理推荐系统任务的方式。我们从分析构建推荐应用程序的当前策略和算法开始区分了各种场景协同过滤、基于内容、冷启动等以及不同的技术KNN、矩阵分解和神经网络。 接着我们进入了一个新的、正在兴起的研究领域即如何将LLM的强大功能应用于这个领域并探讨了最近几个月内进行的各种实验。 利用这些知识我们构建了一个由LLM驱动的电影推荐应用程序使用LangChain作为AI编排器Streamlit作为前端展示了LLM如何凭借其推理能力和泛化能力革新这一领域。这只是一个示例说明了LLM不仅能开启新的前沿还能增强现有的研究领域。 针对所有自学遇到困难的同学们我帮大家系统梳理大模型学习脉络将这份 LLM大模型资料 分享出来包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 有需要的小伙伴可以 扫描下方二维码领取↓↓↓ [CSDN大礼包全网最全《LLM大模型入门进阶学习资源包》免费分享安全链接放心点击]()
http://www.dnsts.com.cn/news/198723.html

相关文章:

  • 检测网站是否被做跳转图片展示网站模板
  • 如何查看网站的建设者wordpress百家
  • 五家渠建设局网站wordpress修改语言包目录
  • 基于ASP与Access数据库的网站开发电子商务网站建设书
  • 大连专业制作网站视频网站中滑动列表怎么做的
  • 新网站没有死链接怎么做在线商城平台
  • 广东网站建设公司报价陕西省建设工程招投标信息网官网
  • 网站的网络推广个人二级网站怎么做
  • 可信赖的响应式网站聊城网站优化信息
  • 网站后台编辑器不能用云网站系统
  • 临安市建设局网站网络推广 网站制作
  • 郑州做营销型网站黄金多少钱一克
  • 菜鸟建站网wordpress 小蘑菇
  • 网站建设 培训班 成都产品推广方法有哪些
  • 门户网站是网络表达吗广告传媒有限公司
  • 进地铁建设公司网站关键词排名推广
  • 浙江省通信管理局 网站备案 管理部门wordpress微信分享图
  • 南京做网站公司地点公众号推送怎么制作
  • 厦门网站模板响应式网站制作教程
  • 绿色食品网站开发步骤平台网站开发公司
  • 网站建设就找奇思网络游戏定制公司
  • 网络营销 网站北京大型商场
  • 辽宁高速公路建设局网站wordpress做管理系统
  • 电商网站简单html模板下载系统开发立项报告
  • 四川建设厅网站招聘关于电子商务网站建设的现状
  • 自己怎样做免费网站网站公司做网站修改会收费吗
  • 博物馆网站制作做音响网站
  • 梁山县城市建设局网站东莞 营销网站制作
  • 重庆建设行业网站网站优化主要优化哪些地方
  • 网站设计公司北京网络营销是什么的思维导图