> 기술 주변기기 > 일체 포함 > 래그에 대한 늦은 청크 : Jina AI와의 구현

래그에 대한 늦은 청크 : Jina AI와의 구현

尊渡假赌尊渡假赌尊渡假赌
풀어 주다: 2025-03-02 09:05:11
원래의
264명이 탐색했습니다.

Late Chunking for RAG: Implementation With Jina AI 검색 강화 생성 (RAG) 애플리케이션은 항상 두 가지 접근 방식 사이에 트레이드 오프를 갖습니다. 더 나은 컨텍스트를 위해 전체 문서를 포함 시키거나 더 정확한 검색을 위해 더 작은 청크로 분해합니다.

전체 문서를 포함하면 글로벌 정보를 캡처 할 수 있지만 더 짧은 블록은 세부 사항을 보존 할 수 있지만 종종 전체 상황을 무시합니다.

지연된 청킹은 전체 문서 컨텍스트를 유지하면서 더 작고 쉬운 청크로 나누는 솔루션을 제공합니다.

이 기사는 전통적인 순진한 청킹 방법에 대한 더 나은 대안으로 지연된 청킹을 소개하고 점차 구현 방법을 보여줄 것입니다.

Langchain의 헝겊 를 사용하는 RAG (Retrieval Enhanced Generation) 및 Langchain을 사용하여 외부 데이터를 대형 언어 모델 (LLM)과 통합하십시오. 코스를 탐색 천연 차단 및 rag 의 한계 Rag Pipeline의 는 벡터 데이터베이스에 내장 및 저장되기 전에 문서가 작은 청크로 분해됩니다. 각 블록은 독립적으로 처리되며 쿼리 시간에 검색하는 데 사용됩니다. 그러나이 "순진한 청킹"접근 방식은 종종 중요한 장거리 상황을 잃습니다.

문제는 전통적인 청킹 방법이 문서를 분류 할 때 정보의 연관 방법을 고려하지 않는다는 것입니다. 예를 들어, 파리에 관한 문서에서“이 도시”라는 문구는“파리”가있는 블록과 다를 수 있습니다. 완전한 컨텍스트가 없으면 검색 모델이 이러한 참조를 상관시키기가 어려울 수있어 결과가 부정확합니다. 긴 문서에서는 여러 섹션에 중요한 상황이 흩어져 있으며, 이는 훨씬 더 심각합니다.

Delayed chunking: Preserve context in document segmentation

Delayed chunking solves this problem by changing the time to split the document. 지연된 청크는 먼저 문서를 청크로 나누는 것이 아니라 긴 컨텍스트 모델을 사용하여 전체 문서를 포함시키는 것입니다. 이 후에야 문서를 작은 덩어리로 나눕니다.

지연 청크의 주요 장점 :

<:> 컨텍스트 유지 : 지연된 청크는 전체 문서를 먼저 포함시켜 각 블록을 전체 컨텍스트를 유지하도록합니다. 이런 식으로, 텍스트의 참고 문헌과 연결은 블록 임베딩에서 그대로 유지됩니다.

더 나은 검색 : 지연된 청크로 생성 된 블록 임베딩은 더 풍부하고 정확합니다. 따라서 모델이 문서를 더 잘 이해하기 때문에 RAG 시스템의 검색 결과를 향상시킵니다.

긴 텍스트 처리 : 태그 제한으로 인해 전통적인 모델을 한 번에 처리 할 수없는 긴 문서에 매우 유용합니다.

Jina 's Jinaai/Jina-embeddings-V2-Base-en (최대 8192 마크를 지원)과 같은 긴 컨텍스트 모델을 사용하여 지연된 청킹을 사용하면 큰 텍스트 부품이 블록으로 분할되기 전에 효과적으로 내장 할 수 있습니다.

지연 청크 구현

이것은 Jina의 긴 컨텍스트 임베딩 모델을 사용하여 지연 청크를 구현하기위한 단계별 안내서입니다. 여기에서 Jina의 API 키를 무료로 얻을 수 있으며 다음 입력 텍스트를 데모로 사용하겠습니다.

<code>input_text = """Berlin is the capital and largest city of Germany, both by area and by population.
Its more than 3.85 million inhabitants make it the European Union's most populous city, as measured by population within city limits.
The city is also one of the states of Germany, and is the third smallest state in the country in terms of area."""</code>
로그인 후 복사
1 단계 : 블록을 가져 와서 주석을 눌렀습니다 먼저 Jina API 키와 아래의 도우미 기능을 사용하여 입력 텍스트를 청크로 나눕니다. 이 블록에는 스팬 주석이 함께 제공되므로 나중에 문서 임베딩을 분할하는 데 도움이됩니다. Jina의 API는 단락 또는 문장과 같은 자연 경계를 사용하여 블록이 의미가 있고 의미를 유지하는지 확인합니다.

