04. Pengurutan Ulang Konteks Panjang Longcontextreorder

04. Pengurutan Ulang Konteks Panjang (LongContextReorder)

Pengurutan Ulang Konteks Panjang (LongContextReorder)

Terlepas dari arsitektur model Anda, kinerja akan menurun secara signifikan ketika Anda menyertakan lebih dari 10 dokumen yang diambil.

Sederhananya, ketika model perlu mengakses informasi yang relevan di tengah-tengah konteks yang panjang, model cenderung mengabaikan dokumen yang disediakan.

Untuk informasi lebih lanjut, lihat makalah berikut

Untuk menghindari masalah ini, Anda dapat menyusun ulang dokumen setelah pencarian untuk menghindari penurunan kinerja.

Terminal
%pip install --upgrade --quiet  sentence-transformers > /dev/null
  • Buat sebuah retriever yang dapat menyimpan dan mengambil data teks menggunakan penyimpanan vektor Chroma.
  • Gunakan metode get_relevant_documents dari retriever untuk mengambil dokumen yang relevan untuk kueri yang diberikan.
Python
from langchain.prompts import PromptTemplate
from langchain_community.document_transformers import LongContextReorder
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
 
# Mendapatkan embedding.
embeddings = OpenAIEmbeddings()
 
texts = [
    "Ini hanyalah tulisan yang saya tulis sembarangan.",
    "ChatGPT, AI yang dirancang untuk berinteraksi dengan pengguna, dapat menjawab berbagai pertanyaan.",
    "iPhone, iPad, dan MacBook adalah produk andalan yang diluncurkan oleh Apple.",
    "ChatGPT dikembangkan oleh OpenAI dan terus diperbaiki secara berkelanjutan.",
    "ChatGPT telah mempelajari sejumlah besar data untuk memahami pertanyaan pengguna dan menghasilkan jawaban yang sesuai.",
    "Perangkat wearable seperti Apple Watch dan AirPods juga termasuk dalam jajaran produk populer Apple.",
    "ChatGPT dapat digunakan untuk memecahkan masalah kompleks atau mengusulkan ide kreatif.",
    "Bitcoin sering disebut sebagai emas digital dan telah mendapatkan popularitas sebagai sarana penyimpanan nilai.",
    "Fungsi ChatGPT terus berkembang melalui pembelajaran dan pembaruan yang berkelanjutan.",
    "Piala Dunia FIFA diadakan setiap empat tahun sekali dan merupakan acara terbesar dalam sepak bola internasional.",
]
 
# Membuat retriever. (K diatur menjadi 10)
retriever = Chroma.from_texts(texts, embedding=embeddings).as_retriever(
    search_kwargs={"k": 10}
)

Metode get_relevant_documents meneruskan kueri ke pencari dan mengembalikan hasilnya.

Python
query = "Apa yang bisa Anda ceritakan tentang ChatGPT?"
 
# Dapatkan dokumen yang relevan yang diurutkan berdasarkan skor relevansi.
docs = retriever.get_relevant_documents(query)
docs
[Document(page_content='ChatGPT, AI yang dirancang untuk berinteraksi dengan pengguna, dapat menjawab berbagai pertanyaan.'), Document(page_content='ChatGPT telah mempelajari sejumlah besar data untuk memahami pertanyaan pengguna dan menghasilkan jawaban yang sesuai.'), Document(page_content='ChatGPT dapat digunakan untuk memecahkan masalah kompleks atau mengusulkan ide kreatif.'), Document(page_content='Fungsi ChatGPT terus berkembang melalui pembelajaran dan pembaruan yang berkelanjutan.'), Document(page_content='ChatGPT dikembangkan oleh OpenAI dan terus diperbaiki secara berkelanjutan.'), Document(page_content='Ini hanyalah tulisan yang saya tulis sembarangan.'), Document(page_content='Bitcoin sering disebut sebagai emas digital dan telah mendapatkan popularitas sebagai sarana penyimpanan nilai.'), Document(page_content='iPhone, iPad, dan MacBook adalah produk andalan yang diluncurkan oleh Apple.'), Document(page_content='Piala Dunia FIFA diadakan setiap empat tahun sekali dan merupakan acara terbesar dalam sepak bola internasional.'), Document(page_content='Perangkat wearable seperti Apple Watch dan AirPods juga termasuk dalam jajaran produk populer Apple.')]

