基于大型语言模型和向量数据库开发新闻推荐系统 (基于大型语言模型的空间语义测评霍世图计算语言学)

教程大全 2025-07-19 12:23:54 浏览

近年来,随着诸如ChatGPT、Bard等生成式人工智能工具的发布,大型语言模型(LLM)在机器学习社区引起了全球热议。这些解决方案背后的核心思想之一是计算非结构化数据(如文本和图像)的数字表示,并找出这些表示之间的相似之处。

基于大型语言模型的空间语义测评霍世图计算语言学

然而,将所有这些概念应用到生产环境中存在其自身的一系列机器学习工程挑战:

1.使用句子转换器生成嵌入

首先,我们需要找到一种将输入数据转换为向量的方法,我们称之为嵌入(如果你想深入了解嵌入概念,我推荐您阅读一下Boykis的文章《什么是嵌入?》,参考引文3:)。

因此,首先让我们来看看我们可以使用NPR数据集处理什么样的数据:

import pandas as pddf = pd.read_parquet("articles.parquet")df.Tail()

NPR数据集提供的样本数据(图片由作者本人生成)

NPR数据集提供了一些有趣的文本数据,如文章的标题和正文内容等。我们可以在嵌入生成过程中使用它们,如下图所示:

嵌入生成过程(作者本人提供的图片)

这样一来,一旦我们从输入数据中定义了文本特征,我们就需要建立一个嵌入模型来生成我们的数字表示。幸运的是,存在像HuggingFace这样的网站,你可以在那里寻找适合特定语言或任务的预训练模型。在我们的例子中,我们可以使用neuralmind/bert-base-portuguese-cased模型,该模型是用巴西葡萄牙语训练的,用于以下任务:

from sentence_transformers import SentenceTransformermodel_name = "neuralmind/bert-base-portuguese-cased"encoder = SentenceTransformer(model_name_or_path=model_name)title = """ Paraguaios vão às urnas neste domingo (30) para escolher novo presidente"""sentence = titlesentence_embedding = encoder.encode(sentence)print (sentence_embedding)# output: np.array([-0.2875876, 0.0356041, 0.31462672, 0.06252239, ...])

根据这里的代码逻辑,给定一个样本输入数据,我们就可以将标题和标签内容连接到单个文本中,并将其传递给编码器以生成文本嵌入。我们可以对NPR数据集中的所有其他文章应用于上面相同的过程:

def generate_item_sentence(item: pd.Series, text_columns=["title"]) -> str: return ' '.join([item[column] for column in text_columns])df["sentence"] = df.apply(generate_item_sentence, axis=1)df["sentence_embedding"] = df["sentence"].apply(encoder.encode)

请注意:上面这个过程可能需要耗费更长的时间,具体情况取决于您的机器的处理能力。

一旦我们有了所有新闻文章的嵌入;接下来,我们就可以定义一个存储它们的策略了。

2.存储嵌入

由于生成嵌入可能是一个昂贵的过程;因此,我们可以使用向量数据库来存储这些嵌入并基于不同的策略执行有关查询。

目前,已经存在几个向量数据库软件可以实现这项任务,但我将在本文中选择使用Qdrant,这是一个开源解决方案,它提供了可用于Python、Go和Typescript等多种流行编程语言的API支持。为了更好地比较这些向量数据库,请查看引文4来了解更多有关详情。

Qdrant设置准备

为了处理所有的Qdrant操作,我们需要创建一个指向向量数据库的客户端对象。Qdrant允许您创建一个免费的层服务来测试与数据库的远程连接,但为了简单起见,我选择在本地创建并保持数据库:

from qdrant_client import QdrantClientclient = QdrantClient(path="./qdrant_data")

一旦建立了这种连接,我们就可以在数据库中创建一个集合,用于存储新闻文章嵌入:

from qdrant_client import modelsfrom qdrant_client.http.models import Distance, VectorParamsclient.create_collection( collection_name = "news-articles", vectors_config = models.VectorParams( size = encoder.get_sentence_embedding_dimension(), distance = models.Distance.COSINE, ),)print (client.get_collections())# output: CollectionsResponse(collectinotallow=[CollectionDescription(name='news-articles')])

请注意,代码中的向量配置参数是用于创建集合的。这些参数告诉Qdrant向量的一些属性,比如它们的大小和比较向量时要使用的距离指标(我会使用余弦相似性,不过你也可以使用例如内积或欧几里得距离等其他的计算策略)。

生成向量点

