01. Menjelajahi Cara Menggunakan Agen
Agen
Untuk memahami kerangka kerja agen dengan baik, mari kita buat agen dengan satu alat untuk mencari informasi secara online dan alat lain untuk menemukan data spesifik yang telah kita muat ke dalam indeks.
Pengaturan LangSmith untuk pelacakan (tracing) langkah demi langkah
Aplikasi yang dibangun dengan LangChain sering menggunakan beberapa panggilan LLM di berbagai langkah.
Ketika logika menjadi lebih kompleks dengan panggilan bertahap, sangat penting memiliki kemampuan untuk menyelidiki apa yang sebenarnya terjadi di dalam chain atau agen. Alat terbaik untuk ini adalah LangSmith.
Meskipun LangSmith tidak wajib, itu adalah alat yang sangat berguna. Jika Anda ingin menggunakan LangSmith, daftarlah melalui tautan di atas dan kemudian atur variabel lingkungan untuk mulai mencatat dan melacak.
Alat
Anda dapat mendefinisikan alat yang akan digunakan oleh Agent sehingga alat tersebut dapat digunakan saat Agent melakukan penalaran.
Tavily Search adalah salah satu alat pencarian yang representatif. Ini memungkinkan akses ke informasi terbaru melalui pencarian dan menghasilkan jawaban berdasarkan hasil pencarian. Alat tidak terbatas pada alat pencarian; ada juga berbagai jenis dan metodologi lain, seperti alat untuk mengeksekusi kode Python atau menjalankan fungsi yang didefinisikan langsung
Alat Pencarian: Tavily Search
LangChain memiliki alat bawaan yang memungkinkan penggunaan mesin pencari Tavily sebagai alat dengan mudah.
Untuk menggunakan Tavily Search, Anda perlu mendapatkan API key.
Setelah Anda mendapatkan API key, daftarkan sebagai variabel lingkungan.
Hapus komentar dari kode di bawah ini dan atur API key yang diterbitkan.
Fungsi search.invoke menjalankan pencarian untuk string yang diberikan.
Untuk melakukan pencarian, masukkan kata kunci pencarian yang diinginkan ke dalam fungsi invoke().
Alat Pencarian Dokumen Berbasis PDF: Retriever
Kita juga membuat retriever untuk melakukan pencarian pada data kita.
Kode ini membangun sistem pencarian dokumen menggunakan pemuat dokumen berbasis web, pemecah dokumen, penyimpanan vektor, dan embedding OpenAI.
Dalam kasus ini, kita membuat retriever yang menyimpan dan melakukan pencarian dokumen PDF di FAISS DB.
Fungsi ini menggunakan metode get_relevant_documents dari objek retriever untuk mengembalikan dokumen pertama yang terkait dengan kueri "Beri tahu saya tentang kewajiban pelabelan konten yang dihasilkan AI oleh YouTube mulai tahun 2024."
Ini digunakan untuk menemukan dokumen yang paling relevan untuk kueri tertentu.
Sekarang, setelah kita mengisi indeks yang akan digunakan untuk pencarian, kita dapat dengan mudah mengubahnya menjadi alat yang dapat digunakan agen dengan benar.
Fungsi create_retriever_tool diimpor dari modul tools.retriever dari pustaka langchain. Fungsi ini digunakan untuk membuat alat untuk mencari data tertentu. Langchain adalah pustaka yang menyediakan berbagai fitur terkait model bahasa, salah satunya adalah fitur pembuatan alat pencarian yang memudahkan tugas pencarian dan pemrosesan data.
Fungsi ini memanggil create_retriever_tool untuk menghasilkan retriever_tool. Alat ini digunakan untuk mencari informasi tentang LangSmith.
Ketika pengguna memiliki pertanyaan tentang LangSmith, alat ini dapat digunakan untuk menyelesaikan pertanyaan tersebut. Fungsi ini menerima instance retriever, nama alat pencarian (langsmith_search), dan pesan yang memberikan panduan kepada pengguna tentang cara menggunakan alat tersebut
Menentukan daftar alat yang akan digunakan oleh Agen
Sekarang, setelah kita membuat keduanya, kita dapat membuat daftar alat yang akan digunakan oleh Agen.
Daftar tools mencakup search dan retriever_tool. Daftar ini digunakan untuk menyimpan alat pencarian dan pengambilan informasi. Setiap elemen menyediakan fungsionalitas yang diperlukan untuk melakukan tugas-tugas tertentu.
Pembuatan Agen
Sekarang setelah kita mendefinisikan alat, kita dapat membuat agen. Kita akan menggunakan agen OpenAI Functions.
Pertama, kita mendefinisikan LLM (Language Learning Model) yang akan digunakan oleh agen.
Kelas ChatOpenAI, yang diimpor dari modul langchain_openai, memungkinkan implementasi AI percakapan menggunakan model bahasa OpenAI.
Dalam contoh ini, kita menggunakan model gpt-4-turbo-preview, dan parameter temperature disetel ke 0 untuk meminimalkan variabilitas dalam prediksi.
Selanjutnya, kita memilih prompt yang ingin kita gunakan untuk membimbing agen.
Jika Anda ingin melihat isi dari prompt ini dan memiliki akses ke LangSmith, buka tautan berikut:
Prompt yang dapat diunduh untuk digunakan: https://smith.langchain.com/hub/hwchase17/openai-functions-agent
Setelah menarik sumber daya menggunakan fungsi hub.pull(), Anda dapat mengakses pesan dari sumber daya tersebut melalui prompt.messages.
Sekarang, kita dapat menginisialisasi agen dengan LLM, prompt, dan alat. Peran agen adalah menerima input dan memutuskan Aksi mana yang akan diambil.
Penting untuk dicatat bahwa agen tidak menjalankan aksi itu sendiri — ini dilakukan oleh AgentExecutor (pada langkah berikutnya).
Terakhir, kita menggabungkan agen dengan alat-alat di dalam AgentExecutor (ini akan memanggil agen secara berulang dan menjalankan alat-alat tersebut).
Kode ini mengimpor kelas AgentExecutor dari modul langchain.agents dan membuat instance. Saat inisialisasi, agent dan tools diberikan sebagai argumen, dan verbose=True disetel untuk mengaktifkan keluaran log yang lebih rinci. AgentExecutor bertugas menjalankan tugas dengan menggunakan agen dan alat-alat yang diberikan.
Menjalankan Agen
Sekarang kita bisa menjalankan agen dengan beberapa pertanyaan!
Saat ini, semua pertanyaan ini bersifat stateless (tidak mengingat interaksi sebelumnya).
Metode invoke dari objek agent_executor memproses argumen yang diberikan dalam bentuk kamus. Dalam contoh ini, kamus dengan kunci input dan nilai hi! diberikan sebagai argumen. Ini biasanya digunakan untuk memproses input dalam objek seperti agen AI, eksekutor fungsi, atau pemroses perintah
Gunakan metode invoke dari objek agent_executor untuk memberikan pertanyaan sebagai input.
Anda dapat memeriksa hasil eksekusi langkah demi langkah secara detail di tautan pelacakan berikut.
Menambahkan Memori
Seperti yang disebutkan sebelumnya, agen ini tidak memiliki status, artinya agen tidak mengingat interaksi sebelumnya. Untuk memberikan memori kepada agen ini, kita perlu meneruskan chat_history sebelumnya.
[Catatan]
Karena prompt yang kita gunakan, harus disebut chat_history. Jika Anda menggunakan prompt yang berbeda, Anda dapat mengubah nama variabelnya.
Fungsi menerima input pengguna dan chat_history sebagai parameter. Di sini, chat_history dikirim sebagai daftar kosong ([]) saat menangani pesan pertama dari obrolan. Ini menunjukkan bahwa tidak ada riwayat percakapan sebelumnya saat memulai sesi obrolan baru.
Modul ini mengimpor kelas AIMessage dan HumanMessage dari langchain_core.messages. Kelas ini dapat digunakan untuk menangani pertukaran pesan antara AI dan manusia.
AIMessage mewakili pesan yang dihasilkan oleh AI, sedangkan HumanMessage mewakili pesan yang dimasukkan oleh pengguna
Fungsi ini menjalankan agen percakapan yang menangani riwayat percakapan antara pengguna dan AI, serta input baru dari pengguna. Metode agent_executor.invoke menerima chat_history dan input baru pengguna input sebagai parameter. chat_history adalah daftar objek HumanMessage dan AIMessage, yang mewakili pesan dari pengguna dan AI, masing-masing. Dalam contoh ini, pengguna menyapa dengan "hi! Saya Andi", AI merespons dengan "Hello Andi! Bagaimana saya bisa membantu hari ini?", lalu pengguna mengajukan pertanyaan baru: "Siapa nama saya?".
Jika Anda ingin melacak pesan-pesan ini secara otomatis, Anda bisa membungkusnya dengan RunnableWithMessageHistory.
Buat instance dari kelas ChatMessageHistory dan tetapkan ke variabel message_history. Instance ini digunakan untuk mengelola catatan pesan obrolan.
Kelas RunnableWithMessageHistory mengelola eksekutor agen (agent_executor) dan riwayat pesan. Kelas ini menerima fungsi lambda yang menangani riwayat pesan berdasarkan session ID, serta kunci untuk pesan input dan riwayat obrolan.
Di sini, session ID sebenarnya tidak digunakan, dan ini hanya contoh menggunakan ChatMessageHistory dalam memori.
Secara default, eksekusi menerima satu parameter konfigurasi, sebuah string yang disebut session_id. Parameter ini digunakan untuk membuat riwayat pesan obrolan baru atau mengambil riwayat pesan obrolan yang ada yang cocok dengan session_id yang diberikan.
Pemanggilan akan terlihat seperti ini:
with_history.invoke(..., config={"configurable": {"session_id": "bar"}});
Contoh: {"configurable": {"session_id": "<session_id>"}}.
Fungsi agent_with_chat_history.invoke memproses input pengguna dan konfigurasi sebagai parameter. Dalam contoh ini, input pengguna ("hi! Saya Bob") dan konfigurasi (config) diberikan. Meskipun konfigurasi menyertakan session_id, ini sebenarnya tidak digunakan dalam contoh ini karena menggunakan ChatMessageHistory dalam memori sederhana. Kode ini menunjukkan bahwa meskipun session ID diperlukan di sebagian besar skenario nyata, implementasi tertentu mungkin tidak memerlukannya.
Panggilan fungsi ini menggunakan objek agent_with_chat_history untuk menghasilkan respons terhadap pertanyaan yang dimasukkan. Input diberikan melalui kunci input, dan dalam kasus ini, "Siapa nama saya?" digunakan. Selain itu, parameter config memungkinkan penambahan konfigurasi, dan dalam contoh ini, session_id diatur ke <foo>. Ini menunjukkan bahwa meskipun session ID diperlukan di sebagian besar skenario nyata, ID tersebut tidak benar-benar digunakan di sini karena menggunakan ChatMessageHistory dalam memori sederhana.
Agen Template
Penutup!
Dalam tutorial ini, kita membahas cara membuat agen sederhana.
Last updated