Buat pengurutan ulang, sebuah instance dari kelas LongContextReorder.

  • Panggil reordering.transform_documents(docs) untuk menyusun ulang daftar dokumen dokumen.
  • Dokumen-dokumen disusun ulang sehingga dokumen yang kurang relevan berada di tengah-tengah daftar, dan dokumen yang lebih relevan berada di awal dan akhir.
Python
# Menyusun ulang dokumen
# Dokumen yang kurang relevan ditempatkan di tengah daftar, sementara elemen yang lebih relevan berada di awal/akhir.
reordering = LongContextReorder()
reordered_docs = reordering.transform_documents(docs)
 
# Periksa apakah 4 dokumen yang relevan berada di awal dan akhir daftar.
reordered_docs
Output
[Document(page_content='ChatGPT telah mempelajari sejumlah besar data untuk memahami pertanyaan pengguna dan menghasilkan jawaban yang sesuai.'), Document(page_content='Fungsi ChatGPT terus berkembang melalui pembelajaran dan pembaruan yang berkelanjutan.'), Document(page_content='Ini hanyalah tulisan yang saya tulis sembarangan.'), Document(page_content='iPhone, iPad, dan MacBook adalah produk andalan yang diluncurkan oleh Apple.'), Document(page_content='Perangkat wearable seperti Apple Watch dan AirPods juga termasuk dalam jajaran produk populer Apple.'), Document(page_content='Piala Dunia FIFA diadakan setiap empat tahun sekali dan merupakan acara terbesar dalam sepak bola internasional.'), Document(page_content='Bitcoin sering disebut sebagai emas digital dan telah mendapatkan popularitas sebagai sarana penyimpanan nilai.'), Document(page_content='ChatGPT dikembangkan oleh OpenAI dan terus diperbaiki secara berkelanjutan.'), Document(page_content='ChatGPT dapat digunakan untuk memecahkan masalah kompleks atau mengusulkan ide kreatif.'), Document(page_content='ChatGPT, AI yang dirancang untuk berinteraksi dengan pengguna, dapat menjawab berbagai pertanyaan.')]

Menggunakan LongContextReorder untuk membuat chain pertanyaan-jawaban

Python
from langchain_core.prompts import format_document
 
# Membuat prompt dokumen dasar. (dapat menambahkan sumber, metadata, dll.)
DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template(
    template="{page_content} [source: teddylee777@gmail.com]"
)
 
 
def combine_documents(
    docs,  # Daftar dokumen
    # Prompt dokumen (default: DEFAULT_DOCUMENT_PROMPT)
    document_prompt=DEFAULT_DOCUMENT_PROMPT,
    document_separator="\n",  # Pemisah dokumen (default: dua baris baru)
):
    # Menggabungkan dokumen untuk dimasukkan ke dalam konteks
    doc_strings = [
        f"[{i}] {format_document(doc, document_prompt)}" for i, doc in enumerate(docs)
    ]  # Membuat daftar string dokumen yang diformat dengan prompt yang diberikan
    return document_separator.join(
        doc_strings
    )  # Menggabungkan string dokumen yang diformat menggunakan pemisah dan mengembalikannya
 
 
def reorder_documents(docs):
    # Menyusun ulang
    reordering = LongContextReorder()
    reordered_docs = reordering.transform_documents(docs)
    combined = combine_documents(reordered_docs, document_separator="\n")
    print(combined)
    return combined

Keluarkan dokumen yang disusun ulang.