2 단계 : 텍스트를 토큰 화하고 태그 수준 문서를 포함시켜 를 생성합니다. 먼저, Jina의 Embedings-V2-Base-en과 같은 긴 컨텍스트 모델과 호환되는 Tagger를 사용하여 전체 문서를 태그로 나눕니다. 다음으로 긴 컨텍스트 변환기 모델을 사용하여 각 태그에 대한 임베딩을 만듭니다. 이것은 문서의 모든 단어 나 마커가 그 의미를 포착하기 위해 고유 한 임베딩을 얻음을 의미합니다.

<code>import json
import requests

def custom_tokenize_jina_api(input_text: str):
    url = '<https:></https:>'
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ENTER_YOUR_JINA_API_KEY'
    }
    data = {
        "content": input_text,
        "tokenizer": "o200k_base",
        "return_tokens": "true",
        "return_chunks": "true",
        "max_chunk_length": "1000"
    }
    # Make the API request
    response = requests.post(url, headers=headers, json=data)
    response_data = response.json()
    chunks = response_data.get("chunks", [])
    i = 1
    j = 1
    span_annotations = []
    for x in response_data['tokens']:
        if j == 1:
            j = len(x)
        else:
            j = len(x) + i
        span_annotations.append((i, j))
        i = j
    return chunks, span_annotations
chunks, span_annotations = custom_tokenize_jina_api(input_text)

print(chunks)
print(span_annotations)</code>
로그인 후 복사
<code>['Berlin is the capital and largest city of Germany, both by area and by population.\n\n', "Its more than 3.85 million inhabitants make it the European Union's most populous city, as measured by population within city limits.\n\n", 'The city is also one of the states of Germany, and is the third smallest state in the country in terms of area.']
[(1, 17), (17, 44), (44, 69)]</code>
로그인 후 복사
3 단계 : 지연 청크 전체 문서에 대한 태그 내장이 있으면 지연된 청킹을 수행 할 수 있습니다. 1 단계의 스팬 주석을 사용 하여이 마크를 작은 덩어리로 분할하십시오. 그런 다음 평균 풀링을 각 블록 내의 임베드 평균에 적용하여 각 블록에 대해 단일 내장을 만듭니다. 이제 전체 문서의 강력한 컨텍스트 정보를 포함하는 블록 임베딩이 있습니다.

4 단계 : 지연된 청킹 및 전통적인 청킹 결과 비교
<code>from transformers import AutoModel
from transformers import AutoTokenizer

# load model and tokenizer
tokenizer = AutoTokenizer.from_pretrained('jinaai/jina-embeddings-v2-base-en', trust_remote_code=True)
model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-en', trust_remote_code=True)
inputs = tokenizer(input_text, return_tensors='pt')
model_output = model(**inputs)
model_output[0].shape</code>
로그인 후 복사
지연된 청크의 장점을 이해하려면 전통적인 청크와 비교해 봅시다 :
<code>torch.Size([1, 71, 768]) # 71 代表整个文档中的标记数</code>
로그인 후 복사

두 번째 및 세 번째 블록에서 볼 수 있듯이 전통적인 청킹은 "베를린"이라는 단어와 비교하여 유사성 점수가 70-75%를 보여줍니다. 그러나 지연된 청킹 (전체 문서의 컨텍스트 유지)을 사용 하여이 점수는 82-84%로 증가했습니다. 이는 지연된 청크가 컨텍스트를 보존하고보다 의미있는 임베딩을 만드는 데 더 나은 작업을 수행하여보다 정확한 검색 결과를 초래한다는 것을 시사합니다.

결론
<code>def late_chunking(
    model_output: 'BatchEncoding', span_annotation: list, max_length=None
):
    token_embeddings = model_output[0]
    outputs = []
    for embeddings, annotations in zip(token_embeddings, span_annotation):
        if (
            max_length is not None
        ):  # remove annotations which go bejond the max-length of the model
            annotations = [
                (start, min(end, max_length - 1))
                for (start, end) in annotations
                if start = 1
        ]
        pooled_embeddings = [
            embedding.detach().cpu().numpy() for embedding in pooled_embeddings
        ]
        outputs.append(pooled_embeddings)
    return outputs</code>
로그인 후 복사
Delayed chunking is a significant improvement to the document retrieval system, especially in the RAG pipeline. 지연된 청킹은 문서를 분할하기 전에 문서가 완전히 내장 될 때까지 대기하여 각 블록의 전체 컨텍스트를 유지합니다. 이것은보다 정확하고 의미있는 임베딩으로 이어집니다.
<code>embeddings = late_chunking(model_output, [span_annotations])[0]
len(embeddings)</code>
로그인 후 복사
프로젝트 : 기술 문서
<code>3 # 与步骤 1 中的块数匹配</code>
로그인 후 복사
에 대한 래그 챗봇 구축 기술 문서에 대한 질문에 대답하기위한 챗봇을 만들기 위해 Langchain을 사용하여 Rag를 구현하십시오. 프로젝트를 탐색하십시오

위 내용은 래그에 대한 늦은 청크 : Jina AI와의 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