代码:
import os import json import torch import numpy as npimport spacy from spacy.tokens import Doc from spacy.language import Languageimport transformers from transformers import AutoModel from transformers import AutoTokenizerdef sentence_chunker2(document, batch_size=10000):"""Given a document (string), return the sentences as chunks and span annotations (start and end indices of chunks).Using spacy to do this sentence chunking."""# Batch with spacynlp = spacy.blank("en")nlp.add_pipe("sentencizer", config={"punct_chars": None})doc = nlp(document)docs = []for i in range(0, len(document), batch_size):batch = document[i: i + batch_size]docs.append(nlp(batch))doc = Doc.from_docs(docs)span_annotations = []chunks = []for i, sent in enumerate(doc.sents):span_annotations.append((sent.start, sent.end))chunks.append(sent.text)return chunks, span_annotationsdef sentence_chunker(document, batch_size=128):"""修改分块策略,使用更合理的分句方式"""nlp = spacy.blank("zh") # 改用中文模型nlp.add_pipe("sentencizer")# 使用更细粒度的分句规则doc = nlp(document)chunks = []span_annotations = []current_chunk = []current_start = 0for sent in doc.sents:# 如果当前句子加入后长度合适,就加入当前chunkif len(''.join(current_chunk)) + len(sent.text) < batch_size:current_chunk.append(sent.text)else:# 否则保存当前chunk并开始新的chunkif current_chunk:text = ' '.join(current_chunk)chunks.append(text)span_annotations.append((current_start, len(text)))current_start = len(text) + 1current_chunk = [sent.text]# 处理最后一个chunkif current_chunk:text = ' '.join(current_chunk)chunks.append(text)span_annotations.append((current_start, len(text)))return chunks, span_annotationsdef document_to_token_embeddings(model, tokenizer, document, batch_size=4096):"""Given a model and tokenizer of jinaai/jina-embeddings-v2-base-en, return token embeddings of the input text document."""if batch_size > 8192:raise ValueError("Batch size is too large. Please use a batch size of 8192 or less.")tokenized_document = tokenizer(document, return_tensors="pt")tokens = tokenized_document.tokens()# Batch in sizes of batch_sizeoutputs = []for i in range(0, len(tokens), batch_size):start = iend = min(i + batch_size, len(tokens))# subset huggingface tokenizer outputs to i : i + batch_sizebatch_inputs = {k: v[:, start:end] for k, v in tokenized_document.items()}with torch.no_grad():model_output = model(**batch_inputs)outputs.append(model_output.last_hidden_state)model_output = torch.cat(outputs, dim=1)return model_outputdef late_chunking(token_embeddings, span_annotation, max_length=None):"""Given the token-level embeddings of document and their corresponding span annotations (start and end indices of chunks in terms of tokens),late chunking pools the token embeddings for each chunk."""outputs = []for embeddings, annotations in zip(token_embeddings, span_annotation):if (max_length is not None): # remove annotations which go beyond the max-length of the modelannotations = [(start, min(end, max_length - 1))for (start, end) in annotationsif start < (max_length - 1)]pooled_embeddings = []for start, end in annotations:if (end - start) >= 1:pooled_embeddings.append(embeddings[start:end].sum(dim=0) / (end - start))# print("pooled_embeddings:", pooled_embeddings)pooled_embeddings = [embedding.numpy() for embedding in pooled_embeddings]outputs.append(pooled_embeddings)return outputstokenizer = AutoTokenizer.from_pretrained('jinaai/jina-embeddings-v2-base-zh', trust_remote_code=True) model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-zh', trust_remote_code=True)import numpy as np cos_sim = lambda x, y: np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y))# with open("temp.md", "r", encoding="utf8") as f: # document = f.read() # # print(f"{document[:150]}...") # chunks, span_annotations = sentence_chunker(document) # token_embeddings = document_to_token_embeddings(model, tokenizer, document) # chunk_embeddings = late_chunking(token_embeddings, [span_annotations])[0] # # def late_chunking_query_by_cosine_sim(query, k=3): # cos_sim = lambda x, y: np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y)) # query_vector = model(**tokenizer(query, return_tensors="pt")).last_hidden_state.mean( # 1).detach().cpu().numpy().flatten() # # results = np.empty(len(chunk_embeddings)) # for i, (chunk, embedding) in enumerate(zip(chunks, chunk_embeddings)): # results[i] = cos_sim(query_vector, embedding) # # results_order = results.argsort()[::-1] # return np.array(chunks)[results_order].tolist()[:k] # # # print(late_chunking_query_by_cosine_sim("What are new features in milvus 2.4.13", 3)) # embeddings_traditional_chunking = model.encode(chunks[:10]) # # # milvus_embedding = model.encode('milvus 2.4.13') # # for chunk, late_chunking_embedding, traditional_embeddings in zip(chunks[4:8], chunk_embeddings[4:8], # embeddings_traditional_chunking[4:8]): # print(f'similarity_late_chunking("milvus 2.4.13", "{chunk}"):', cos_sim(milvus_embedding, late_chunking_embedding)) # print(f'similarity_traditional("milvus 2.4.13", "{chunk}"):', cos_sim(milvus_embedding, traditional_embeddings))# 使用示例 print("*"*88) context_test_documents = ["""OpenAI的发展历程充满戏剧性。这家公司成立于2015年,最初是作为非营利组织运营。随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。有趣的是,在随后的几天里,它又经历了戏剧性的反转。数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。最终,在各方压力下,董事会不得不收回成命。这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。""","""特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。马斯克称它是一款革命性的产品,因为它采用了创新的不锈钢外壳设计。然而,这种特殊的材料选择也给它的生产带来了巨大挑战。据工厂工人透露,它的组装过程异常复杂,每一个焊接点都需要特殊处理。更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。尽管如此,它仍然吸引了大量订单。有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。分析师指出,它的成功与否将直接影响特斯拉在皮卡市场的地位。目前,它已经开始小批量生产,但产能爬坡面临诸多挑战。马斯克表示,要到2024年底,它才能实现每周一万台的生产目标。与此同时,它的竞争对手们也没有闲着。福特F-150 Lightning和雪佛兰Silverado EV都在积极扩大产能,这使得电动皮卡市场的竞争更加激烈。""","""中国最早的词典《说文解字》对汉字的研究影响深远。它由东汉许慎编撰完成,前后耗时数十载。这部巨著不仅系统地分析了汉字的构造原理,更开创了形声字的理论体系。在古代文人的著作中,它常常被引用作为考据的重要依据。值得注意的是,它采用了独特的部首分类法,按照540个部首将9353个字分门别类。这种分类方法影响了后世众多字典的编撰。宋代的《类篇》就是在它的基础上改进而来。明清时期,它更是成为了科举考试的必备参考书。随着时代发展,它的一些观点虽然被现代语言学家质疑,但它对汉字研究的系统性方法仍然具有重要的参考价值。特别是在考古发现中,它的许多论述都得到了甲骨文和金文的印证。现代学者在研究它的时候发现,许多当时被认为是臆测的字源解释,竟然与后来出土的古文字材料相吻合。这种惊人的准确性,使得它在数字化时代依然保持着极高的学术价值。近年来,随着人工智能技术的发展,它的数字化版本为计算机处理古文献提供了重要依据。""", ]# 测试查询,特别关注指代词相关的上下文 test_queries = [# OpenAI相关查询"OpenAI董事会解雇CEO的原因是什么","OpenAI在AI领域的影响力体现在哪里", # 指代OpenAI"董事会的决定造成了什么后果",# Cybertruck相关查询"Cybertruck的生产面临什么挑战","Cybertruck的售价情况如何", # 指代Cybertruck"Cybertruck的竞争对手有哪些", # 指代Cybertruck# 说文解字相关查询"说文解字的编撰过程","说文解字的分类方法有什么特点", # 指代说文解字"说文解字对后世产生了什么影响" # 指代说文解字 ]def process_all_documents(documents):"""处理所有文档,返回所有chunks和对应的embeddings"""all_chunks = []all_chunk_embeddings = [] # Late Chunking方法的embeddingsall_traditional_embeddings = [] # 传统方法的embeddingsdoc_boundaries = [] # 记录每个文档的起始位置start_idx = 0for doc in documents:print(f"\n处理文档 (前100字): {doc[:100]}...\n")# Late chunking 处理chunks, span_annotations = sentence_chunker(doc)token_embeddings = document_to_token_embeddings(model, tokenizer, doc)chunk_embeddings = late_chunking(token_embeddings, [span_annotations])[0]# 传统方法:直接对chunks进行embeddingtraditional_embeddings = []for chunk in chunks:with torch.no_grad():inputs = tokenizer(chunk, return_tensors="pt", truncation=True, max_length=512)outputs = model(**inputs)embedding = outputs.last_hidden_state.mean(1).cpu().numpy().flatten()traditional_embeddings.append(embedding)# 保存结果all_chunks.extend(chunks)all_chunk_embeddings.extend(chunk_embeddings)all_traditional_embeddings.extend(traditional_embeddings)# 记录文档边界doc_boundaries.append((start_idx, start_idx + len(chunks)))start_idx += len(chunks)print(f"文档被分割成 {len(chunks)} 个片段")return all_chunks, all_chunk_embeddings, all_traditional_embeddings, doc_boundariesdef search_across_documents(query, chunks, chunk_embeddings, traditional_embeddings, top_k=3):"""在所有文档中搜索相关内容"""# 获取查询的embeddingwith torch.no_grad():query_inputs = tokenizer(query, return_tensors="pt", truncation=True, max_length=512)query_outputs = model(**query_inputs)query_embedding = query_outputs.last_hidden_state.mean(1).cpu().numpy().flatten()# Late Chunking方法的相似度计算late_chunking_similarities = []for i, (chunk, emb) in enumerate(zip(chunks, chunk_embeddings)):sim = cos_sim(query_embedding, emb)late_chunking_similarities.append((sim, chunk, i))# 传统方法的相似度计算traditional_similarities = []for i, (chunk, emb) in enumerate(zip(chunks, traditional_embeddings)):sim = cos_sim(query_embedding, emb)traditional_similarities.append((sim, chunk, i))return (sorted(late_chunking_similarities, reverse=True)[:top_k],sorted(traditional_similarities, reverse=True)[:top_k])def context_understanding_with_references(documents, queries, top_k=3):"""主函数:处理所有文档并执行查询"""print("\n===== 开始处理所有文档 =====")# 处理所有文档all_chunks, all_chunk_embeddings, all_traditional_embeddings, doc_boundaries = process_all_documents(documents)print(f"\n总共处理了 {len(documents)} 个文档,产生了 {len(all_chunks)} 个文本片段")# 执行查询for query in queries:print(f"\n\n查询: {query}")print("-" * 50)# 在所有文档中搜索late_results, trad_results = search_across_documents(query,all_chunks,all_chunk_embeddings,all_traditional_embeddings,top_k)# 显示Late Chunking结果print(f"\n=== Late Chunking方法的top {top_k} 结果 ===")for sim, chunk, idx in late_results:# 找出该chunk属于哪个文档doc_id = next(i for i, (start, end) in enumerate(doc_boundaries) if start <= idx < end)print(f"\n相似度 {sim:.4f} (文档 #{doc_id}, 片段 #{idx}):")print(f"内容: {chunk}")# 显示传统方法结果print(f"\n=== 传统Embedding方法的top {top_k} 结果 ===")for sim, chunk, idx in trad_results:doc_id = next(i for i, (start, end) in enumerate(doc_boundaries) if start <= idx < end)print(f"\n相似度 {sim:.4f} (文档 #{doc_id}, 片段 #{idx}):")print(f"内容: {chunk}")# 使用示例 if __name__ == "__main__":context_understanding_with_references(context_test_documents, test_queries, top_k=3)
运行结果:
===== 开始处理所有文档 =====处理文档 (前100字): OpenAI的发展历程充满戏剧性。这家公司成立于2015年,最初是作为非营利组织运营。随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。特别是在2022年底推出ChatGPT...文档被分割成 4 个片段处理文档 (前100字): 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。马斯克称它是一款...文档被分割成 5 个片段处理文档 (前100字): 中国最早的词典《说文解字》对汉字的研究影响深远。它由东汉许慎编撰完成,前后耗时数十载。这部巨著不仅系统地分析了汉字的构造原理,更开创了形声字的理论体系。在古代文人的著作中,它常常被...文档被分割成 5 个片段总共处理了 3 个文档,产生了 14 个文本片段查询: OpenAI董事会解雇CEO的原因是什么 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.6403 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。相似度 0.6076 (文档 #0, 片段 #1): 内容: 然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。 董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。 虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。相似度 0.6068 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。=== 传统Embedding方法的top 3 结果 ===相似度 0.6042 (文档 #0, 片段 #1): 内容: 然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。 董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。 虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。相似度 0.5376 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。相似度 0.4302 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。查询: OpenAI在AI领域的影响力体现在哪里 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.5866 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。相似度 0.4603 (文档 #0, 片段 #1): 内容: 然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。 董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。 虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。相似度 0.4260 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。=== 传统Embedding方法的top 3 结果 ===相似度 0.5795 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。相似度 0.4472 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.3685 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。查询: 董事会的决定造成了什么后果 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.2884 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。相似度 0.2657 (文档 #0, 片段 #1): 内容: 然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。 董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。 虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。相似度 0.2361 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。=== 传统Embedding方法的top 3 结果 ===相似度 0.3913 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。相似度 0.3709 (文档 #0, 片段 #1): 内容: 然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。 董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。 虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。相似度 0.0477 (文档 #1, 片段 #6): 内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。 尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。查询: Cybertruck的生产面临什么挑战 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.5581 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.3901 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.3771 (文档 #1, 片段 #5): 内容: 马斯克称它是一款革命性的产品,因为它采用了创新的不锈钢外壳设计。 然而,这种特殊的材料选择也给它的生产带来了巨大挑战。 据工厂工人透露,它的组装过程异常复杂,每一个焊接点都需要特殊处理。=== 传统Embedding方法的top 3 结果 ===相似度 0.5505 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.4893 (文档 #1, 片段 #8): 内容: 福特F-150 Lightning和雪佛兰Silverado EV都在积极扩大产能,这使得电动皮卡市场的竞争更加激烈。 相似度 0.4592 (文档 #1, 片段 #7): 内容: 分析师指出,它的成功与否将直接影响特斯拉在皮卡市场的地位。 目前,它已经开始小批量生产,但产能爬坡面临诸多挑战。 马斯克表示,要到2024年底,它才能实现每周一万台的生产目标。 与此同时,它的竞争对手们也没有闲着。查询: Cybertruck的售价情况如何 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.6429 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.6216 (文档 #1, 片段 #5): 内容: 马斯克称它是一款革命性的产品,因为它采用了创新的不锈钢外壳设计。 然而,这种特殊的材料选择也给它的生产带来了巨大挑战。 据工厂工人透露,它的组装过程异常复杂,每一个焊接点都需要特殊处理。相似度 0.6135 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 === 传统Embedding方法的top 3 结果 ===相似度 0.6210 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.4245 (文档 #1, 片段 #8): 内容: 福特F-150 Lightning和雪佛兰Silverado EV都在积极扩大产能,这使得电动皮卡市场的竞争更加激烈。 相似度 0.4236 (文档 #1, 片段 #6): 内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。 尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。查询: Cybertruck的竞争对手有哪些 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.5137 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.3770 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.3442 (文档 #1, 片段 #5): 内容: 马斯克称它是一款革命性的产品,因为它采用了创新的不锈钢外壳设计。 然而,这种特殊的材料选择也给它的生产带来了巨大挑战。 据工厂工人透露,它的组装过程异常复杂,每一个焊接点都需要特殊处理。=== 传统Embedding方法的top 3 结果 ===相似度 0.5503 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.4983 (文档 #1, 片段 #8): 内容: 福特F-150 Lightning和雪佛兰Silverado EV都在积极扩大产能,这使得电动皮卡市场的竞争更加激烈。 相似度 0.3635 (文档 #1, 片段 #7): 内容: 分析师指出,它的成功与否将直接影响特斯拉在皮卡市场的地位。 目前,它已经开始小批量生产,但产能爬坡面临诸多挑战。 马斯克表示,要到2024年底,它才能实现每周一万台的生产目标。 与此同时,它的竞争对手们也没有闲着。查询: 说文解字的编撰过程 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.5172 (文档 #1, 片段 #6): 内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。 尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。相似度 0.0730 (文档 #0, 片段 #1): 内容: 然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。 董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。 虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。相似度 0.0692 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。=== 传统Embedding方法的top 3 结果 ===相似度 0.5998 (文档 #2, 片段 #9): 内容: 中国最早的词典《说文解字》对汉字的研究影响深远。 它由东汉许慎编撰完成,前后耗时数十载。 这部巨著不仅系统地分析了汉字的构造原理,更开创了形声字的理论体系。 在古代文人的著作中,它常常被引用作为考据的重要依据。相似度 0.4226 (文档 #2, 片段 #10): 内容: 值得注意的是,它采用了独特的部首分类法,按照540个部首将9353个字分门别类。 这种分类方法影响了后世众多字典的编撰。 宋代的《类篇》就是在它的基础上改进而来。 明清时期,它更是成为了科举考试的必备参考书。相似度 0.3586 (文档 #2, 片段 #11): 内容: 随着时代发展,它的一些观点虽然被现代语言学家质疑,但它对汉字研究的系统性方法仍然具有重要的参考价值。 特别是在考古发现中,它的许多论述都得到了甲骨文和金文的印证。查询: 说文解字的分类方法有什么特点 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.4901 (文档 #1, 片段 #6): 内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。 尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。相似度 0.0352 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。相似度 0.0241 (文档 #0, 片段 #1): 内容: 然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。 董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。 虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。=== 传统Embedding方法的top 3 结果 ===相似度 0.4837 (文档 #2, 片段 #9): 内容: 中国最早的词典《说文解字》对汉字的研究影响深远。 它由东汉许慎编撰完成,前后耗时数十载。 这部巨著不仅系统地分析了汉字的构造原理,更开创了形声字的理论体系。 在古代文人的著作中,它常常被引用作为考据的重要依据。相似度 0.4535 (文档 #2, 片段 #10): 内容: 值得注意的是,它采用了独特的部首分类法,按照540个部首将9353个字分门别类。 这种分类方法影响了后世众多字典的编撰。 宋代的《类篇》就是在它的基础上改进而来。 明清时期,它更是成为了科举考试的必备参考书。相似度 0.3776 (文档 #2, 片段 #11): 内容: 随着时代发展,它的一些观点虽然被现代语言学家质疑,但它对汉字研究的系统性方法仍然具有重要的参考价值。 特别是在考古发现中,它的许多论述都得到了甲骨文和金文的印证。查询: 说文解字对后世产生了什么影响 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.5738 (文档 #1, 片段 #6): 内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。 尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。相似度 0.1519 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。相似度 0.1380 (文档 #0, 片段 #1): 内容: 然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。 董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。 虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。=== 传统Embedding方法的top 3 结果 ===相似度 0.6053 (文档 #2, 片段 #9): 内容: 中国最早的词典《说文解字》对汉字的研究影响深远。 它由东汉许慎编撰完成,前后耗时数十载。 这部巨著不仅系统地分析了汉字的构造原理,更开创了形声字的理论体系。 在古代文人的著作中,它常常被引用作为考据的重要依据。相似度 0.4432 (文档 #2, 片段 #11): 内容: 随着时代发展,它的一些观点虽然被现代语言学家质疑,但它对汉字研究的系统性方法仍然具有重要的参考价值。 特别是在考古发现中,它的许多论述都得到了甲骨文和金文的印证。相似度 0.4182 (文档 #2, 片段 #10): 内容: 值得注意的是,它采用了独特的部首分类法,按照540个部首将9353个字分门别类。 这种分类方法影响了后世众多字典的编撰。 宋代的《类篇》就是在它的基础上改进而来。 明清时期,它更是成为了科举考试的必备参考书。
让我对测试结果进行分析总结:
1. 查询效果对比
A. 传统Embedding方法表现较好的查询:
- OpenAI相关查询:结果相关性高,排序合理
- Cybertruck相关查询:能够准确找到相关段落,特别是竞争对手信息
- 说文解字相关查询:检索结果准确,上下文连贯
B. Late Chunking方法表现欠佳的问题:
- 相关性较差:经常返回不相关的内容
- 排序不合理:有时将不相关内容排在前面
- 上下文理解不足:对指代词的处理效果不理想
2. 具体案例分析
优秀案例:
总体结论
1. 当前实现中,传统Embedding方法整体表现优于Late Chunking方法
2. Late Chunking需要重大改进才能实现预期效果
3. 建议短期内使用传统方法,同时对Late Chunking进行优化
我担心自己冤枉了late chunking这一技术,毕竟jina官方也推得很认真。所以我再度做了一个实验,利用国内较好的BGE embedding来进行这个实验,代码如下:
import os import json import torch import numpy as npimport spacy from spacy.tokens import Doc from spacy.language import Languageimport transformers from transformers import AutoModel from transformers import AutoTokenizerdef sentence_chunker(document, batch_size=128):"""修改分块策略,使用更合理的分句方式"""nlp = spacy.blank("zh") # 改用中文模型nlp.add_pipe("sentencizer")# 使用更细粒度的分句规则doc = nlp(document)chunks = []span_annotations = []current_chunk = []current_start = 0for sent in doc.sents:# 如果当前句子加入后长度合适,就加入当前chunkif len(''.join(current_chunk)) + len(sent.text) < batch_size:current_chunk.append(sent.text)else:# 否则保存当前chunk并开始新的chunkif current_chunk:text = ' '.join(current_chunk)chunks.append(text)span_annotations.append((current_start, len(text)))current_start = len(text) + 1current_chunk = [sent.text]# 处理最后一个chunkif current_chunk:text = ' '.join(current_chunk)chunks.append(text)span_annotations.append((current_start, len(text)))return chunks, span_annotationsdef sentence_chunker2(document, batch_size=10000):"""Given a document (string), return the sentences as chunks and span annotations (start and end indices of chunks).Using spacy to do this sentence chunking."""# Batch with spacynlp = spacy.blank("en")nlp.add_pipe("sentencizer", config={"punct_chars": None})doc = nlp(document)docs = []for i in range(0, len(document), batch_size):batch = document[i: i + batch_size]docs.append(nlp(batch))doc = Doc.from_docs(docs)span_annotations = []chunks = []for i, sent in enumerate(doc.sents):span_annotations.append((sent.start, sent.end))chunks.append(sent.text)return chunks, span_annotationsdef late_chunking(token_embeddings, span_annotation, max_length=None):"""Given the token-level embeddings of document and their corresponding span annotations (start and end indices of chunks in terms of tokens),late chunking pools the token embeddings for each chunk."""outputs = []for embeddings, annotations in zip(token_embeddings, span_annotation):if (max_length is not None): # remove annotations which go beyond the max-length of the modelannotations = [(start, min(end, max_length - 1))for (start, end) in annotationsif start < (max_length - 1)]pooled_embeddings = []for start, end in annotations:if (end - start) >= 1:pooled_embeddings.append(embeddings[start:end].sum(dim=0) / (end - start))# print("pooled_embeddings:", pooled_embeddings)pooled_embeddings = [embedding.numpy() for embedding in pooled_embeddings]outputs.append(pooled_embeddings)return outputsdef document_to_token_embeddings(model, tokenizer, document, batch_size=4096):"""Given a BERT model and tokenizer, return token embeddings of the input text document."""if batch_size > 8192:raise ValueError("Batch size is too large. Please use a batch size of 8192 or less.")# BERT tokenizer doesn't have .tokens() method, so we need to modify thistokenized_document = tokenizer(document, return_tensors="pt", add_special_tokens=True)input_ids = tokenized_document['input_ids']# Batch processingoutputs = []for i in range(0, input_ids.size(1), batch_size):start = iend = min(i + batch_size, input_ids.size(1))# subset inputs for current batchbatch_inputs = {k: v[:, start:end] for k, v in tokenized_document.items()}with torch.no_grad():model_output = model(**batch_inputs)outputs.append(model_output.last_hidden_state)return torch.cat(outputs, dim=1)# tokenizer = AutoTokenizer.from_pretrained('jinaai/jina-embeddings-v2-base-zh', trust_remote_code=True) # model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-zh', trust_remote_code=True)from transformers import BertModel, BertTokenizer # 加载预训练的 BERT 模型和 tokenizer model_name = 'bert-base-uncased' model_name = r"D:\source\pythonProject\bge-base-zh-v1.5" tokenizer = BertTokenizer.from_pretrained(model_name) model = BertModel.from_pretrained(model_name)import numpy as npcos_sim = lambda x, y: np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y))def encode_text(model, tokenizer, texts):"""Encode texts using BERT model"""if isinstance(texts, str):texts = [texts]embeddings = []with torch.no_grad():for text in texts:# Tokenize and encodeinputs = tokenizer(text,return_tensors="pt",padding=True,truncation=True,max_length=512)# Get model outputoutputs = model(**inputs)# Use mean poolingembedding = outputs.last_hidden_state.mean(dim=1).cpu().numpy()embeddings.append(embedding[0])return np.array(embeddings)print("*"*88) context_test_documents = ["""OpenAI的发展历程充满戏剧性。这家公司成立于2015年,最初是作为非营利组织运营。随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。有趣的是,在随后的几天里,它又经历了戏剧性的反转。数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。最终,在各方压力下,董事会不得不收回成命。这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。""","""特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。马斯克称它是一款革命性的产品,因为它采用了创新的不锈钢外壳设计。然而,这种特殊的材料选择也给它的生产带来了巨大挑战。据工厂工人透露,它的组装过程异常复杂,每一个焊接点都需要特殊处理。更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。尽管如此,它仍然吸引了大量订单。有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。分析师指出,它的成功与否将直接影响特斯拉在皮卡市场的地位。目前,它已经开始小批量生产,但产能爬坡面临诸多挑战。马斯克表示,要到2024年底,它才能实现每周一万台的生产目标。与此同时,它的竞争对手们也没有闲着。福特F-150 Lightning和雪佛兰Silverado EV都在积极扩大产能,这使得电动皮卡市场的竞争更加激烈。""","""中国最早的词典《说文解字》对汉字的研究影响深远。它由东汉许慎编撰完成,前后耗时数十载。这部巨著不仅系统地分析了汉字的构造原理,更开创了形声字的理论体系。在古代文人的著作中,它常常被引用作为考据的重要依据。值得注意的是,它采用了独特的部首分类法,按照540个部首将9353个字分门别类。这种分类方法影响了后世众多字典的编撰。宋代的《类篇》就是在它的基础上改进而来。明清时期,它更是成为了科举考试的必备参考书。随着时代发展,它的一些观点虽然被现代语言学家质疑,但它对汉字研究的系统性方法仍然具有重要的参考价值。特别是在考古发现中,它的许多论述都得到了甲骨文和金文的印证。现代学者在研究它的时候发现,许多当时被认为是臆测的字源解释,竟然与后来出土的古文字材料相吻合。这种惊人的准确性,使得它在数字化时代依然保持着极高的学术价值。近年来,随着人工智能技术的发展,它的数字化版本为计算机处理古文献提供了重要依据。""", ]# 测试查询,特别关注指代词相关的上下文 test_queries = [# OpenAI相关查询"OpenAI董事会解雇CEO的原因是什么","OpenAI在AI领域的影响力体现在哪里", # 指代OpenAI"董事会的决定造成了什么后果",# Cybertruck相关查询"Cybertruck的生产面临什么挑战","Cybertruck的售价情况如何", # 指代Cybertruck"Cybertruck的竞争对手有哪些", # 指代Cybertruck# 说文解字相关查询"说文解字的编撰过程","说文解字的分类方法有什么特点", # 指代说文解字"说文解字对后世产生了什么影响" # 指代说文解字 ]def process_all_documents(documents):"""处理所有文档,返回所有chunks和对应的embeddings"""all_chunks = []all_chunk_embeddings = [] # Late Chunking方法的embeddingsall_traditional_embeddings = [] # 传统方法的embeddingsdoc_boundaries = [] # 记录每个文档的起始位置start_idx = 0for doc in documents:print(f"\n处理文档 (前100字): {doc[:100]}...\n")# Late chunking 处理chunks, span_annotations = sentence_chunker(doc)token_embeddings = document_to_token_embeddings(model, tokenizer, doc)chunk_embeddings = late_chunking(token_embeddings, [span_annotations])[0]# 传统方法的embeddingstraditional_embeddings = encode_text(model, tokenizer, chunks)# 保存结果all_chunks.extend(chunks)all_chunk_embeddings.extend(chunk_embeddings)all_traditional_embeddings.extend(traditional_embeddings)# 记录文档边界doc_boundaries.append((start_idx, start_idx + len(chunks)))start_idx += len(chunks)print(f"文档被分割成 {len(chunks)} 个片段")return all_chunks, all_chunk_embeddings, all_traditional_embeddings, doc_boundariesdef search_across_documents(query, chunks, chunk_embeddings, traditional_embeddings, top_k=3):"""在所有文档中搜索相关内容"""# 获取查询的embeddingquery_embedding = encode_text(model, tokenizer, query)[0]# Late Chunking方法的相似度计算late_chunking_similarities = []for i, (chunk, emb) in enumerate(zip(chunks, chunk_embeddings)):sim = cos_sim(query_embedding, emb)late_chunking_similarities.append((sim, chunk, i))# 传统方法的相似度计算traditional_similarities = []for i, (chunk, emb) in enumerate(zip(chunks, traditional_embeddings)):sim = cos_sim(query_embedding, emb)traditional_similarities.append((sim, chunk, i))return (sorted(late_chunking_similarities, reverse=True)[:top_k],sorted(traditional_similarities, reverse=True)[:top_k])def context_understanding_with_references(documents, queries, top_k=3):"""主函数:处理所有文档并执行查询"""print("\n===== 开始处理所有文档 =====")# 处理所有文档all_chunks, all_chunk_embeddings, all_traditional_embeddings, doc_boundaries = process_all_documents(documents)print(f"\n总共处理了 {len(documents)} 个文档,产生了 {len(all_chunks)} 个文本片段")# 执行查询for query in queries:print(f"\n\n查询: {query}")print("-" * 50)# 在所有文档中搜索late_results, trad_results = search_across_documents(query,all_chunks,all_chunk_embeddings,all_traditional_embeddings,top_k)# 显示Late Chunking结果print(f"\n=== Late Chunking方法的top {top_k} 结果 ===")for sim, chunk, idx in late_results:# 找出该chunk属于哪个文档doc_id = next(i for i, (start, end) in enumerate(doc_boundaries) if start <= idx < end)print(f"\n相似度 {sim:.4f} (文档 #{doc_id}, 片段 #{idx}):")print(f"内容: {chunk}")# 显示传统方法结果print(f"\n=== 传统Embedding方法的top {top_k} 结果 ===")for sim, chunk, idx in trad_results:doc_id = next(i for i, (start, end) in enumerate(doc_boundaries) if start <= idx < end)print(f"\n相似度 {sim:.4f} (文档 #{doc_id}, 片段 #{idx}):")print(f"内容: {chunk}")# 使用示例 if __name__ == "__main__":context_understanding_with_references(context_test_documents, test_queries, top_k=3)
当然,思想还是late chunking,无非使用了中文支持较好的BGE模型。
看看结果返回:
===== 开始处理所有文档 =====处理文档 (前100字): OpenAI的发展历程充满戏剧性。这家公司成立于2015年,最初是作为非营利组织运营。随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。特别是在2022年底推出ChatGPT...文档被分割成 4 个片段处理文档 (前100字): 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。马斯克称它是一款...文档被分割成 5 个片段处理文档 (前100字): 中国最早的词典《说文解字》对汉字的研究影响深远。它由东汉许慎编撰完成,前后耗时数十载。这部巨著不仅系统地分析了汉字的构造原理,更开创了形声字的理论体系。在古代文人的著作中,它常常被...文档被分割成 5 个片段总共处理了 3 个文档,产生了 14 个文本片段查询: OpenAI董事会解雇CEO的原因是什么 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.5981 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。相似度 0.5306 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.5294 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。=== 传统Embedding方法的top 3 结果 ===相似度 0.7200 (文档 #0, 片段 #1): 内容: 然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。 董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。 虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。相似度 0.6566 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。相似度 0.6288 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。查询: OpenAI在AI领域的影响力体现在哪里 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.6719 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。相似度 0.5725 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。相似度 0.5650 (文档 #0, 片段 #1): 内容: 然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。 董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。 虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。=== 传统Embedding方法的top 3 结果 ===相似度 0.7341 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。相似度 0.6930 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.6772 (文档 #2, 片段 #13): 内容: 近年来,随着人工智能技术的发展,它的数字化版本为计算机处理古文献提供了重要依据。 查询: 董事会的决定造成了什么后果 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.4989 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。相似度 0.4933 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.4831 (文档 #1, 片段 #6): 内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。 尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。=== 传统Embedding方法的top 3 结果 ===相似度 0.6304 (文档 #0, 片段 #1): 内容: 然而,就在这个AI助手风靡全球的时候,公司内部却出现了意想不到的变故。 董事会突然宣布解雇CEO Sam Altman,这一决定在科技界引起轩然大波。 虽然它的这个决定充满争议,但董事会认为这是维护公司使命的必要之举。相似度 0.5970 (文档 #0, 片段 #2): 内容: 有趣的是,在随后的几天里,它又经历了戏剧性的反转。 数百名员工威胁集体辞职,微软对这位被解雇的CEO伸出橄榄枝。 最终,在各方压力下,董事会不得不收回成命。 这一系列事件充分说明,它在AI领域的影响力已经远超一般科技公司。相似度 0.5661 (文档 #1, 片段 #6): 内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。 尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。查询: Cybertruck的生产面临什么挑战 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.6323 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.5932 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.5794 (文档 #1, 片段 #5): 内容: 马斯克称它是一款革命性的产品,因为它采用了创新的不锈钢外壳设计。 然而,这种特殊的材料选择也给它的生产带来了巨大挑战。 据工厂工人透露,它的组装过程异常复杂,每一个焊接点都需要特殊处理。=== 传统Embedding方法的top 3 结果 ===相似度 0.6817 (文档 #1, 片段 #5): 内容: 马斯克称它是一款革命性的产品,因为它采用了创新的不锈钢外壳设计。 然而,这种特殊的材料选择也给它的生产带来了巨大挑战。 据工厂工人透露,它的组装过程异常复杂,每一个焊接点都需要特殊处理。相似度 0.6813 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.6601 (文档 #1, 片段 #7): 内容: 分析师指出,它的成功与否将直接影响特斯拉在皮卡市场的地位。 目前,它已经开始小批量生产,但产能爬坡面临诸多挑战。 马斯克表示,要到2024年底,它才能实现每周一万台的生产目标。 与此同时,它的竞争对手们也没有闲着。查询: Cybertruck的售价情况如何 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.6310 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.5791 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.5671 (文档 #1, 片段 #5): 内容: 马斯克称它是一款革命性的产品,因为它采用了创新的不锈钢外壳设计。 然而,这种特殊的材料选择也给它的生产带来了巨大挑战。 据工厂工人透露,它的组装过程异常复杂,每一个焊接点都需要特殊处理。=== 传统Embedding方法的top 3 结果 ===相似度 0.6763 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.6529 (文档 #1, 片段 #6): 内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。 尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。相似度 0.6220 (文档 #1, 片段 #8): 内容: 福特F-150 Lightning和雪佛兰Silverado EV都在积极扩大产能,这使得电动皮卡市场的竞争更加激烈。 查询: Cybertruck的竞争对手有哪些 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.6285 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.5820 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.5783 (文档 #1, 片段 #5): 内容: 马斯克称它是一款革命性的产品,因为它采用了创新的不锈钢外壳设计。 然而,这种特殊的材料选择也给它的生产带来了巨大挑战。 据工厂工人透露,它的组装过程异常复杂,每一个焊接点都需要特殊处理。=== 传统Embedding方法的top 3 结果 ===相似度 0.6663 (文档 #1, 片段 #8): 内容: 福特F-150 Lightning和雪佛兰Silverado EV都在积极扩大产能,这使得电动皮卡市场的竞争更加激烈。 相似度 0.6540 (文档 #1, 片段 #4): 内容: 特斯拉的Cybertruck终于在2023年底开始交付,这款酷似科幻电影道具的电动皮卡让人过目难忘。 从2019年首次发布概念车到现在,它经历了无数次延期和设计改进。相似度 0.6535 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 查询: 说文解字的编撰过程 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.6251 (文档 #1, 片段 #6): 内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。 尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。相似度 0.5181 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.5180 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。=== 传统Embedding方法的top 3 结果 ===相似度 0.6956 (文档 #2, 片段 #9): 内容: 中国最早的词典《说文解字》对汉字的研究影响深远。 它由东汉许慎编撰完成,前后耗时数十载。 这部巨著不仅系统地分析了汉字的构造原理,更开创了形声字的理论体系。 在古代文人的著作中,它常常被引用作为考据的重要依据。相似度 0.6843 (文档 #2, 片段 #12): 内容: 现代学者在研究它的时候发现,许多当时被认为是臆测的字源解释,竟然与后来出土的古文字材料相吻合。 这种惊人的准确性,使得它在数字化时代依然保持着极高的学术价值。相似度 0.6829 (文档 #2, 片段 #13): 内容: 近年来,随着人工智能技术的发展,它的数字化版本为计算机处理古文献提供了重要依据。 查询: 说文解字的分类方法有什么特点 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.6300 (文档 #1, 片段 #6): 内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。 尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。相似度 0.5506 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.5406 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。=== 传统Embedding方法的top 3 结果 ===相似度 0.6995 (文档 #2, 片段 #10): 内容: 值得注意的是,它采用了独特的部首分类法,按照540个部首将9353个字分门别类。 这种分类方法影响了后世众多字典的编撰。 宋代的《类篇》就是在它的基础上改进而来。 明清时期,它更是成为了科举考试的必备参考书。相似度 0.6718 (文档 #2, 片段 #9): 内容: 中国最早的词典《说文解字》对汉字的研究影响深远。 它由东汉许慎编撰完成,前后耗时数十载。 这部巨著不仅系统地分析了汉字的构造原理,更开创了形声字的理论体系。 在古代文人的著作中,它常常被引用作为考据的重要依据。相似度 0.6548 (文档 #2, 片段 #13): 内容: 近年来,随着人工智能技术的发展,它的数字化版本为计算机处理古文献提供了重要依据。 查询: 说文解字对后世产生了什么影响 --------------------------------------------------=== Late Chunking方法的top 3 结果 ===相似度 0.5945 (文档 #1, 片段 #6): 内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。 尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上获得了超高关注度。相似度 0.5012 (文档 #0, 片段 #3): 内容: 如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在明年推出,届时必将再次改变AI行业格局。 相似度 0.4948 (文档 #0, 片段 #0): 内容: OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。=== 传统Embedding方法的top 3 结果 ===相似度 0.6962 (文档 #2, 片段 #12): 内容: 现代学者在研究它的时候发现,许多当时被认为是臆测的字源解释,竟然与后来出土的古文字材料相吻合。 这种惊人的准确性,使得它在数字化时代依然保持着极高的学术价值。相似度 0.6864 (文档 #2, 片段 #11): 内容: 随着时代发展,它的一些观点虽然被现代语言学家质疑,但它对汉字研究的系统性方法仍然具有重要的参考价值。 特别是在考古发现中,它的许多论述都得到了甲骨文和金文的印证。相似度 0.6761 (文档 #2, 片段 #13): 内容: 近年来,随着人工智能技术的发展,它的数字化版本为计算机处理古文献提供了重要依据。
看最后一个结果:
查询: 说文解字对后世产生了什么影响
--------------------------------------------------
=== Late Chunking方法的top 3 结果 ===
相似度 0.5945 (文档 #1, 片段 #6):
内容: 更具争议的是,它的实际售价远超最初承诺的39,900美元起步价。
尽管如此,它仍然吸引了大量订单。 有意思的是,它的外观设计虽然争议不断,但却因其独特性在社交媒体上
获得了超高关注度。
相似度 0.5012 (文档 #0, 片段 #3):
内容:
如今,它正在积极推进GPT-5的研发,据报道,这个新模型的性能将远超现有版本。 业内专家预测,它可能会在
明年推出,届时必将再次改变AI行业格局。
相似度 0.4948 (文档 #0, 片段 #0):
内容:
OpenAI的发展历程充满戏剧性。 这家公司成立于2015年,最初是作为非营利组织运营。 随着GPT系列模型的推出,
它逐渐成为AI领域的领军企业。 特别是在2022年底推出ChatGPT后,它的影响力达到了顶峰。
=== 传统Embedding方法的top 3 结果 ===
相似度 0.6962 (文档 #2, 片段 #12):
内容: 现代学者在研究它的时候发现,许多当时被
认为是臆测的字源解释,竟然与后来出土的古文字材料相吻合。 这种惊人的准确性,使得它在数字化时代依然
保持着极高的学术价值。
相似度 0.6864 (文档 #2, 片段 #11):
内容:
随着时代发展,它的一些观点虽然被现代语言学家质疑,但它对汉字研究的系统性方法仍然具有重要的参考价值。
特别是在考古发现中,它的许多论述都得到了甲骨文和金文的印证。
相似度 0.6761 (文档 #2, 片段 #13):
内容: 近年来,随着人工智能技术的发展,它的数字化版本为计算机处理古文献提供了重要依据。
结论几乎和前面的一样,late chunking并没有预计的那么好。
参考:
https://mp.weixin.qq.com/s/I69YEZZl9EGtFH-c4vcQVw 文章专门提到了late chunking的英文比较