在最终存储到数据库之前,我们需要创建合适的上传对象。在Qdrant数据库中,向量可以使用PointStruct类存储,您可以使用该类定义以下属性:

from qdrant_client.http.models import PointStructmetadata_columns = df.drop(["newsId", "sentence", "sentence_embedding"], axis=1).columnsdef create_vector_point(item:pd.Series) -> PointStruct: """Turn vectors into PointStruct""" return PointStruct( id = item["newsId"], vector = item["sentence_embedding"].tolist(), payload = { field: item[field] for field in metadata_columns if (str(item[field]) not in ['None', 'nan']) } )points = df.apply(create_vector_point, axis=1).tolist()

上传向量

最后,在将所有信息都转换成点结构后,我们就可以将它们分块上传到数据库中:

CHUNK_SIZE = 500n_chunks = np.ceil(len(points)/CHUNK_SIZE)for i, points_chunk in enumerate(np.array_split(points, n_chunks)): client.UPSert( collection_name="news-articles", wait=True, points=points_chunk.tolist() )

3.查询向量

现在,既然我们已经用向量存储满集合,接下来,我们就可以开始查询数据库了。我们可以通过多种方式输入信息来查询数据库,但我认为这两种非常有用的输入可以使用:

3.1 使用输入向量查询向量

假设我们已经成功构建了用于搜索引擎的上述向量数据库,我们希望用户的输入是一个输入文本,并且我们必须返回最相关的内容。

由于向量数据库中的所有操作都是使用向量来实现的,所以,我们首先需要将用户的输入文本转换为向量,这样我们就可以根据该输入找到类似的内容。回想一下,我们曾经使用句子转换器将文本数据编码到嵌入中;因此,我们也可以使用相同的编码器为用户的输入文本生成数字表示。

由于NPR包含了新闻文章,那么假设用户键入“Donald Trump”(唐纳德·特朗普)来了解美国大选信息:

query_text = "Donald Trump"query_vector = encoder.encode(query_text).tolist()print (query_vector)# output: [-0.048, -0.120, 0.695, ...]

一旦计算出输入查询向量,我们就可以搜索集合中最接近的向量,并定义我们希望从这些向量中得到什么样的输出,比如它们的newsId、标题和主题:

from qdrant_client.models import Filterfrom qdrant_client.http import modelsclient.search( collection_name="news-articles", query_vector=query_vector, with_payload=["newsId", "title", "topics"], query_filter=None)

注意:默认情况下,Qdrant使用近似最近邻居算法来快速扫描嵌入,但是您也可以进行完全扫描,并带来准确的最近邻数据——请记住,这是一个更昂贵的操作。

运行上面的操作后,以下是生成的输出标题(为了更好地理解,翻译成了英语):

3.2 使用输入向量ID查询向量

最后,我们可以要求向量数据库“推荐”更接近某些所需向量ID但远离不需要的向量ID的内容。期望的ID和不期望的ID分别被称为正样本和负样本,它们被认为是推荐的种子样本。

例如,假设我们有以下正样本ID:

seed_id = '8bc22460-532c-449b-ad71-28dd86790ca2'# title (translated): 'Learn why Joe Biden launched his bid for re-election this Tuesday'

那么,我们就可以要求提供与此样本类似的内容:

client.recommend( collection_name="news-articles", positive=[seed_id], negative=None, with_payload=["newsId", "title", "topics"])

运行上面的操作后,以下是已翻译的输出标题:

结论

本文向您展示了如何将LLM和向量数据库结合起来构建一个新闻推荐系统。特别提到了,使用句子转换器来实现从NPR数据集中的文本新闻文章中生成数字表示(嵌入)的方法。一旦计算出这些嵌入,就可以用这些嵌入来填充例如Qdrant这样的向量数据库,Qdrant的使用将非常有助于通过多种策略来实现向量查询。

最后,您可以基于本文提供的基础示例进行大量进一步的改进,例如:

换言之,您可以提出许多想法来改进基于LLM推荐技术的机器学习工程。所以,如果您想分享您对这些改进的想法,请毫不犹豫地给我发信息吧。


无基础自学编程的学习基础路线是什么?

