RAG中late chunking的实验效果测试
代码:
import os import json import torch import numpy as np import spacy from spacy.tokens import Doc from spacy.language import Language import transformers from transformers import AutoModel from transformers import AutoTokenizer def 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 spacy nlp = 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_annotations def sentence_chunker(document, batch_size=128): """ 修改分块策略,使用更合理的分句方式 """ nlp = spacy.blank("zh") # 改用中文模型 nlp.add_pipe("sentencizer") # 使用更细粒度的分句规则 doc = nlp(document) chunks = [] span_annotations = [] current_chunk = [] current_start = 0 for sent in doc.sents: # 如果当前句子加入后长度合适,就加入当前chunk if len(''.join(current_chunk)) + len(sent.text) < batch_size: current_chunk.append(sent.text) else: # 否则保存当前chunk并开始新的chunk if current_chunk: text = ' '.join(current_chunk) chunks.append(text) span_annotations.append((current_start, len(text))) current_start = len(text) + 1 current_chunk = [sent.text] # 处理最后一个chunk if current_chunk: text = ' '.join(current_chunk) chunks.append(text) span_annotations.append((current_start, len(text))) return chunks, span_annotations def 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_size outputs = [] for i in range(0, len(tokens), batch_size): start = i end = min(i + batch_size, len(tokens)) # subset huggingface tokenizer outputs to i : i + batch_size batch_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_output def 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 model annotations = [ (start, min(end, max_length - 1)) for (start, end) in annotations if 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 outputs 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) 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方法的embeddings all_traditional_embeddings = [] # 传统方法的embeddings doc_boundaries = [] # 记录每个文档的起始位置 start_idx = 0 for 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进行embedding traditional_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_boundaries def search_across_documents(query, chunks, chunk_embeddings, traditional_embeddings, top_k=3): """在所有文档中搜索相关内容""" # 获取查询的embedding with 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 np import spacy from spacy.tokens import Doc from spacy.language import Language import transformers from transformers import AutoModel from transformers import AutoTokenizer def sentence_chunker(document, batch_size=128): """ 修改分块策略,使用更合理的分句方式 """ nlp = spacy.blank("zh") # 改用中文模型 nlp.add_pipe("sentencizer") # 使用更细粒度的分句规则 doc = nlp(document) chunks = [] span_annotations = [] current_chunk = [] current_start = 0 for sent in doc.sents: # 如果当前句子加入后长度合适,就加入当前chunk if len(''.join(current_chunk)) + len(sent.text) < batch_size: current_chunk.append(sent.text) else: # 否则保存当前chunk并开始新的chunk if current_chunk: text = ' '.join(current_chunk) chunks.append(text) span_annotations.append((current_start, len(text))) current_start = len(text) + 1 current_chunk = [sent.text] # 处理最后一个chunk if current_chunk: text = ' '.join(current_chunk) chunks.append(text) span_annotations.append((current_start, len(text))) return chunks, span_annotations def 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 spacy nlp = 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_annotations def 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 model annotations = [ (start, min(end, max_length - 1)) for (start, end) in annotations if 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 outputs def 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 this tokenized_document = tokenizer(document, return_tensors="pt", add_special_tokens=True) input_ids = tokenized_document['input_ids'] # Batch processing outputs = [] for i in range(0, input_ids.size(1), batch_size): start = i end = min(i + batch_size, input_ids.size(1)) # subset inputs for current batch batch_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 np cos_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 encode inputs = tokenizer( text, return_tensors="pt", padding=True, truncation=True, max_length=512 ) # Get model output outputs = model(**inputs) # Use mean pooling embedding = 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方法的embeddings all_traditional_embeddings = [] # 传统方法的embeddings doc_boundaries = [] # 记录每个文档的起始位置 start_idx = 0 for 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] # 传统方法的embeddings traditional_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_boundaries def search_across_documents(query, chunks, chunk_embeddings, traditional_embeddings, top_k=3): """在所有文档中搜索相关内容""" # 获取查询的embedding query_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并没有预计的那么好。==>本文用的是v2版本!后面的文章将比较v3版本的实际效果。
参考:
https://mp.weixin.qq.com/s/I69YEZZl9EGtFH-c4vcQVw 文章专门提到了late chunking的英文比较