RAG中late chunking的實驗效果測試

bonelee發表於2024-11-20

程式碼:

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
- 結果包含完整事件描述和上下文

總體結論

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的英文比較

相關文章