我要编程怎样学编程 1.明确学习目的 学习编程对大多数IT业人员来说都是非常有用的。 学编程,做一名编程人员,从个人角度讲,可以解决在软件使用中所遇到的问题,改进现有软件,可以为自己找到一份理想的工作添加重要得砝码,有利于在求职道路上谋得一个好的职位;从国家的角度,可以为中国的软件产业做出应有的贡献,一名优秀的程序员永远是被争夺的对象。 学习编程还能 锻炼思维,使我们的逻辑思维更加严密;能够不断享受到创新的乐趣,将一直有机会走在高科技的前沿,因为程序设计本身是一种创造性的工作。 知识经济时代给我们带来了无限的机会,要想真正掌握计算机技术,并在IT行业里干出一番事业来,有所作为,具有一定的编程能力是一个基本条件和要求。 2.打好基础 学编程要具备一定的基础,总结之有以下几方面: (1)数学基础 从计算机发展和应用的历史来看计算机的数学模型和体系结构等都是有数学家提出的,最早的计算机也是为数值计算而设计的。 因此,要学好计算机就要有一定的数学基础,出学者有高中水平就差不多了。 (2)逻辑思维能力的培养 学程序设计要有一定的逻辑思维能力,“逻思力”的培养要长时间的实践锻炼。 要想成为一名优秀的程序员,最重要的是掌握编程思想。 要做到这一点必须在反复的实践、观察、分析、比较、总结中逐渐地积累。 因此在学习编程过程中,我们不必等到什么都完全明白了才去动手实践,只要明白了大概,就要敢于自己动手去体验。 谁都有第一次。 有些问题只有通过实践后才能明白,也只有实践才能把老师和书上的知识变成自己的,高手都是这样成材的。 (3)选择一种合适的入门语言 面对各种各样的语言,应按什么样的顺序学呢?程序设计工具不外乎如下几类: 1)本地开发 应用软件开发的工具有:Visual Basic 、Delphi 、VC++ ( C++ Builder ) 等;数据库开发工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 2)跨平台开发 开发工具如 Java 等。 3)网络开发 对客户端开发工具如:Java Script 等;对服务器开发工具如:PHP 、ASP 、JSP 、ISAPI 、NSAPI 、CGI 等。 以上不同的环境下几种开发工具中 VB 法简单并容易理解,界面设计是可设化的,易学、易用。 选 VB 作为入门的方向对出学者是较为适合的。 3. 注意理解一些重要概念 一本程序设计的书看到的无非就是变量、函数、条件语句、循环语句等概念,但要真正能进行编程应用,需要深入理解这些概念,在理解的基础上应用,不要只简单地学习语法、结构,而要吃透针对这些语法、结构的应用例子,做到举一反三,触类旁通。 4.掌握编程思想 学习一门语言或开发工具,语法结构、功能调用是次要的,最主要是学习它的思想。 例如学习 VC 就要学习 windows 的内在机理、什么是线程......;学习 COM 就要知道 VTALBE 、类厂、接口、idl......,关键是学一种思想,有了思想,那么我们就可以触类旁通。 5.多实践、多交流 掌握编程思想必须在编程实际工作中去实践和体会。 编程起步阶段要经常自己动手设计程序,具体设计时不要拘泥于固定的思维方式,遇到问题要多想几种解决的方案。 这就要多交流,各人的思维方式不同、角度各异,各有高招,通过交流可不断吸收别人的长处,丰富编程实践,帮助自己提高水平。 亲自动手进行程序设计是创造性思维应用的体现,也是培养逻辑思维的好方法。 6.养成良好的编程习惯 编程入门不难,但入门后不断学习是十分重要的,相对来说较为漫长。 在此期间要注意养成一些良好的编程习惯。 编程风格的好坏很大程度影响程序质量。 良好的编程风格可以使程序结构清晰合理,且使程序代码便于维护。 如代码的缩进编排、变量命令规则的一致性、代码的注释等。 7.上网学编程 在网上可以学到很多不同的编程思想、方法、经验和技巧,有大量的工具和作品及相关的辅导材料供下载。 例如网站“编程课堂”()主要以 VB 和 Delph;教学和交流为主,提供大量实用技巧;网站“现在时编程学园”()是专门介绍C、VC、VB、Delphi 等的综合编程网站;网站“ VB 编程乐园 ”()提供内容丰富而且实用的编程技术文章、精选控件、源代码下载、计算机考试、相关软件以及编程书籍推荐等等。 8.加强计算机理论知识的再学习 学编程是符合“理论→实践→再理论→再实践”的一个认识过程。 一开始要具有一定的计算机理论基础知识,包括编程所需的数学基础知识,具备了入门的条件,就可以开始编程的实践,从实践中可以发现问题需要加强计算机理论知识的再学习。 程序人人皆可编,但当你发现编到一定程度很难再提高的时候,就要回头来学习一些计算机科学和数学基础理论。 学过之后,很多以前遇到的问题都会迎刃而解,使人有豁然开朗之感。 因此在学习编程的过程中要不断地针对应用中的困惑和问题深入学习数据结构、算法、计算机原理、编译原理、操作系统原理、软件工程等计算机科学的理论基础和数理逻辑、代数系统、图论、离散数学等数学理论基础知识。 这样经过不断的学习,再努力地实践,编程水平一定会不断提高到一个新高度。

