首页 > 其他分享 >RAG中late chunking的实验效果测试

RAG中late chunking的实验效果测试

时间:2024-11-20 11:56:56浏览次数:1  
标签:RAG 片段 embeddings AI chunking chunk late 文档 相似

代码:

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. 具体案例分析

优秀案例:

查询:"OpenAI董事会解雇CEO的原因是什么" - 传统方法准确返回了相关段落,相似度0.6042 - 结果包含完整事件描述和上下文    问题案例:

查询:"说文解字的分类方法有什么特点"
- Late Chunking返回了Cybertruck的售价信息(相似度0.4901)
- 完全偏离主题,显示算法存在严重问题

 

总体结论

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并没有预计的那么好。

 

参考:

https://mp.weixin.qq.com/s/I69YEZZl9EGtFH-c4vcQVw 文章专门提到了late chunking的英文比较

 

标签:RAG,片段,embeddings,AI,chunking,chunk,late,文档,相似
From: https://www.cnblogs.com/bonelee/p/18556574

相关文章

  • RedisTemplate RedisConfig 序列化方式 fastjson2
    SpringDataRedis为我们提供了下面的Serializer:GenericToStringSerializer、Jackson2JsonRedisSerializer、JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、OxmSerializer、StringRedisSerializer。序列化方式对比:JdkSerializationRedisSerializer:使用JDK......
  • LaTeX教材排版-04:Geometry.tex文件说明
    LaTeX教材排版-04:Geometry.tex文件说明Latex教材这个文件用于设置版面,里面有一些很别扭的设置,目的是为了模拟出word的排版效果。在word中,预期的效果是:16开的纸,纸张宽为18.4cm,高为26cm;页面上、下、左、右边距分别为28mm、15mm、20mm、20mm,页眉顶端到页面顶端18mm,页脚底端到页面......
  • late chunking 源码分析-https://github.com/jina-ai/late-chunking
    importbisectimportloggingfromtypingimportDict,List,Optional,Tuple,Unionfromllama_index.core.node_parserimportSemanticSplitterNodeParserfromllama_index.core.schemaimportDocumentfromllama_index.embeddings.huggingfaceimportHugging......
  • 检索增强生成(RAG)应用构建的最佳实践
    RAG,也就是检索增强生成,已经证明是个挺管用的招儿,能让大型语言模型(LLM)的回答更靠谱,还能搞定它们有时候会“幻觉”的问题。简单来说,RAG就是给LLM们提供了一些上下文,帮它们生成更准确、更符合上下文的回答。这些上下文可以来自各种地方,比如你的内部文件、向量数据库、CSV文件、JS......
  • PGML:向量数据库内一体化的RAG框架
    架构总览特性:●支持数据库中进行的ai和ml分析●支持gpu加速●集成多种开源llm和rag框架●支持传统的机器学习模型使用方法云端试用官方提供了云服务试用,根据要求注册账号即可:注册地址本地部署官方提供了docker镜像,执行如下命令即可安装dockerrun\-it\......
  • 大模型实战(二):langchain+Ollama调用本地大模型实现RAG(保姆级)
    文章目录一、任务描述1.环境2.功能二、代码拆解1.导入包2.配置本地模型3.实例化embedding模型4.导入向量化知识库5.加入提示词6.定义查询方法7.问答三、总体代码一、任务描述由于显卡仍然较为昂贵,个人笔记本的硬件条件很难带动大模型,因此我们可以调用一......
  • LaTeX教材排版-03:OptionsAndPackages.tex文件说明
    LaTeX教材排版-03:OptionsAndPackages.tex文件说明Latex教材OptionsAndPackages.tex这个文件的作用有两个,一个是自定义了一些文类的选项,根据这些选项做对应的设置,包括调用Book文类等;一个是导入需要用到的宏包。文件内容如下:\newif\ifistwoside\istwosidefalse\DeclareOption{t......
  • 大模型应用开发 RAG 入门与实战:开启智能文档处理新时代
    在当今的人工智能领域,大模型应用开发成为了热门话题,而RAG(检索增强生成)技术更是备受关注。与其他相关技术书籍相比,《大模型应用开发:RAG入门与实战》有着独特的优势。比如说《深度学习基础教程》,它主要侧重于深度学习的基础理论讲解,对于RAG这种特定的应用开发涉及较少;而《......
  • 企业级知识库为什么要用GraphRAG - 硅谷企业级ChatGPT独角兽Glean系列之二
    ArvindJain阿尔温德·贾恩CEO发布时间:2024年5月15日。最后更新日期2024年11月6日。自从生成式AI和LLM在世界舞台上占据中心位置以来,员工们一直在思考如何最好地将这些变革性的新工具应用于他们的工作流程。然而,他们中的许多人在尝试将生成式AI集成到......
  • 寻找最优解的算法-模拟退火算法(Simulated Annealing)
    模拟退火算法(SimulatedAnnealing,简称SA)是一种基于物理退火过程的优化算法。它灵感来源于金属退火过程中的分子运动——在高温下,金属分子的自由度很高,随着温度的逐渐降低,分子排列逐渐有序,最终达到最低能量状态。退火算法通过模拟这一过程,解决复杂的优化问题。在现实生活中......