01. Chain of Tables for Multiple Tables
CYQIQ Chain of Table for Multiple Tables
CYQIQ Chain of Table adalah teknik untuk memproses beberapa tabel.
Teknik ini digunakan untuk mengekstraksi dan mengintegrasikan informasi dari berbagai tabel untuk menghasilkan jawaban atas pertanyaan pengguna.
CYQIQ Chain of Table bertujuan untuk memahami hubungan antar tabel dan mencari informasi yang diperlukan secara efektif untuk disajikan kepada pengguna.
Melalui teknik ini, pengguna dapat memanfaatkan data yang tersebar di beberapa tabel secara terpadu, sehingga memperoleh informasi yang lebih akurat dan bermanfaat.
Teknologi CYQIQ Chain of Table dapat diterapkan dalam berbagai bidang seperti manajemen basis data, pencarian informasi, dan pemrosesan bahasa alami.
Penulis: Richárd Hruby and Dániel Márk Szalai from CYQIQ Inc.
Chain of table
Teknologi Chain of Table adalah teknik baru yang dikembangkan oleh peneliti dari Google dan Universitas California, San Diego.
Teknik ini melibatkan operasi SQL seperti select, group, sort dan join pada tabel yang tidak terstrukturisasi dengan cara yang lebih efisien dan efektif.
CoT juga menggunakan teknik pengambilan data dari tabel yang tidak terstrukturisasi untuk membuat tabel baru dengan struktur yang lebih sederhana dan mudah dipahami oleh LLM.
Teknik ini memungkinkan LLM untuk menjawab pertanyaan dengan cara yang lebih sederhana dan efektif, membuat tabel baru yang lebih mudah dipahami oleh LLM.
Untuk informasi lebih lanjut tentang CoT, silakan lihat di bawah ini:
Wang, Zilong et al. Chain-of-Table: Evolving Tables in the Reasoning Chain for Table Understanding. 2024. arXiv: 2401.04398 [cs.CL].
Analisis CoT
CoT beroperasi melalui rantai tabel perantara.
menyebabkan kesalahan yang tidak terduga seperti overflow konteks atau menghasilkan informasi yang tidak ada pada kolom baru.
Dua masalah ini semakin serius ketika ukuran tabel yang digunakan besar.
Dalam mengembangkan CoT untuk lingkungan produksi, mungkin ada masalah tambahan yang ditemukan.
Metode ini tidak dapat memproses beberapa tabel secara bersamaan, dan pengembang harus membuat parser untuk perintah yang dihasilkan oleh LLM sendiri. (Namun, ada perdebatan tentang hal ini. LLM dapat membuat tabel secara keseluruhan, tetapi lagi-lagi, masalah konteks jendela dan kepercayaan (kesalahan) dapat terjadi, sehingga menjalankan kode manipulasi tabel di luar ruang lingkup LLM mungkin lebih baik.)
CYQIQ - CoT for multiple tables
CYQIQ adalah sistem yang menyediakan fungsi Chain-of-Thought (CoT) untuk beberapa tabel.
CoT adalah metode yang memecah proses inferensi yang kompleks menjadi langkah-langkah kecil, kemudian menghasilkan hasil akhir berdasarkan hasil antara.
CYQIQ menggunakan pendekatan CoT untuk mengintegrasikan informasi yang terdistribusi di beberapa tabel dan menghasilkan jawaban yang akurat untuk pertanyaan.
Teknologi ini dapat digunakan dalam bidang database query, pencarian informasi, atau pemrosesan bahasa alami.
Dalam notebook ini, kami akan memperkenalkan konsep CoT terbaru untuk beberapa tabel dan implementasi yang lebih praktis menggunakan LangChain dan LangGraph.
Kami akan menggunakan Pandas sebagai tabel manajer.
Seperti CoT, kami akan meminta LLM untuk membuat serangkaian tugas untuk memanipulasi dataframe, kemudian melakukan tugas pertama dan memberikan tabel antara kepada LLM untuk membuat tugas berikutnya dalam rantai.
1. Mengimpor library yang diperlukan
Ini adalah tahap untuk mengimpor pustaka yang diperlukan.
Pada tahap ini, berbagai pustaka yang diperlukan untuk pengembangan program dimuat menggunakan perintah import
.
Mengimpor pustaka adalah proses menyiapkan agar fungsi, kelas, modul, dan elemen lain yang disediakan oleh pustaka tersebut dapat digunakan.
Untuk menginstal pustaka yang diperlukan, jalankan perintah berikut: pip install langchain langchain_openai langgraph langchainhub pandas tabulate
Atau, Anda juga dapat menjalankannya dengan cara berikut: pip install -r requirements.txt
Kode ini menggunakan pustaka LangChain dan LangGraph untuk mengimplementasikan sistem AI interaktif.
Library dan modul yang diperlukan diimpor sebagai berikut:
Library dasar:
json
,pandas
,traceback
Modul untuk tipe hint:
TypedDict
,Annotated
,Sequence
darityping
Modul operator
Library kustom:
get_last_chains
,save_new_chain
Library LangChain:
ChatOpenAI
,BaseMessage
,FunctionMessage
,HumanMessage
,tool
,convert_to_openai_function
,ChatPromptTemplate
,MessagesPlaceholder
,hub
Library LangGraph:
ToolExecutor
,ToolInvocation
,StateGraph
,END
Kode ini memanfaatkan LangChain dan LangGraph untuk mengatur struktur dasar sistem AI interaktif. Fungsi kustom dan tipe hint digunakan untuk meningkatkan keterbacaan dan pemeliharaan kode.
2. Environment Variable:
Untuk melakukan tugas ini, pastikan file [.env] harus ada di lokasi yang sama dengan file notebook ini, Isi file dalam format berikut:
Impor fungsi
load_dotenv
dari moduldotenv
.Panggil fungsi
load_dotenv()
untuk memuat variabel lingkungan.
3. Mengambil daftar DataFrame
Di sini, tabel dibaca dan dikonversi menjadi dictionary untuk memudahkan eksekusi kode.
Selain itu, daftar string pertanyaan dibuat, yang merupakan deskripsi tentang tabel yang dapat diberikan ke LLM.
Deskripsi ini digunakan dalam prompt untuk membantu LLM memilih tabel yang relevan dengan pertanyaan.
Dalam lingkungan operasional sebenarnya, deskripsi tabel ini juga dihasilkan melalui panggilan ke LLM.
Di sini ditunjukkan contoh sederhana yang mencakup 6 tabel dan deskripsi yang di-hardcode.
6 file CSV (dari coworker0.csv hingga coworker5.csv) dibaca, masing-masing menghasilkan DataFrame, dan disimpan dalam
df_list
.Dictionary
df_dic
dibuat dan diberikan pasangan kunci-DataFrame, di mana kunci adalahdf1
hinggadf6
.df_dic
digunakan dalam fungsievaluate_pandas_chain
untuk secara dinamis merujuk DataFrame dengan menggunakan fungsieval()
.
Variabel
questions_str
berisi string yang menjelaskan beberapa dataframe.Setiap dataframe diberi nomor dari
df1
hinggadf6
.df1
berisi tentang pemilihan rekan kerja yang paling berharga (MVP) yang telah memberikan kontribusi luar biasa terhadap kinerja dan produktivitas perusahaan.df2
berisi tentang pemilihan rekan kerja yang memiliki potensi terbesar.df3
berisi tentang pemilihan rekan kerja yang paling diinginkan untuk diajak berkolaborasi.df4
berisi tentang pemilihan rekan kerja yang paling menegangkan atau sering menimbulkan konflik.df5
berisi tentang pemilihan rekan kerja yang paling sulit untuk diajak berkolaborasi.df6
berisi metadata tentang orang-orang yang berpartisipasi dalam survei.
4. Ambil aksi berikut:
Seperti yang telah disebutkan sebelumnya, kita akan melakukan hanya satu aksi pada setiap siklus generasi.
Fungsi ini membantu dalam mencari aksi dari output LLM.
Fungsi get_action
mem-parsing rantai aksi untuk mengekstrak aksi individu.
Jika string actions
mengandung "":
Pisahkan
actions
berdasarkan "->" dan ambil bagian kedua.Hapus spasi di depan dan di belakang bagian yang diambil dan alokasikan ke variabel
a
.
Jika string actions
tidak mengandung "":
Pisahkan
actions
berdasarkan "->" dan ambil bagian pertama.Hapus spasi di depan dan di belakang bagian yang diambil dan alokasikan ke variabel
a
.Kembalikan aksi yang diekstrak
a
.
5. Definisi alat yang dapat digunakan oleh LLM (Large Language Model)
Definisikan dua alat yang dapat digunakan oleh LLM untuk melakukan aksi dan berinteraksi dengan dunia (atau dalam hal ini, data).
Alat view_pandas_dataframes
bertugas memberikan informasi tentang data frame kepada LLM, seperti nama kolom dan beberapa baris data pertama.
Perlu diperhatikan bahwa tabel yang sangat besar dapat sepenuhnya mengisi konteks LLM.
Namun, ini bukanlah batasan besar karena tabel-tabel tersebut dapat dibagi menjadi beberapa tabel kecil yang secara logis terkait, dan memerlukan ratusan kolom untuk menimbulkan masalah seperti itu berdasarkan isi tabel.
Jika pembagian tidak memungkinkan, disarankan untuk mengurangi jumlah baris yang dimasukkan ke LLM.
Alat evaluate_pandas_chain
bertugas menjalankan aksi yang dihasilkan dan mengembalikan kepala dari data frame sementara yang dihasilkan, serta aksi yang telah dilakukan dan data frame lengkap.
Untuk informasi lebih lanjut tentang cara kerja alat-alat tersebut, lihat dokumentasi.
Fungsi
evaluate_pandas_chain
digunakan untuk menjalankan rantai aksi pandas.Parameter
chain
adalah string yang menunjukkan rantai aksi pandas yang akan dijalankan.Parameter
inter
digunakan untuk menyimpan hasil sementara selama eksekusi rantai.Gunakan fungsi
get_action
untuk mengekstrak aksi berikutnya dari rantai.Gunakan fungsi
eval
untuk menjalankan aksi yang diekstrak dan simpan hasilnya diinter
.Jika hasilnya adalah DataFrame, kembalikan 50 baris pertama dalam format markdown menggunakan
.head(50)
.Jika terjadi pengecualian, kembalikan informasi pengecualian.
Fungsi
view_pandas_dataframes
digunakan untuk memeriksa hingga 3 DataFrame.Parameter
df_list
adalah daftar nama DataFrame yang akan diperiksa.Ambil DataFrame yang diminta dari
df_dic
dan kembalikan 10 baris pertama dalam format markdown menggunakan.head(10)
.Daftar
tools
mencakup fungsievaluate_pandas_chain
danview_pandas_dataframes
.tool_executor
adalah instance dari kelasToolExecutor
yang dibuat dengan menerima daftartools
sebagai argumen.Daftar
functions
menyimpan hasil konversi setiap fungsi dalam daftartools
ke format fungsi OpenAI.
Berikut ini adalah hasil koreksi konten yang diberikan seperti yang diminta.
6. Generate Prompt
Gunakan pesan sistem untuk menjelaskan kepada LLM pekerjaan yang perlu dilakukan saat ini.
Beritahu jumlah data frame yang dapat diakses oleh LLM dan minta LLM untuk menggunakan alat yang telah didefinisikan.
Jelaskan bahwa tujuan utamanya adalah untuk membuat data frame yang akan membantu menjawab pertanyaan spesifik pengguna.
Selanjutnya, jelaskan harapan terkait rantai aksi (action chain) yang dihasilkan, yang akan berguna untuk eksekusi kode atau penggunaan alat evaluate_pandas_chain
.
Berikan beberapa contoh untuk menjelaskan logika apa yang harus diikuti untuk pertanyaan contoh tertentu.
Tunjukkan juga contoh atau "resep" yang benar dari masa lalu sebagai referensi di masa depan.
Terakhir, tunjukkan alat yang baru saja dibuat, deskriptor data frame, dan log pesan terbaru antara agen dan pengguna.
Setelah mendefinisikan template prompt, lengkapi dengan informasi yang diperlukan.
Ambil template prompt "hrubyonrails/multi-cot" dari Langchain Hub ke dalam variabel
SYSTEM_PROMPT
.Template prompt yang diambil dapat diakses melalui
messages[0].prompt.template
.Gunakan
print(SYSTEM_PROMPT)
untuk mencetak template prompt yang diformat.
Gunakan
ChatPromptTemplate
untuk membuat template prompt yang mencakup sistem prompt (SYSTEM_PROMPT
) danMessagesPlaceholder
.Gunakan metode
partial
untuk menerapkan variabel berikut secara parsial pada template prompt:num_dfs
: Panjang daridf_list
tool_names
: String yang memisahkan nama-nama alat dalam daftartools
dengan komaquestions_str
: String pertanyaanJika hasil dari fungsi
get_last_chains()
adalah tipepd.core.frame.DataFrame
, buat stringchain_examples
dengan menelusuri kolom "query" dan "chain" dari data frame tersebut. Setiap contoh terdiri dari format "Question: [query]\nChain: [chain]\n\n".Gunakan metode
partial
untuk menerapkan variabelchain_examples
secara parsial pada template prompt.
7. Tentang LangGraph
Secara sederhana, LangGraph memungkinkan kita untuk membuat state machine.
Mesin ini akan menjalankan chain (rantai) pada setiap status.
Perbedaan utama antara LangGraph dan membuat serta menjalankan beberapa chain secara berurutan adalah bahwa LangGraph memungkinkan perulangan atau eksekusi berulang.
Ini berarti, berdasarkan kriteria transisi tertentu, state machine kita dapat beralih antar status secara tak terbatas hingga kondisi berhenti (stop condition) terpenuhi.
Ini dicapai dengan mengirimkan objek status (state object) antar node pada grafik.
Setiap node dapat melakukan tindakan yang diperlukan dan memperbarui objek status.
Untuk informasi lebih lanjut tentang LangGraph, Anda dapat melihatnya di dokumentasi.
Pertama, kita memastikan bahwa model dapat mengakses dua alat yang dapat dipanggil dengan melakukan binding alat pada model.
Kemudian, objek status AgentState didefinisikan.
Objek ini memiliki 5 field berikut:
messages: Beranotasi dengan operator tambahan sebagai BaseMessage, di mana setiap node akan menambahkannya.
actions: Mirip dengan messages tetapi dengan tipe string.
inter: DataFrame sementara, yang diperbarui pada setiap siklus berdasarkan ide CoT.
question: Pertanyaan yang perlu dijawab.
memory: Percakapan sebelumnya antara pengguna dan LLM.
Variabel model dibuat dengan melakukan binding antara prompt dan model ChatOpenAI, menggunakan model gpt-4-0125-preview, dan fungsi di-bind melalui argumen functions.
Kelas AgentState adalah kelas tipe hint yang mewakili status agent, dengan properti sebagai berikut:
messages: Tipe BaseMessage sebagai urutan, menyimpan pesan yang dikirim dan diterima oleh agent. Anotasi operator.add memungkinkan penggabungan urutan ini.
actions: Urutan bertipe string, menyimpan tindakan yang dilakukan oleh agent. Anotasi operator.add memungkinkan penggabungan urutan ini.
inter: Tipe pandas.DataFrame, menyimpan hasil sementara dari agent.
question: Tipe string, menyimpan pertanyaan yang diberikan kepada agent.
memory: Tipe string, menyimpan memori agent
8. Mendefinisikan Elemen Grafik
Pertama, buat fungsi should_continue
yang berfungsi sebagai kondisi cabang antar node. Berdasarkan status saat ini, beberapa hal dapat terjadi.
Jika model menentukan bahwa langkah tambahan diperlukan, lanjutkan eksekusi. Jika tidak, hentikan eksekusi.
Selanjutnya, buat node.
Dalam LangGraph, node adalah fungsi atau objek yang dapat dieksekusi. Di sini, kita akan menggunakan fungsi sebagai node.
Node call_model
berfungsi sebagai titik masuk dan digunakan untuk menentukan tindakan berikutnya.
Jika cabang kondisional memutuskan untuk berhenti, keluar dari node ini.
Jika harus melanjutkan, pindah ke node call_tool
untuk melakukan tindakan berdasarkan fungsi yang ditentukan oleh LLM.
Beberapa data frame dapat diperiksa (tindakan aman) atau perintah yang dihasilkan dapat dijalankan (jika perintah tidak ditulis dengan benar, bisa terjadi kesalahan; oleh karena itu, tambahkan penanganan pengecualian dan mekanisme perbaikan sendiri. Jika eksekusi kode gagal, beri tahu LLM dan minta untuk memperbaiki perintah yang salah).
Kode ini mendefinisikan fungsi yang digunakan dalam sistem interaktif.
Fungsi
should_continue
memutuskan apakah percakapan harus dilanjutkan berdasarkan status percakapan.Jika pesan terakhir tidak memiliki
function_call
, kembalikan "end" untuk mengakhiri percakapan.Jika tidak, kembalikan "continue" untuk melanjutkan ke node
call_tool
.
Fungsi
call_model
memanggil model untuk menghasilkan respons.Gunakan
model.invoke
untuk mendapatkan respons dari model berdasarkan status saat ini.Kembalikan respons dalam bentuk daftar dan tambahkan ke daftar pesan yang ada.
Fungsi
call_tool
berfungsi untuk menjalankan alat.Ekstrak informasi
function_call
dari pesan terakhir.Ubah
tool_input
menjadi bentuk kamus dan tambahkanstate['inter']
.Berdasarkan nama alat yang dipanggil, lakukan tindakan berbeda:
Jika alat
view_pandas_dataframes
:Buat
ToolInvocation
dan panggiltool_executor.invoke
untuk mendapatkan respons.Ubah respons menjadi
FunctionMessage
dan kembalikan.
Jika alat
evaluate_pandas_chain
:Buat
ToolInvocation
dan panggiltool_executor.invoke
untuk mendapatkan respons, tindakan yang dicoba, dan informasi interaksi.Jika respons menghasilkan pengecualian, buat informasi kesalahan dan kembalikan sebagai
FunctionMessage
.Jika respons berhasil, buat informasi sukses dan kembalikan sebagai
FunctionMessage
, bersama dengan tindakan yang dicoba dan informasi interaksi.
9. Menyiapkan elemen graf dan membuat struktur grafik yang sesuai
Sekarang, kita mendefinisikan mesin status (StateGraph) kita, menambahkan node, menentukan titik awal, dan menambahkan kondisi antara.
Sampai saat ini, kita belum menyebutkan bahwa setelah node call_tool
selesai, kita selalu kembali ke node call_model
.
Jika struktur grafik sudah didefinisikan dengan benar, maka pekerjaan yang tersisa hanya kompilasi, yang akan mengembalikan LangChain Runnable.
Kita menggunakan kelas
StateGraph
untuk mendefinisikan grafikworkflow
baru.Kita menambahkan dua node,
agent
danaction
, keworkflow
dan mengatur agar masing-masing node memanggil fungsicall_model
dancall_tool
.Kita menentukan titik awal
workflow
sebagai nodeagent
, sehingga nodeagent
akan dipanggil pertama kali saat grafik dijalankan.Kita menambahkan kondisi antara ke node
agent
:Kita menggunakan fungsi
should_continue
untuk menentukan node berikutnya yang akan dipanggil.Berdasarkan output fungsi, jika
continue
maka nodeaction
akan dipanggil, jikaend
maka grafik akan dihentikan.Kita menambahkan kondisi antara biasa ke node
action
yang mengarah ke nodeagent
, sehingga nodeagent
akan dipanggil setelah nodeaction
selesai.Akhirnya, kita mengkompilasi
workflow
dan membuat objekRunnable
yang dapat dijalankan oleh LangChain, yang kita sebutapp
.
10. Menentukan pertanyaan
Kode yang diberikan adalah contoh menangani pertanyaan yang melibatkan beberapa langkah dan berbagai tabel.
Variabel
user_query
menetapkan pertanyaan pengguna.Contoh pertanyaan pertama adalah "Tampilkan berapa kali Steven Rollins terpilih sebagai MVP, dan tunjukkan jumlah peringkat yang diterima oleh karyawan ini untuk setiap alasan MVP."
Contoh pertanyaan kedua (dalam komentar) adalah "Tim yang menerima suara terbanyak sebagai tim yang sulit diajak bekerja sama adalah tim mana?"
Kode ini tidak menyertakan logika pemrosesan pertanyaan yang sebenarnya, melainkan menunjukkan langkah-langkah persiapan untuk menangani berbagai jenis pertanyaan.
10. Memanggil model
Langkah untuk memanggil model.
Di langkah ini, model yang telah dilatih dipanggil menggunakan data input yang telah disiapkan dan hasil prediksi diperoleh.
Panggilan model biasanya dilakukan menggunakan metode predict atau evaluate dari objek model.
Penting untuk memastikan bentuk data input sesuai dengan format input yang diminta oleh model.
Hasil prediksi dapat dikembalikan dalam berbagai format tergantung pada bentuk output model.
Hasil prediksi yang dikembalikan kemudian diproses lebih lanjut atau digunakan untuk perhitungan metrik evaluasi.
Definisikan dictionary inputs untuk mengatur kueri pengguna, token mulai aksi, memori, dll.
Gunakan fungsi
app.stream()
untuk melakukan streaming input, dan atur batas rekursi menjadi 40.Iterasi melalui dictionary output yang telah di-stream dan proses sesuai dengan nama node masing-masing:
Node "agent": Tampilkan bahwa agen sedang bekerja.
Node "action":
Jika aksi adalah "view_pandas_dataframes", tampilkan "viewing dataframes".
Jika tidak, tampilkan aksi saat ini dan output, atau tampilkan pesan retry jika terjadi kesalahan.
Node lainnya: Tampilkan output akhir dan rantai aksi.
Ekstrak respons agen, tabel akhir, dan pesan akhir dari dictionary output.
Hapus token '' dari respons agen untuk menghasilkan pesan akhir.
Gunakan fungsi print()
untuk mencetak isi variabel final_message
.
Mencetak isi dari variabel final_table
.
Gunakan fungsi
print()
untuk mencetak nilai variabelfinal_table
ke konsol.
Last updated