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.
%pip install --upgrade --quiet sentence-transformers > /dev/null
Buat sebuah
retriever
yang dapat menyimpan dan mengambil data teks menggunakan penyimpanan vektorChroma
.Gunakan metode
get_relevant_documents
dariretriever
untuk mengambil dokumen yang relevan untuk kueri yang diberikan.
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.
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.
# 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
[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
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.
# Keluarkan dokumen yang disusun ulang
_ = reorder_documents(docs)
[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]
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.
answer = chain.invoke(
{"question": "Apa yang bisa Anda ceritakan tentang ChatGPT?", "language": "INDONESIAN"}
)
[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.
print(answer)
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.
Last updated