RAG中late chunking的实验效果测试
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 | 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 ) |
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 | = = = = = 开始处理所有文档 = = = = = 处理文档 (前 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来进行这个实验,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 | 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模型。
看看结果返回:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 | = = = = = 开始处理所有文档 = = = = = 处理文档 (前 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的英文比较
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
2022-11-20 python多进程map用户 scatter绘图 make_blobs聚类数据生成
2022-11-20 linux quota命令使用——应用场景 针对不同的用户设置不同的磁盘访问大小
2019-11-20 浅谈僵尸网络利器:Fast-flux技术——只是一些特定的apt组织才使用,倒是很少在恶意软件的培植流量中看到
2017-11-20 python中set和frozenset方法和区别
2017-11-20 FireEye APT检测——APT业务占比过重,缺乏其他安全系统的查杀和修复功能
2017-11-20 安全领域应该关注的网站
2016-11-20 ES curl bulk 导入数据