গত সপ্তাহে, আমি TheJam.dev এ একটি উপস্থাপনার সম্মান পেয়েছিলাম। এটি ছিল জেনারেটিভ এআই-তে আমার প্রথম উপস্থাপনা, এবং আমি যা ভেবেছিলাম তা একটি আকর্ষণীয় ব্যবহারের ক্ষেত্রে - লেখার প্রক্রিয়ায় সাহায্য করার জন্য শেয়ার করতে পেরেছি।
এখন, পরিষ্কার হতে, আমি ব্লগ পোস্ট লিখতে GenAI ব্যবহার করার অর্থ নয়, এটি একটি ভয়ঙ্কর ধারণা হবে। (IMO!) পরিবর্তে, আমি দেখেছি কিভাবে এটি কিছু প্রক্রিয়ার সাথে সাহায্য করতে পারে। আমাকে একটু ব্যাক আপ এবং কিছু পটভূমি দিতে দিন.
আমি অনেক বছর ধরে জন বার্মিংহামের ভক্ত। তিনি একজন লেখক যিনি সামরিক/সায়েন্স-ফাই/ইত্যাদি ধারায় লেখেন এবং তার কিছু চমকপ্রদ ধারণা রয়েছে। আমি প্রাথমিকভাবে তাকে তার "অ্যাক্সিস অফ টাইম" ট্রিলজির মাধ্যমে আবিষ্কার করেছিলাম যা 1942 সালে একটি আধুনিক আন্তর্জাতিক নৌ বহরে ফেরত পাঠানোর ধারণা নিয়ে কাজ করেছিল।
এখন, এটি নিজেই শান্ত, যাইহোক, আমি পছন্দ করতাম যে তিনি কেবল সামরিক দিকটির দিকে মনোনিবেশ করেননি বরং "আপটাইমার" (ভবিষ্যতের লোকেরা) এবং সমসাময়িকদের মধ্যে সংস্কৃতির সংঘর্ষ সম্পর্কে কথা বলতে অনেক সময় ব্যয় করেছেন।
আমি মনে করি আপনি বলতে পারেন এটি কিছুটা টম ক্ল্যান্সির মতো ছিল তবে কেবলমাত্র অ্যাকশনে ফোকাস করা হয়নি। আমি তার যেকোনো বই সুপারিশ করব, এবং আপনি যদি তাকে ইতিমধ্যেই পড়ে থাকেন তবে আমাকে নীচের একটি মন্তব্যে জানান।
তার কাজের একজন অনুসারী হিসাবে, আমি তার প্যাট্রিয়নে সাবস্ক্রাইব করেছি এবং এটি সত্যিই আকর্ষণীয়। তিনি আসন্ন কাজ থেকে অধ্যায়গুলির খসড়া ভাগ করে নেন, তবে আরও গুরুত্বপূর্ণ, তিনি তার প্রক্রিয়া সম্পর্কেও বেশ খানিকটা কথা বলেন। একজন লেখক হিসাবে আমি এটি সত্যিই আকর্ষণীয় বলে মনে করি।
সম্প্রতি, তিনি GenAI-এর নিজের ব্যবহার সম্পর্কে কথা বলছিলেন এবং আলোচনা করেছিলেন যে কীভাবে তিনি এটিকে আরও 'ফ্রেমওয়ার্ক' দৃষ্টিকোণ থেকে ব্যবহার করছেন। অর্থাৎ, সঠিক সময়ে একটি চরিত্রের উদ্দেশ্য কীভাবে আনতে হয় এবং কীভাবে প্লট পয়েন্ট সেট আপ করতে হয়। এটি এখনও 'সৃজনশীল' কাজ, তবে আরও ... আমি জানি না। কাজের ব্যবস্থাপনা?
যদিও আমি বলেছিলাম, আমি ভেবেছিলাম এটি সত্যিই আকর্ষণীয় ছিল এবং এটি আমাকে ভাবতে বাধ্য করেছিল। লেখার প্রক্রিয়ায় সাহায্য করার উপায় হিসেবে আমি কীভাবে আমার ব্লগে GenAI ব্যবহার করতে পারি? এখানে আমি কি সঙ্গে এসেছি.
একটি দ্রুত সরাইয়া হিসাবে, আমি নীচে আলোচনা করা সমস্ত কিছু Google এর Gemini API এবং Eleventy ব্যবহার করে, তবে অবশ্যই অন্য কোথাও উপযোগী হবে।
আমি যে প্রথম ডেমো তৈরি করেছি তা আমাকে ব্লগ পোস্টের শিরোনাম নিয়ে আসতে সাহায্য করে। এখন, আমি সাধারণত এটির সাথে লড়াই করি না, তবে আমি কৌতূহলী ছিলাম যদি GenAI সম্ভবত আরও ভাল শিরোনামের জন্য বিকল্পগুলির পরামর্শ দিতে পারে।
আমি একটি প্রম্পট পরীক্ষা করে শুরু করেছি:
জেমি
একটি ব্লগ পোস্টের জন্য নিম্নলিখিত শিরোনাম দেওয়া, তিনটি পরামর্শ শেয়ার করুন যা শিরোনাম উন্নত করতে পারে এবং পোস্টে ট্রাফিক চালাতে পারে: "কিছু শিরোনাম"। JSON ফর্মে আপনার উত্তর উপস্থাপন করুন। JSON ফলাফলের শীর্ষ স্তরের কী "পরামর্শ" হওয়া উচিত এবং প্রতিটি পরামর্শে প্রস্তাবিত শিরোনামের জন্য কী "শিরোনাম" এবং যুক্তির জন্য "যুক্তি" ব্যবহার করা উচিত।
আপনি লক্ষ্য করবেন যে আমি বিশেষভাবে তিনটি পরামর্শ চাই এবং বলি যে আমি আরও ট্রাফিক চালাতে সাহায্য করতে চাই৷ এখন, আমি সৎ হতে হবে. এটি কিছুটা স্থূল এবং স্প্যামি মনে হয়। আমি অগত্যা ক্লিকবেট শিরোনাম চাই না। বলা হচ্ছে, আমি আমার শিরোনামের জন্য অন্য কিছু ধারণা দেখতে চেয়েছিলাম।
সেই প্রম্পটটি এআই স্টুডিওতে কয়েকটি পরীক্ষার সাথে ভাল কাজ করছে বলে মনে হচ্ছে, তাই আমি কোডে ঝাঁপিয়ে পড়লাম। আমি Google রপ্তানি করা কোডটি নিয়েছি এবং তারপরে কিছু কোড লিখেছি:
এখানে পুরো স্ক্রিপ্ট আছে:
#!/usr/bin/env node /* Given an input MD file, grab the title, and ask Google's AI APIs to offer suggestions. */ const fs = require('fs'); const fm = require('front-matter'); require('dotenv').config({path:__dirname + '/.env'}); const { GoogleGenerativeAI, HarmCategory, HarmBlockThreshold, } = require("@google/generative-ai"); const MODEL_NAME = "gemini-pro"; const API_KEY = process.env.GOOGLE_AI_KEY; async function runGenerate(title) { const genAI = new GoogleGenerativeAI(API_KEY); const model = genAI.getGenerativeModel({ model: MODEL_NAME }); const generationConfig = { temperature: 0.9, topK: 1, topP: 1, maxOutputTokens: 2048, }; const safetySettings = [ { category: HarmCategory.HARM_CATEGORY_HARASSMENT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, ]; const parts = [ {text: `Given the following title for a blog post, share three suggestions that may improve the title and drive traffic to the post: \"${title}\". Present your answer in JSON form. The top level key of the JSON result should be "suggestions" and each suggestion should use the key "title" for the suggested title and "reasoning" for the reasoning. The returned JSON should look like the following sample: [ { title: "First suggested title", reasoning: "This is the reason for the suggestion." } ] `}, ]; const result = await model.generateContent({ contents: [{ role: "user", parts }], generationConfig, safetySettings, }); const response = result.response; // remove backticks and parse. I'm seeing ```json sometimes too // console.log('DEBUG', response.text()); return JSON.parse(response.text().replace(/```/mg, '').replace(/```json/mg,'')); } (async () => { if(process.argv.length === 2) { console.log('Usage: titlesuggestions.js <<path to md>>'); process.exit(1); } const mdPath = process.argv[2]; if(!fs.existsSync(mdPath)) { console.log(`Unable to find ${mdPath}.`); process.exit(1); } const contents = fs.readFileSync(mdPath,'utf-8'); let title = fm(contents).attributes.title; console.log(`\nGenerating suggestions for: ${title}`); console.log('------------------------------------------------------------------------'); let suggestions = (await runGenerate(title)).suggestions; //console.log(suggestions); suggestions.forEach(s => { console.log(`Suggested Title: ${s['title']}\n\nReasoning: ${s['reasoning']}\n`); console.log('------------------------------------------------------------------------'); }); })();
এবং এটি কিভাবে কাজ করে? এই ব্লগ পোস্টের শিরোনাম: "আপনার সামগ্রী সহকারী হিসাবে জেনারেটিভ এআই ব্যবহার করা"
মিথুন কী পরামর্শ দিয়েছেন তা এখানে:
Suggested Title: The Power of Generative AI: Your New Content Assistant Reasoning: This title emphasizes the strength and potential of generative AI as a content creation tool, capturing the reader's attention and making them curious about the possibilities it offers. ------------------------------------------------------------------------ Suggested Title: Unlock Your Content Creation Potential with Generative AI Reasoning: This title suggests that generative AI can unlock new levels of productivity and creativity in content creation, attracting readers who are looking for ways to enhance their content strategy. ------------------------------------------------------------------------ Suggested Title: Revolutionize Your Content Creation: Meet Your Generative AI Assistant Reasoning: This title highlights the transformative potential of generative AI in content creation, appealing to readers who are eager to adopt cutting-edge technologies to streamline their workflow.
হ্যাঁ... আমি মনে করি এটা খুব সুন্দর। যাইহোক, এইগুলির কোনটিই এখানে "আমার" ভয়েসের মতো মনে হয় না। আমি একেবারে পরামর্শের মধ্যে কিছু যোগ্যতা দেখতে পাই, এবং এটি আমাকে চিন্তা করার জন্য কিছু দেয়, কিন্তু স্পষ্টতই, আমি মূল শিরোনামটি যেমনটি রেখেছি।
আমার পরবর্তী ডেমোর জন্য, আমি আমার লেখার প্রক্রিয়ার একটি অংশ দেখেছি যা আমি সত্যিই উপভোগ করি না, আমার সামনের বিষয়টিতে ব্যবহৃত এক-বাক্য description
মান লেখা। এই স্ট্রিংটি আমার <meta name="description">
ট্যাগে গিয়ে শেষ হয় এবং অন্য কোথাও ব্যবহার করা হয় না।
আমি ভেবেছিলাম এটি GenAI এর সারসংক্ষেপ বৈশিষ্ট্যের একটি চমৎকার ব্যবহার হবে। আমি এরকম একটি প্রম্পট দিয়ে শুরু করেছি:
নিম্নলিখিত ব্লগ পোস্ট দেওয়া, বর্ণনা হিসাবে ব্যবহার করার জন্য একটি বাক্য সারাংশ লিখুন
এবং তারপর আমি কি বিষয়বস্তু পাঠাতে হবে চিন্তা. আমার ব্লগ পোস্টগুলিতে সাধারণত অনেকগুলি কোড নমুনা থাকে এবং আমি ভেবেছিলাম যে এটি গোলমাল হয়ে যাবে। তাই আমার যুক্তি হয়ে গেল:
এর বেশিরভাগই প্রথম উদাহরণের একটি পরিবর্তিত সংস্করণ, তবে আসুন পরিষ্কারের দিকটি একবার দেখে নেওয়া যাক:
function cleanup(str) { str = str.replace(/```(.*?)```/sg, ''); str = str.replace(/---(.*?)---/sg, ''); str = str.replace(/\n{3,}/g, '\n'); return str.trim(); }
এটি ব্লগ পোস্টের সম্পূর্ণ বিষয়বস্তু পাস করা হয়েছে, তাই আমি সামনের বিষয় এবং কোড নমুনাগুলি সরিয়ে দিয়েছি। আমি তখন একাধিক ফাঁকা লাইনও প্রতিস্থাপন করেছি। এখানে পুরো স্ক্রিপ্ট আছে:
#!/usr/bin/env node /* Given an input MD file, grab the text, scrub code, and ask for a summary. */ const fs = require('fs'); const fm = require('front-matter'); require('dotenv').config({path:__dirname + '/.env'}); const { GoogleGenerativeAI, HarmCategory, HarmBlockThreshold, } = require("@google/generative-ai"); const MODEL_NAME = "gemini-pro"; const API_KEY = process.env.GOOGLE_AI_KEY; async function runGenerate(text) { const genAI = new GoogleGenerativeAI(API_KEY); const model = genAI.getGenerativeModel({ model: MODEL_NAME }); const generationConfig = { temperature: 0.9, topK: 1, topP: 1, maxOutputTokens: 2048, }; const safetySettings = [ { category: HarmCategory.HARM_CATEGORY_HARASSMENT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, ]; const parts = [ {text: `Given the following blog post, write a one sentence summary to use as the description:\n${text} `}, ]; const result = await model.generateContent({ contents: [{ role: "user", parts }], generationConfig, safetySettings, }); return result.response.candidates[0].content.parts[0].text; } /* I'm responsible for 'cleaning' up the text before sending to Google. For now, I'll just remove code blocks, but in the future I may remove images too. Also remove double blank lines. Oh, also remove FM. */ function cleanup(str) { str = str.replace(/```(.*?)```/sg, ''); str = str.replace(/---(.*?)---/sg, ''); str = str.replace(/\n{3,}/g, '\n'); return str.trim(); } (async () => { if(process.argv.length === 2) { console.log('Usage: summarysuggestions.j <<path to md>>'); process.exit(1); } const mdPath = process.argv[2]; if(!fs.existsSync(mdPath)) { console.log(`Unable to find ${mdPath}.`); process.exit(1); } let contents = fs.readFileSync(mdPath,'utf-8'); let title = fm(contents).attributes.title; // Make it nicer! contents = cleanup(contents); console.log(`\nGenerating summary suggestion for: ${title}`); console.log('------------------------------------------------------------------------'); let suggestion = (await runGenerate(title)); console.log(suggestion); })();
এবং কয়েকদিন আগের একটি পোস্টের জন্য এটি যা দেখায় তা এখানে, "ইমেজ ফাইলের নামগুলি উন্নত করতে জেনারেটিভ এআই ব্যবহার করা" :
This post explores how Generative AI can be used to enhance image filenames, making them more descriptive, accurate, and consistent.
আমি বলতে পেরেছি, এটা সুন্দর স্পট! এবং আমি এর জন্য 'ভয়েস' নিয়ে এতটা চিন্তিত নই। আমি এগিয়ে গিয়েছিলাম এবং এই পোস্টের জন্য এটি ব্যবহার করেছি (আমার কাজ শেষ হওয়ার পরে), এবং পেয়েছি (এবং ব্যবহার করা হয়েছে) - এটি:
আপনার ভার্চুয়াল রাইটিং সহকারী হিসাবে জেনারেটিভ এআই ব্যবহার করে আপনার সামগ্রী তৈরির প্রক্রিয়াটিকে উন্নত করুন।
যদি এটি আপনার আগ্রহের হয় তবে আপনি একটি লেগো ডেথ স্টার দেখার সময় আমাকে র্যাম্বল করতে দেখতে পছন্দ করেন, আপনি নীচের উপস্থাপনাটি দেখতে পারেন:
উপরে দেখানো আমার দুটি স্ক্রিপ্টই আমার রেপোতে রয়েছে এবং এখানে স্ক্রিপ্ট ডিরেক্টরিতে পাওয়া যেতে পারে: https://github.com/cfjedimaster/raymondcamden2023/tree/main/scripts
নীচের একটি মন্তব্যে আপনি কি মনে করেন তা আমাকে জানান!