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

使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块

作者:来自 Elastic Gustavo Llermaly

在 Elasticsearch 中使用 Jina Embeddings v2 模型并探索长上下文嵌入模型的优缺点。

在本文中,我们将配置和使用 jina-embeddings-v2,这是第一个开源 8K 上下文长度嵌入模型,首先使用 semantic_text 进行 OOTB 实现,然后实现 Late Chunking。

长上下文模型 - long-context models

我们通常看到上下文长度为 512 个 token 的嵌入模型,这意味着如果我们尝试创建更长的嵌入,则只有前 512 个 token 会添加到向量字段中。这些短上下文的问题在于,块不会知道整个上下文,而只会知道块内的文本:

正如你在图片中看到的,在块 1 中我们知道我们在谈论 Sarah Johnson,但在块 2 中我们失去了直接引用。因此,随着文档变长,它可能会错过 Sarah Johnson 首次被提及时的依赖关系,并且不会将 “Sarah Johnson”、“She” 和 “her” 指代同一个人联系起来。当然,如果有不止一个人被称为 her/she,这会变得更加复杂,但现在让我们看看解决这个问题的第一种方法。

旨在生成文本的传统长上下文模型只关心对前面单词的依赖关系,因此输入中的最后一个标记比前面的标记更重要,因为文本生成器的任务是在输入后生成下一个单词。然而,Jina Embeddings 2 模型经过三个关键阶段的训练:首先,它使用 1700 亿个单词的英语 C4 数据集进行掩码单词预训练。接下来,它使用已知相似或不相似的文本对进行成对对比训练,使用 Jina AI 的新语料库来优化嵌入,使相似的文本更接近,而不相似的文本更远。最后,使用文本三元组和负挖掘对其进行微调,结合具有相反语法极性的句子的数据集,以改进对具有相反含义的句子的嵌入可能过于接近的情况的处理。

那么,让我们看看它是如何工作的:更长的上下文长度使我们能够将第一次提到 Sarah Johnson 的引用保留在同一块中:

然而,这也有其缺点。上下文越大,意味着你将在相同维度空间内放置更多信息。这种压缩可能会稀释上下文,从嵌入中删除潜在的重要信息。另一个缺点是生成更长的嵌入需要更多的计算资源。最后,在 RAG 系统中,文本块的大小决定了你向 LLM 发送的信息量,这将影响精度、成本和延迟。好消息是你不必使用整个 8K token,你可以根据你的用例找到一个最佳点。你在文章 “Elasticsearch:检索增强生成背后的重要思想” 可以。

Jina 致力于将两者的优点结合起来,提出了一种称为 “后期分块(Late Chunking)” 的方法。后期分块包括在嵌入之后对文本进行分块,而不是先对文本进行分块,然后为每个独立的块创建嵌入。为此,你需要一个能够创建上下文感知嵌入的模型,然后你可以在保留上下文(即块之间的依赖关系和关系)的同时对生成的嵌入进行分块。

我们将在 Elasticsearch 中设置 jina-embeddings-v2 模型并将其与 semantic_text一起使用,然后为后期分块创建自定义设置。

步骤

  • 创建端点
  • 创建索引
  • 索引数据
  • 提问
  • 后期分块示例

创建端点

借助我们的 HuggingFace 开放推理服务集成(Open Inference Service integration),运行 HuggingFace 模型非常简单。你只需打开模型网页,单击 Inference API 下的 View Code,然后从那里获取 API URL。在同一屏幕中,你可以 Manage your tokens 以创建 API 密钥。

有关创建安全 token 的更多详细信息,你可以访问此处。出于本文的目的,将其设置为 read token 是可以的。

获得 url 和 api_key 后,继续创建推理端点(inference endpoint):