程序运行access violation at address 00A7F337 in module'7cc70.dll'. read of a

Access Violation(非法访问),General Protection Fault(一般保护性错误)或者Invalid page Fault(无效页面错误),虽然说法不一样,但本质上总是由同一种错误引起的。 Access Violation常常在计算机用户运行的程序试图存取未被指定使用的存储区时遇到。 Access violation at address in module Read of address “Access violation at address of adress .意思是:在地址 存取违反,禁止对地址的读取 出现access violation at address . read of address .原因是:没有运行服务端软件,所以客户机会提示Access violation at address , read of address ,开启服务端程序或检查网线即可解决。 另外,可能出现这个问题的原因是因为你是在WINRAR的窗口中运行程序,而程序又找不到主要文件引起的。 解决方法:)~~ 尝试用兼容方式运行该程序.右键点击图标——属性——兼容型——选中“以兼容方式运行该程序”——下面的选框中可以选择以95、98、NT4.0或2000模式来运行。 推荐选择98试试看。

MIDP2.0和CLDC 1.1各是什么东东?

J2ME的术语 MIDP 开放分类: 计算机技术、电脑 MIDP(Mobile Information Device Profile,移动信息设备配置文件)建立在 CLDC 的基础之上,用来描述手机和寻呼机这样更加具体化的的无线移动设备。 对于 Java ME 平台,MIDP 定义了一个标准的 Java API 集合,此集合与联网的受限设备配置 CLDC 一起提供了一个面向移动信息设备(如移动电话、双向寻呼机和无线个人电脑记事本)的完整 Java ME 应用程序运行环境。 MIDP 提供了以下功能: ·显示工具箱 ·用户输入方法 ·持久性数据存储(使用简单的面向记录的数据库模型) ·基于 HTTP 1.1 的网络(使用 CLDC 通用连接框架) Java 规范请求 (Java Specification Request, JSR)-37 中定义了 MIDP 1.0 标准。 JSR-118 中定义了 MIDP 2.0 标准。 CLDC 开放分类: 计算机技术、电脑 CLDC(Connected Limited Device Configuration,联网的受限设备配置)是用来开发在无线设备上运行的应用程序所要用到的一组最小的 API。 CLDC 描述了所有无线移动设备所需的一个最小级别的功能集合。 对于 Java ME 平台,CLDC 为移动电话、双向寻呼机以及类似设备定义了基本配置(Java 语言、虚拟机功能和基本类库)。 这些设备具有以下特性: ·总内存量为 128 KB 到 512 KB。 ·具有有限电源,如电池。 ·可以连接到网络。 ·具有相对有限的用户界面,通常只限文本。 CLDC 1.1 是 CLDC 1.0 规范的修订版本,包含很多新增功能(例如浮点和弱引用支持)以及其他增强功能。 Java 规范请求 (Java Specification Request, JSR) 30 中详细指定了 CLDC 1.0 的要求。 JSR 139 中详细指定了 CLDC 1.1 的要求。 J2ME是一种使用Java语言进行嵌入式设备编程的技术,但是嵌入式设备的种类过于繁多,至少有几百种之多,为了降低编程的复杂度,SUN公司将所有的嵌入式设备分为了两大类: 1 CDC(连接设备配置)有稳定的电源供应设备性能强劲 例如车载设备、机顶盒等。 2 CLDC(连接有限设备配置)使用电池供电设备性能有限 其中手机属于CLDC类别。 上面的说法都是从硬件划分的角度来说明CLDC的,下面从程序员的角度来理解一下CLDC的概念。 其实对于程序员来说,CLDC主要包含三个部分: 1 Java虚拟机(又称JVM) 这个是所有Java程序运行的基础。 对于手机来说,在手机出厂以前,已经固化在手机中了,出厂了以后就不能进行修改了。 2 一套标准的API实现 该标准的API主要包含、、包以及包中的部分。 这个是规范要求必须实现的API,也固化在手机中,不能修改。 3 本地方法实现 在标准的API中,很多都是接口,这些就要求厂商在手机中提供真实的实现,而且很多本地方法也要求手机厂商进行实现。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