


Mencipta Ejen ReAct dari awal dengan nodeJS ( carian wikipedia )
pengenalan
Kami akan mencipta ejen AI yang mampu mencari Wikipedia dan menjawab soalan berdasarkan maklumat yang ditemuinya. Ejen ReAct (Reason and Act) ini menggunakan API AI Generatif Google untuk memproses pertanyaan dan menjana respons. Ejen kami akan dapat:
- Cari Wikipedia untuk maklumat yang berkaitan.
- Ekstrak bahagian tertentu daripada halaman Wikipedia.
- Sebab tentang maklumat yang dikumpul dan rumuskan jawapan.
[2] Apakah itu Ejen ReAct?
Ejen ReAct ialah jenis ejen tertentu yang mengikuti kitaran Refleksi-Tindakan. Ia mencerminkan tugas semasa, berdasarkan maklumat yang tersedia dan tindakan yang boleh dilakukannya, dan kemudian memutuskan tindakan yang perlu diambil atau sama ada untuk menyelesaikan tugasan itu.
[3] Merancang Ejen
3.1 Alat yang Diperlukan
- Node.js
- Pustaka Axios untuk permintaan HTTP
- API AI Generatif Google (gemini-1.5-flash)
- API Wikipedia
3.2 Struktur Ejen
Ejen ReAct kami akan mempunyai tiga keadaan utama:
- FIKIR (Refleksi)
- TINDAKAN (Pelaksanaan)
- JAWAPAN (Respons)
[4] Pelaksana Ejen
Mari bina Ejen ReAct langkah demi langkah, menyerlahkan setiap keadaan.
4.1 Persediaan Awal
Mula-mula, sediakan projek dan pasang kebergantungan:
mkdir react-agent-project cd react-agent-project npm init -y npm install axios dotenv @google/generative-ai
Buat fail .env pada akar projek:
GOOGLE_AI_API_KEY=your_api_key_here
4.2 Mencipta Fail Tools.js
Buat Tools.js dengan kandungan berikut:
const axios = require("axios"); class Tools { static async wikipedia(q) { try { const response = await axios.get("https://en.wikipedia.org/w/api.php", { params: { action: "query", list: "search", srsearch: q, srwhat: "text", format: "json", srlimit: 4, }, }); const results = await Promise.all( response.data.query.search.map(async (searchResult) => { const sectionResponse = await axios.get( "https://en.wikipedia.org/w/api.php", { params: { action: "parse", pageid: searchResult.pageid, prop: "sections", format: "json", }, }, ); const sections = Object.values( sectionResponse.data.parse.sections, ).map((section) => `${section.index}, ${section.line}`); return { pageTitle: searchResult.title, snippet: searchResult.snippet, pageId: searchResult.pageid, sections: sections, }; }), ); return results .map( (result) => `Snippet: ${result.snippet}\nPageId: ${result.pageId}\nSections: ${JSON.stringify(result.sections)}`, ) .join("\n\n"); } catch (error) { console.error("Error fetching from Wikipedia:", error); return "Error fetching data from Wikipedia"; } } static async wikipedia_with_pageId(pageId, sectionId) { if (sectionId) { const response = await axios.get("https://en.wikipedia.org/w/api.php", { params: { action: "parse", format: "json", pageid: parseInt(pageId), prop: "wikitext", section: parseInt(sectionId), disabletoc: 1, }, }); return Object.values(response.data.parse?.wikitext ?? {})[0]?.substring( 0, 25000, ); } else { const response = await axios.get("https://en.wikipedia.org/w/api.php", { params: { action: "query", pageids: parseInt(pageId), prop: "extracts", exintro: true, explaintext: true, format: "json", }, }); return Object.values(response.data?.query.pages)[0]?.extract; } } } module.exports = Tools;
4.3 Mencipta Fail ReactAgent.js
Buat ReactAgent.js dengan kandungan berikut:
require("dotenv").config(); const { GoogleGenerativeAI } = require("@google/generative-ai"); const Tools = require("./Tools"); const genAI = new GoogleGenerativeAI(process.env.GOOGLE_AI_API_KEY); class ReActAgent { constructor(query, functions) { this.query = query; this.functions = new Set(functions); this.state = "THOUGHT"; this._history = []; this.model = genAI.getGenerativeModel({ model: "gemini-1.5-flash", temperature: 2, }); } get history() { return this._history; } pushHistory(value) { this._history.push(`\n ${value}`); } async run() { this.pushHistory(`**Task: ${this.query} **`); try { return await this.step(); } catch (e) { if (e.message.includes("exhausted")) { return "Sorry, I'm exhausted, I can't process your request anymore. ><"; } return "Unable to process your request, please try again? ><"; } } async step() { const colors = { reset: "\x1b[0m", yellow: "\x1b[33m", red: "\x1b[31m", cyan: "\x1b[36m", }; console.log("===================================="); console.log( `Next Movement: ${ this.state === "THOUGHT" ? colors.yellow : this.state === "ACTION" ? colors.red : this.state === "ANSWER" ? colors.cyan : colors.reset }${this.state}${colors.reset}`, ); console.log(`Last Movement: ${this.history[this.history.length - 1]}`); console.log("===================================="); switch (this.state) { case "THOUGHT": await this.thought(); break; case "ACTION": await this.action(); break; case "ANSWER": await this.answer(); break; } } async promptModel(prompt) { const result = await this.model.generateContent(prompt); const response = await result.response; return response.text(); } async thought() { const availableFunctions = JSON.stringify(Array.from(this.functions)); const historyContext = this.history.join("\n"); const prompt = `Your task to FullFill ${this.query}. Context contains all the reflection you made so far and the ActionResult you collected. AvailableActions are functions you can call whenever you need more data. Context: "${historyContext}" << AvailableActions: "${availableFunctions}" << Task: "${this.query}" << Reflect uppon Your Task using Context, ActionResult and AvailableActions to find your next_step. print your next_step with a Thought or FullFill Your Task `; const thought = await this.promptModel(prompt); this.pushHistory(`\n **${thought.trim()}**`); if ( thought.toLowerCase().includes("fullfill") || thought.toLowerCase().includes("fulfill") ) { this.state = "ANSWER"; return await this.step(); } this.state = "ACTION"; return await this.step(); } async action() { const action = await this.decideAction(); this.pushHistory(`** Action: ${action} **`); const result = await this.executeFunctionCall(action); this.pushHistory(`** ActionResult: ${result} **`); this.state = "THOUGHT"; return await this.step(); } async decideAction() { const availableFunctions = JSON.stringify(Array.from(this.functions)); const historyContext = this.history; const prompt = `Reflect uppon the Thought, Query and AvailableActions ${historyContext[historyContext.length - 2]} Thought <<< ${historyContext[historyContext.length - 1]} Query: "${this.query}" AvailableActions: ${availableFunctions} output only the function,parametervalues separated by a comma. For example: "wikipedia,ronaldinho gaucho, 1450"`; const decision = await this.promptModel(prompt); return `${decision.replace(/`/g, "").trim()}`; } async executeFunctionCall(functionCall) { const [functionName, ...args] = functionCall.split(","); const func = Tools[functionName.trim()]; if (func) { return await func.call(null, ...args); } throw new Error(`Function ${functionName} not found`); } async answer() { const historyContext = this.history; const prompt = `Based on the following context, provide a complete, detailed and descriptive formated answer for the Following Task: ${this.query} . Context: ${historyContext} Task: "${this.query}"`; const finalAnswer = await this.promptModel(prompt); this.history.push(`Answer: ${this.finalAnswer}`); console.log("WE WILL ANSWER >>>>>>>", finalAnswer); return finalAnswer; } } module.exports = ReActAgent;
4.4 Menjalankan ejen (index.js)
Buat index.js dengan kandungan berikut:
const ReActAgent = require("./ReactAgent.js"); async function main() { const query = "What does England border with?"; const functions = [ [ "wikipedia", "params: query", "Semantic Search Wikipedia API for snippets, pageIds and sectionIds >> \n ex: Date brazil has been colonized? \n Brazil was colonized at 1500, pageId, sections : []", ], [ "wikipedia_with_pageId", "params : pageId, sectionId", "Search Wikipedia API for data using a pageId and a sectionIndex as params. \n ex: 1500, 1234 \n Section information about blablalbal", ], ]; const agent = new ReActAgent(query, functions); try { const result = await agent.run(); console.log("THE AGENT RETURN THE FOLLOWING >>>", result); } catch (e) { console.log("FAILED TO RUN T.T", e); } } main().catch(console.error);
[5] Bagaimana Bahagian Wikipedia Berfungsi
Interaksi dengan Wikipedia dilakukan dalam dua langkah utama:
-
Carian awal (fungsi wikipedia):
- Membuat permintaan kepada API carian Wikipedia.
- Mengembalikan sehingga 4 hasil carian yang berkaitan untuk pertanyaan.
- Untuk setiap hasil, ia mengambil bahagian halaman.
-
Carian terperinci (wikipedia_with_pageId function):
- Menggunakan ID halaman dan ID bahagian untuk mengambil kandungan tertentu.
- Mengembalikan teks bahagian yang diminta.
Proses ini membolehkan ejen mendapat gambaran keseluruhan topik yang berkaitan dengan pertanyaan dahulu dan kemudian menyelam lebih dalam ke bahagian tertentu seperti yang diperlukan.
[6] Contoh Aliran Pelaksanaan
- Pengguna bertanya soalan.
- Ejen memasuki keadaan FIKIR dan memikirkan soalan.
- Ia memutuskan untuk mencari Wikipedia dan memasuki keadaan ACTION.
- Melaksanakan fungsi wikipedia dan memperoleh hasil.
- Kembali ke keadaan FIKIR untuk merenung keputusan.
- Boleh memutuskan untuk mencari butiran lanjut atau pendekatan yang berbeza.
- Mengulangi kitaran PEMIKIRAN dan TINDAKAN seperti yang diperlukan.
- Apabila ia mempunyai maklumat yang mencukupi, ia memasuki keadaan JAWAPAN.
- Menjana jawapan akhir berdasarkan semua maklumat yang dikumpul.
- Masuk gelung tak terhingga apabila wikipedia tidak mempunyai data untuk dikumpulkan. Betulkan dengan pemasa =P
[7] Pertimbangan Akhir
- Struktur modular membolehkan penambahan alat atau API baharu dengan mudah.
- Adalah penting untuk melaksanakan pengendalian ralat dan had masa/lelaran untuk mengelakkan gelung tidak terhingga atau penggunaan sumber yang berlebihan.
- Gunakan Suhu : 99999 lol
Atas ialah kandungan terperinci Mencipta Ejen ReAct dari awal dengan nodeJS ( carian wikipedia ). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Penggunaan utama JavaScript dalam pembangunan web termasuk interaksi klien, pengesahan bentuk dan komunikasi tak segerak. 1) kemas kini kandungan dinamik dan interaksi pengguna melalui operasi DOM; 2) pengesahan pelanggan dijalankan sebelum pengguna mengemukakan data untuk meningkatkan pengalaman pengguna; 3) Komunikasi yang tidak bersesuaian dengan pelayan dicapai melalui teknologi Ajax.

Aplikasi JavaScript di dunia nyata termasuk pembangunan depan dan back-end. 1) Memaparkan aplikasi front-end dengan membina aplikasi senarai TODO, yang melibatkan operasi DOM dan pemprosesan acara. 2) Membina Restfulapi melalui Node.js dan menyatakan untuk menunjukkan aplikasi back-end.

Memahami bagaimana enjin JavaScript berfungsi secara dalaman adalah penting kepada pemaju kerana ia membantu menulis kod yang lebih cekap dan memahami kesesakan prestasi dan strategi pengoptimuman. 1) aliran kerja enjin termasuk tiga peringkat: parsing, penyusun dan pelaksanaan; 2) Semasa proses pelaksanaan, enjin akan melakukan pengoptimuman dinamik, seperti cache dalam talian dan kelas tersembunyi; 3) Amalan terbaik termasuk mengelakkan pembolehubah global, mengoptimumkan gelung, menggunakan const dan membiarkan, dan mengelakkan penggunaan penutupan yang berlebihan.

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Kedua -dua pilihan Python dan JavaScript dalam persekitaran pembangunan adalah penting. 1) Persekitaran pembangunan Python termasuk Pycharm, Jupyternotebook dan Anaconda, yang sesuai untuk sains data dan prototaip cepat. 2) Persekitaran pembangunan JavaScript termasuk node.js, vscode dan webpack, yang sesuai untuk pembangunan front-end dan back-end. Memilih alat yang betul mengikut keperluan projek dapat meningkatkan kecekapan pembangunan dan kadar kejayaan projek.

C dan C memainkan peranan penting dalam enjin JavaScript, terutamanya digunakan untuk melaksanakan jurubahasa dan penyusun JIT. 1) C digunakan untuk menghuraikan kod sumber JavaScript dan menghasilkan pokok sintaks abstrak. 2) C bertanggungjawab untuk menjana dan melaksanakan bytecode. 3) C melaksanakan pengkompil JIT, mengoptimumkan dan menyusun kod hot-spot semasa runtime, dan dengan ketara meningkatkan kecekapan pelaksanaan JavaScript.

JavaScript digunakan secara meluas di laman web, aplikasi mudah alih, aplikasi desktop dan pengaturcaraan sisi pelayan. 1) Dalam pembangunan laman web, JavaScript mengendalikan DOM bersama -sama dengan HTML dan CSS untuk mencapai kesan dinamik dan menyokong rangka kerja seperti JQuery dan React. 2) Melalui reaktnatif dan ionik, JavaScript digunakan untuk membangunkan aplikasi mudah alih rentas platform. 3) Rangka kerja elektron membolehkan JavaScript membina aplikasi desktop. 4) Node.js membolehkan JavaScript berjalan di sisi pelayan dan menyokong permintaan serentak yang tinggi.