PUT _inference/text_embedding/jina-embeddings-v2-base-en
{"service": "hugging_face","service_settings": {"api_key": "hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "url": "https://api-inference.huggingface.co/models/jinaai/jina-embeddings-v2-base-en" }
}

如果你收到此错误 “Model jinaai/jina-embeddings-v2-base-en is currently loading”,则表示模型正在预热。请等待几秒钟,然后重试。

创建索引

我们将使用 semantic_text 字段类型。它将负责推断嵌入映射和配置,并为你进行段落分块!如果你想了解更多信息,可以阅读这篇精彩的文章。

PUT jina-embeddings
{"mappings": {"properties": {"super_body": {"type": "semantic_text","inference_id": "jina-embeddings-v2-base-en"}}}
}

这种方法将为我们处理向量配置和文档分块,从而为我们提供一个良好的起点。它将创建 250 个单词的块,其中有 100 个单词重叠。对于诸如增加块大小以利用 8K 上下文大小之类的自定义,我们必须经历一个更长的过程,我们将在后期分块部分进行探讨。

索引数据

使用 semantic_text 时,我们会用到。我们只需像往常一样索引数据即可。

PUT jina-embeddings/_bulk
{ "index" : { "_index" : "jina-embeddings", "_id" : "1" } }
{"super_body": "Sarah Johnson is a talented marine biologist working at the Oceanographic Institute. Her groundbreaking research on coral reef ecosystems has garnered international attention and numerous accolades."}
{ "index" : { "_index" : "jina-embeddings", "_id" : "2" } }
{"super_body": "She spends months at a time diving in remote locations, meticulously documenting the intricate relationships between various marine species. "}
{ "index" : { "_index" : "jina-embeddings", "_id" : "3" } }
{"super_body": "Her dedication to preserving these delicate underwater environments has inspired a new generation of conservationists."}

提出问题

现在我们可以使用语义搜索查询来向我们的数据提出问题:

GET jina-embeddings/_search 
{"query": {"semantic": {"field": "super_body","query": "who inspired taking care of the sea?"}}
}

第一个结果将如下所示:

{"_index": "jina-embeddings","_id": "1","_score": 0.64889884,"_source": {"super_body": {"text": "Sarah Johnson is a talented marine biologist working at the Oceanographic Institute. Her groundbreaking research on coral reef ecosystems has garnered international attention and numerous accolades.","inference": {"inference_id": "jina-embeddings-v2-base-en","model_settings": {"task_type": "text_embedding","dimensions": 768,"similarity": "cosine","element_type": "float"},"chunks": [{"text": "Sarah Johnson is a talented marine biologist working at the Oceanographic Institute. Her groundbreaking research on coral reef ecosystems has garnered international attention and numerous accolades.","embeddings": [-0.0064849486,-0.014192865,0.028806737,0.0026694024,... // 768 dims]}]}}}
}

后期分块示例

现在我们已经配置了嵌入模型,我们可以在 Elasticsearch 中创建自己的后期分块实现。该过程需要以下步骤:

1. 创建映射

PUT jina-late-chunking
{"mappings": {"properties": {"content_embedding": { "type": "dense_vector", "dims": 768, "element_type": "float","similarity": "cosine"},"content": { "type": "text" }}}
}

2. 加载数据

你可以在支持 Notebook 中找到完整的实现。

我们在这里不使用摄取管道方法,因为我们想要创建特殊的嵌入,而是使用一个 Python 脚本,其关键作用是获取块标记位置的注释,为整个文档生成嵌入,然后根据我们提供的长度对嵌入进行分块:

使用此代码,你可以通过按句子拆分并获取块位置来定义文本块大小。

def chunk_by_sentences(input_text: str, tokenizer: callable):"""Split the input text into sentences using the tokenizer:param input_text: The text snippet to split into sentences:param tokenizer: The tokenizer to use:return: A tuple containing the list of text chunks and their corresponding token spans"""inputs = tokenizer(input_text, return_tensors='pt', return_offsets_mapping=True)punctuation_mark_id = tokenizer.convert_tokens_to_ids('.')sep_id = tokenizer.convert_tokens_to_ids('[SEP]')token_offsets = inputs['offset_mapping'][0]token_ids = inputs['input_ids'][0]chunk_positions = [(i, int(start + 1))for i, (token_id, (start, end)) in enumerate(zip(token_ids, token_offsets))if token_id == punctuation_mark_idand (token_offsets[i + 1][0] - token_offsets[i][1] > 0or token_ids[i + 1] == sep_id)]chunks = [input_text[x[1] : y[1]]for x, y in zip([(1, 0)] + chunk_positions[:-1], chunk_positions)]span_annotations = [(x[0], y[0]) for (x, y) in zip([(1, 0)] + chunk_positions[:-1], chunk_positions)]return chunks, span_annotations

第二个函数将接收整个输入的注释(annotations)和嵌入以生成嵌入块。

def late_chunking(model_output: 'BatchEncoding', span_annotation: list, max_length=None
):token_embeddings = model_output[0]outputs = []for embeddings, annotations in zip(token_embeddings, span_annotation):if (max_length is not None):  # remove annotations which go bejond the max-length of the modelannotations = [(start, min(end, max_length - 1))for (start, end) in annotationsif start < (max_length - 1)]pooled_embeddings = [embeddings[start:end].sum(dim=0) / (end - start)for start, end in annotationsif (end - start) >= 1]pooled_embeddings = [embedding.detach().cpu().numpy() for embedding in pooled_embeddings]outputs.append(pooled_embeddings)return outputs

这是将所有内容组合在一起的部分;对整个文本输入进行标记,然后将其传递给 late_chunking 函数以对池化嵌入进行分块。

inputs = tokenizer(input_text, return_tensors='pt')
model_output = model(**inputs)
embeddings = late_chunking(model_output, [span_annotations])[0] 

经过这个过程,我们可以索引我们的文档:

# Prepare the documents to be indexed
documents = []
for chunk, new_embedding in zip(chunks, embeddings):documents.append({"_index": "jina-late-chunking","_source": {"content_embedding": new_embedding,"content": chunk,},})
# Use helpers.bulk to index
helpers.bulk(client, documents)

你可以在此处找到包含完整示例的笔记本。

请随意尝试 input_text 变量中的不同值。

3. 运行查询

你现在可以针对新数据索引运行语义搜索:

GET jina-late-chunking/_search
{"knn": {"field": "content_embedding","query_vector_builder": {"text_embedding": {"model_id": "jina-embeddings-v2-base-en","model_text": "berlin"}},"k": 10,"num_candidates": 100}
}

结果将如下所示:

{"_index": "jina-late-chunking","_id": "gGDN1JEBF7lnCNFTVZBg","_score": 0.4930191,"_source": {"content_embedding": [-0.9107036590576172,-0.57366544008255,1.0492067337036133,0.25255489349365234,-0.1283145546913147... ],"content": "Berlin is the capital and largest city of Germany, both by area and by population."}
}

结论

虽然仍处于试验阶段,但后期分块可能有很多好处,尤其是在 RAG 中,因为它允许你在对文本进行分块时保留关键上下文信息。此外,Jina 嵌入模型有助于存储较短的向量,从而占用更少的内存和存储空间,并加快搜索检索速度。因此,这两个功能与 Elasticsearch 结合使用,在使用向量搜索时提高了管理和检索信息的效率和有效性。

Elasticsearch 与业界领先的 Gen AI 工具和提供商进行了原生集成。查看我们的网络研讨会,了解如何超越 RAG 基础知识,或构建可用于生产的应用程序 Elastic Vector Database。

要为你的用例构建最佳搜索解决方案,请立即开始免费云试用或在你的本地机器上试用 Elastic。

原文:Late chunking in Elasticsearch with Jina Embeddings v2 - Search Labs

相关文章:

使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块

作者&#xff1a;来自 Elastic Gustavo Llermaly 在 Elasticsearch 中使用 Jina Embeddings v2 模型并探索长上下文嵌入模型的优缺点。 在本文中&#xff0c;我们将配置和使用 jina-embeddings-v2&#xff0c;这是第一个开源 8K 上下文长度嵌入模型&#xff0c;首先使用 semant…...

QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现

案例需求&#xff1a; 完成数据库插入&#xff0c;删除&#xff0c;修改&#xff0c;查看操作。 分为 插入&#xff0c;删除&#xff0c;修改&#xff0c;查看&#xff0c;查询 几个模块。 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget…...

python json.dump()和json.dumps()的区别

用人话总结一下 json.dump()是针对文件的json和python的转换 json.dumps()主要是针对内容数据 json.dumps(obj, skipkeysFalse, ensure_asciiTrue, check_circularTrue, allow_nanTrue, clsNone, indentNone, separatorsNone, encoding“utf-8”, defaultNone, sort_keysFalse…...

网络流学习笔记

注&#xff1a;笔者是蒟蒻&#xff0c;所以本文几乎是干货&#xff0c;枯燥无味甚至可能会引人不适&#xff0c;请读者谨慎阅读。 为了笔者快爆掉的肝点个赞好吗&#xff1f;&#xff1f;&#xff1f; Part.1 网络流基础定义 一个有向带权图 G ( V , E ) G(V,E) G(V,E) 是…...

Mybatis PLUS查询对List使用OR模糊查询

Mybatis PLUS查询对List使用OR模糊查询 1、版本2、代码3、效果 1、版本 Mybatis PLUS版本&#xff1a;3.5.7 注意&#xff1a;版本3.1.2及以下是需要return的 因当前为高版本&#xff0c;代码中已将 return 注释。 2、代码 QueryWrapper<Object> queryWrapper new Que…...

Debezium日常分享系列之:Debezium Engine

Debezium日常分享系列之&#xff1a;Debezium Engine 依赖打包项目在代码中输出消息格式消息转换消息转换谓词高级记录使用引擎属性异步引擎属性数据库模式历史属性处理故障 Debezium连接器通常通过部署到Kafka Connect服务来运行&#xff0c;并配置一个或多个连接器来监视上游…...

I.MX6U 裸机开发20. DDR3 内存知识

I.MX6U 裸机开发20. DDR3 内存知识 一、DDR3内存简介1. DDR发展历程SRAMSDRAMDDR1DDR2DDR3DDR4DDR5 2. 开发板资源3. DDR3的时间参数1. 传输速率2. tRCD3. CL 参数作用取值范围工作原理4. tRC参数原理单位与取值5. tRAS重要性及作用 二、I.MX6U MMDC 控制器1. MMDC简介&#xf…...

【R安装】VSCODE安装及R语言环境配置

目录 VSCODE下载及安装VSCODE上配置R语言环境参考 Visual Studio Code&#xff08;简称“VSCode” &#xff09;是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的&#xff0c;针对于编写现代Web和云应用的跨平台源代码编辑器&…...

ES更新问题 Failed to close the XContentBuilder异常

问题描述 使用RestHighLevelClient对文档进行局部更新的时候报错如下&#xff1a; Suppressed: java.lang.IllegalStateException: Failed to close the XContentBuilderat org.elasticsearch.common.xcontent.XContentBuilder.close(XContentBuilder.java:1011)at org.elast…...

svn-git下载

windows&#xff1a; svn 客户端&#xff1a;-------------- TortoiseSVN 安装 下载地址&#xff1a;https://tortoisesvn.net/downloads.html, 页面里有语言包补丁的下载链接。 目前最新版为 1.11.0 下载地址&#xff1a; https://osdn.net/projects/tortoisesvn/storage/1.…...

10个Word自动化办公脚本

在日常工作和学习中&#xff0c;我们常常需要处理Word文档&#xff08;.docx&#xff09;。 Python提供了强大的库&#xff0c;如python-docx&#xff0c;使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本&#xff0c;帮助新…...

Paddle Inference部署推理(十八)

十八&#xff1a;Paddle Inference推理 &#xff08;C&#xff09;API详解 3. 使用 CPU 进行预测 注意&#xff1a; 在 CPU 型号允许的情况下&#xff0c;进行预测库下载或编译试尽量使用带 AVX 和 MKL 的版本 可以尝试使用 Intel 的 MKLDNN 进行 CPU 预测加速&#xff0c;默…...

Redis开发02:redis.windows-service.conf 默认配置文件解析与注解

文件位置&#xff1a;redis安装目录下的 redis.windows-service.conf &#xff0c;存放了redis服务的相关配置&#xff0c;下面列举出默认配置的含义&#xff1a; 配置项含义bind 127.0.0.1限制 Redis 只监听本地回环地址&#xff0c;意味着只能从本地连接 Redis。protected-m…...

redis大key和热key

redis中大key、热key 什么是大key大key可能产生的原因大key可能会造成什么影响如何检测大key如何优化删除大key时可能的问题删除大key的策略 热key热key可能导致的问题解决热key的方法 什么是大key 大key通常是指占用内存空间过大或包含大量元素的键值对。 数据量大&#xff…...

Dubbo 最基础的 RPC 应用(使用 ZooKeeper)

看国内的一些项目时 Dubbo 这个词经常闪现&#xff0c;一直也不以为然&#xff0c;未作搜索&#xff0c;当然也不知道它是做什么用的。直到最近阅读关于大型网站架构相关的书中反复提到 Dubbo 后&#xff0c;觉得不能再对它视而不见。Google 了一下&#xff0c;它是在阿里巴巴创…...

科技赋能:企业如何通过新技术提升竞争力的策略与实践

引言 在当今瞬息万变的商业环境中&#xff0c;科技的迅猛发展正在重新定义行业的游戏规则。无论是小型企业还是跨国巨头&#xff0c;都感受到数字化转型的迫切需求。过去&#xff0c;企业竞争力更多依赖于成本控制、资源调配或市场覆盖&#xff0c;而如今&#xff0c;新技术的引…...

从0开始深度学习(33)——循环神经网络的简洁实现

本章使用Pytorch的API实现RNN上的语言模型训练 0 导入库 import torch import torch.nn as nn import torch.nn.functional as F from torch.utils.data import Dataset, DataLoader from collections import Counter import re import math from tqdm import tqdm1 准备数据 …...

【FAQ】HarmonyOS SDK 闭源开放能力 — 公共模块

1.问题描述&#xff1a; 文档哪里能找到所有的权限查看该权限是用户级的还是系统级的。 解决方案&#xff1a; 您好&#xff0c;可以看一下下方链接是否可以解决问题&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/permissions-for-all-V…...

百度 文心一言 vs 阿里 通义千问 哪个好?

背景介绍&#xff1a; 在当前的人工智能领域&#xff0c;随着大模型技术的快速发展&#xff0c;市场上涌现出了众多的大规模语言模型。然而&#xff0c;由于缺乏统一且权威的评估标准&#xff0c;很多关于这些模型能力的文章往往基于主观测试或自行设定的排行榜来评价模型性能…...

内网不出网上线cs

一:本地正向代理目标 如下&#xff0c;本地(10.211.55.2)挂好了基于 reGeorg 的 http 正向代理。代理为: Socks5 10.211.55.2 1080python2 reGeorgSocksProxy.py -l 0.0.0.0 -p 1080 -u http://10.211.55.3:8080/shiro/tunnel.jsp 二&#xff1a;虚拟机配置proxifer 我们是…...

ubuntu22开机自动登陆和开机自动运行google浏览器自动打开网页

一、开机自动登陆 1、打开settings->点击Users 重启系统即可自动登陆桌面 二、开机自动运行google浏览器自动打开网页 1、安装google浏览器 sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i ./google-chrome-stable…...

企业建站高性能的内容管理系统

AnQiCMS 是一款高性能的内容管理系统&#xff0c;基于Go语言开发。它支持多站点、多语言管理&#xff0c;提供灵活的内容发布和模板管理功能&#xff0c;同时&#xff0c;系统内置丰富的利于SEO操作的功能&#xff0c;支持包括自定义字段、文档分类、批量导入导出等功能 AnQiC…...

【爬虫框架:feapder,管理系统 feaplat】

github&#xff1a;https://github.com/Boris-code/feapder 爬虫管理系统 feaplat&#xff1a;http://feapder.com/#/feapder_platform/feaplat 爬虫在线工具库 &#xff1a;http://www.spidertools.cn &#xff1a;https://www.kgtools.cn/1、feapder 简介 对于学习 Python…...

faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-5

训练过程 通过gdb调试得到这个ivfsq的训练过程&#xff0c;我尝试对这个内容具体训练过程进行解析&#xff0c;对每个调用栈里面的逻辑和代码进行解读。 步骤函数名称调用位置说明1faiss::IndexIVF::train/faiss/IndexIVF.cpp:1143开始训练&#xff0c;判断是否需要训练第一级…...

代码随想录算法训练营第六十天|Day60 图论

Bellman_ford 队列优化算法&#xff08;又名SPFA&#xff09; https://www.programmercarl.com/kamacoder/0094.%E5%9F%8E%E5%B8%82%E9%97%B4%E8%B4%A7%E7%89%A9%E8%BF%90%E8%BE%93I-SPFA.html 本题我们来系统讲解 Bellman_ford 队列优化算法 &#xff0c;也叫SPFA算法&#xf…...

在嵌入式Linux下如何用QT开发UI

在嵌入式 Linux 环境下使用 Qt 开发用户界面 (UI) 是一个常见的选择。Qt 提供了丰富的功能、跨平台支持以及优秀的图形界面开发能力&#xff0c;非常适合用于嵌入式系统。以下是开发流程的详细步骤&#xff1a; 1. 准备开发环境 硬件环境 一块运行嵌入式 Linux 的开发板&…...

【JavaScript】Promise详解

Promise 是 JavaScript 中处理异步操作的一种强大机制。它提供了一种更清晰、更可控的方式来处理异步代码&#xff0c;避免了回调地狱&#xff08;callback hell&#xff09;和复杂的错误处理。 基本概念 状态&#xff1a; Pending&#xff1a;初始状态&#xff0c;既不是成功…...

1062 Talent and Virtue

About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about peoples talent and virtue. According to his theory, a man being outstanding in both talent and virtue must be a "sage&#xff08;圣人&#xff09;"…...

C++《二叉搜索树》

在初阶数据结构中我学习了树基础的概念以及了解了顺序结构的二叉树——堆和链式结构二叉树该如何实现&#xff0c;那么接下来我们将进一步的学习二叉树&#xff0c;在此会先后学习到二叉搜索树、AVL树、红黑树&#xff1b;通过这些的学习将让我们更易于理解后面set、map、哈希等…...

机器学习-神经网络(BP神经网络前向和反向传播推导)

1.1 神经元模型 神经网络(neural networks)方面的研究很早就已出现,今天“神经网络”已是一个相当大的、多学科交叉的学科领域.各相关学科对神经网络的定义多种多样,本书采用目前使用得最广泛的一种,即“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够…...

网站建设公司有/今天重大新闻事件

推荐10款最热门jQuery UI框架 原创 在进行Web开发时&#xff0c;并非所有的库都适合你的项目&#xff0c;但你仍需要收藏一些Web UI设计相关的库或框架&#xff0c;以在你需要的时候&#xff0c;加快你的开发效率。本文为你推荐10款非常优秀的基于JQuery的Web UI设计框架1.国产…...

兰州网站排名公司/行业关键词词库

题目链接&#xff1a;http://poj.org/problem?id3469 思路&#xff1a;终于把网络流的模版测试好了&#xff0c;在Dinic和Sap之间还是选择了Sap,事实证明Sap确实比Dinic效率高&#xff0c;在此贴出自己的网络流模版&#xff1a; 1 #include<iostream>2 #include<cstd…...

达人设计网官方网站/手机百度经验首页登录官网

从小到大&#xff0c;我们一直都在学习&#xff0c;不论是课本上的知识&#xff0c;还是人生中的道理。终身学习画布这个名词你可能是第一次听到&#xff0c;但是你肯定用过。终生学习画布就是将自己的学习目标&#xff0c;日常行为&#xff0c;人生规划写在一张纸上。但是想要…...

石家庄兼职做网站/推广方案格式模板范文

在学习OSPF的时候会使用到帧中继&#xff0c;那如何将路由器当帧中继网络来使用呢&#xff1f;下面帖上一篇配置和介绍给大家看看。模拟环境拓扑如下图&#xff1a;FR:Building configuration...Current configuration : 1632 bytes!version 12.4service timestamps debug date…...

国外网站制作/产品推广计划怎么写

【内容提要】 明清时期山西洪洞刘氏与当时南方的宗族一样&#xff0c;从明中后期开始组织化。刘氏从默默无闻的家族崛起&#xff0c;成为当地的望族&#xff0c;发展起宗族组织&#xff0c;并从明中叶维持到清末&#xff0c;主要原因在于科举的成功&#xff0c;农商结合的经济以…...

wordpress评论框字数限制/百度有刷排名软件

原标题&#xff1a;Python基础知识&#xff1a; 元组Python的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。元组使用小括号&#xff0c;列表使用方括号。元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。如下实例&#xff1a…...