Python
# Keluarkan dokumen yang disusun ulang
_ = reorder_documents(docs)
Output
[0] ChatGPT telah mempelajari sejumlah besar data untuk memahami pertanyaan pengguna dan menghasilkan jawaban yang sesuai. [source: teddylee777@gmail.com]
[1] Fungsi ChatGPT terus berkembang melalui pembelajaran dan pembaruan yang berkelanjutan. [source: teddylee777@gmail.com]
[2] Ini hanyalah tulisan yang saya tulis sembarangan. [source: teddylee777@gmail.com]
[3] iPhone, iPad, dan MacBook adalah produk andalan yang diluncurkan oleh Apple. [source: teddylee777@gmail.com]
[4] Perangkat wearable seperti Apple Watch dan AirPods juga termasuk dalam jajaran produk populer Apple. [source: teddylee777@gmail.com]
[5] Piala Dunia FIFA diadakan setiap empat tahun sekali dan merupakan acara terbesar dalam sepak bola internasional. [source: teddylee777@gmail.com]
[6] Bitcoin sering disebut sebagai emas digital dan telah mendapatkan popularitas sebagai sarana penyimpanan nilai. [source: teddylee777@gmail.com]
[7] ChatGPT dikembangkan oleh OpenAI dan terus diperbaiki secara berkelanjutan. [source: teddylee777@gmail.com]
[8] ChatGPT dapat digunakan untuk memecahkan masalah kompleks atau mengusulkan ide kreatif. [source: teddylee777@gmail.com]
[9] ChatGPT, AI yang dirancang untuk berinteraksi dengan pengguna, dapat menjawab berbagai pertanyaan. [source: teddylee777@gmail.com]
Python
from langchain.prompts import ChatPromptTemplate
from operator import itemgetter
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda
 
# Template prompt
template = """Berikut adalah kutipan teks:
{context}
 
-----
Silakan jawab pertanyaan berikut:
{question}
 
Jawab dalam bahasa berikut: {language}
"""
 
# Mendefinisikan prompt
prompt = ChatPromptTemplate.from_template(template)
 
# Mendefinisikan Chain
chain = (
    {
        "context": itemgetter("question")
        | retriever
        | RunnableLambda(reorder_documents),  # Mencari konteks berdasarkan pertanyaan.
        "question": itemgetter("question"),  # Mengambil pertanyaan.
        "language": itemgetter("language"),  # Mengambil bahasa untuk jawaban.
    }
    | prompt  # Mengirimkan nilai ke template prompt.
    | ChatOpenAI()  # Mengirimkan prompt ke model bahasa.
    | StrOutputParser()  # Parsing keluaran model menjadi string.
)

Masukkan kueri yang dimaksud dalam question dan bahasa dalam language.

  • Melihat hasil pencarian untuk dokumen yang disusun ulang.
Python
answer = chain.invoke(
    {"question": "Apa yang bisa Anda ceritakan tentang ChatGPT?", "language": "INDONESIAN"}
)
Output
[0] ChatGPT telah mempelajari sejumlah besar data untuk memahami pertanyaan pengguna dan menghasilkan jawaban yang sesuai. [source: teddylee777@gmail.com]
[1] Fungsi ChatGPT terus berkembang melalui pembelajaran dan pembaruan yang berkelanjutan. [source: teddylee777@gmail.com]
[2] Ini hanyalah tulisan yang saya tulis sembarangan. [source: teddylee777@gmail.com]
[3] iPhone, iPad, dan MacBook adalah produk andalan yang diluncurkan oleh Apple. [source: teddylee777@gmail.com]
[4] Perangkat wearable seperti Apple Watch dan AirPods juga termasuk dalam jajaran produk populer Apple. [source: teddylee777@gmail.com]
[5] Piala Dunia FIFA diadakan setiap empat tahun sekali dan merupakan acara terbesar dalam sepak bola internasional. [source: teddylee777@gmail.com]
[6] Bitcoin sering disebut sebagai emas digital dan telah mendapatkan popularitas sebagai sarana penyimpanan nilai. [source: teddylee777@gmail.com]
[7] ChatGPT dikembangkan oleh OpenAI dan terus diperbaiki secara berkelanjutan. [source: teddylee777@gmail.com]
[8] ChatGPT dapat digunakan untuk memecahkan masalah kompleks atau mengusulkan ide kreatif. [source: teddylee777@gmail.com]
[9] ChatGPT, AI yang dirancang untuk berinteraksi dengan pengguna, dapat menjawab berbagai pertanyaan. [source: teddylee777@gmail.com]

Cetak jawabannya.

Python
print(answer)
Output
ChatGPT adalah sebuah sistem kecerdasan buatan yang dikembangkan oleh OpenAI. Sistem ini telah mempelajari sejumlah besar data untuk dapat memahami pertanyaan pengguna dan memberikan jawaban yang sesuai. ChatGPT terus berkembang melalui pembelajaran dan pembaruan yang berkelanjutan. Selain itu, ChatGPT juga dapat digunakan untuk memecahkan masalah kompleks atau mengusulkan ide kreatif. AI ini dirancang untuk berinteraksi dengan pengguna dan dapat menjawab berbagai pertanyaan dengan akurat.