paint-brush
কোড জেনারেশনের সাথে চ্যাটবট উন্নত করা: প্রকাশনার জন্য একটি প্রসঙ্গ-সচেতন চ্যাটবট তৈরি করাদ্বারা@shanglun
1,603 পড়া
1,603 পড়া

কোড জেনারেশনের সাথে চ্যাটবট উন্নত করা: প্রকাশনার জন্য একটি প্রসঙ্গ-সচেতন চ্যাটবট তৈরি করা

দ্বারা Shanglun Wang19m2023/11/05
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

জিপিটি-ভিত্তিক সিস্টেমগুলি জ্ঞান ব্যবস্থাপনায় দুর্দান্ত প্রভাবের জন্য ব্যবহার করা হয়েছে, তবে শিল্প বাস্তবায়নের বর্তমান অবস্থা মেটাডেটার উপর ভিত্তি করে অনুসন্ধান করার ক্ষমতাতে সীমাবদ্ধ। আজ, আমরা এমন একটি সিস্টেম তৈরি করি যা শব্দার্থগত এবং মেটাডেটা অনুসন্ধান উভয়ই সম্পাদন করতে সক্ষম, পুনরুদ্ধার-বর্ধিত প্রজন্মের সিস্টেমের ক্ষমতাকে ব্যাপকভাবে উন্নত করে।
featured image - কোড জেনারেশনের সাথে চ্যাটবট উন্নত করা: প্রকাশনার জন্য একটি প্রসঙ্গ-সচেতন চ্যাটবট তৈরি করা
Shanglun Wang HackerNoon profile picture

ভূমিকা

2023 সালের গোড়ার দিকে ChatGPT জনসাধারণের কল্পনা দখল করার পর থেকে, বৃহৎ ভাষার মডেল-ভিত্তিক অ্যাপ্লিকেশনের বাণিজ্যিকীকরণে আগ্রহের বিস্ফোরণ ঘটেছে। সবচেয়ে আকর্ষণীয় অ্যাপ্লিকেশনগুলির মধ্যে একটি হল বিশেষজ্ঞ চ্যাট সিস্টেম তৈরি করা যা মালিকানা জ্ঞান বেসের একটি ডাটাবেস থেকে প্রাকৃতিক ভাষা প্রশ্নের উত্তর দিতে পারে।


এই স্থানের সবচেয়ে জনপ্রিয় কৌশলগুলির মধ্যে একটি হল [পুনরুদ্ধার-অগমেন্টেড জেনারেশন](https://retrieval-augmented generation aws), বা RAG, যা তৈরি করতে একটি বড় ভাষা মডেল ব্যবহার করার আগে ব্যবহারকারীর প্রশ্নের সাথে প্রাসঙ্গিক আইটেমগুলি খুঁজে পেতে ডকুমেন্ট এম্বেডিং ব্যবহার করে একটি উত্তর.


কৌশলটি অত্যন্ত শক্তিশালী কারণ এটি অত্যন্ত সস্তা এবং দ্রুত লুকআপের অনুমতি দেয়, সময়ের সাথে সাথে জ্ঞানের ভিত্তি পরিবর্তন এবং বিকাশের জন্য চরম নমনীয়তা প্রদান করে এবং অত্যন্ত জ্ঞাত এবং সঠিক উত্তর দেয় যা হ্যালুসিনেশন এবং ভুলগুলিকে ব্যাপকভাবে হ্রাস করে।


আরএজি সিস্টেমের আরও গভীর বিশ্লেষণের জন্য এবং কীভাবে এটি বাস্তবায়ন করা যায়, আপনি এখানে আমার আগের নিবন্ধটি পড়তে পারেন।


RAG সিস্টেম যতটা শক্তিশালী হতে পারে, আর্কিটেকচারে কিছু গুরুতর সীমাবদ্ধতা রয়েছে। আমরা আমার আগের নিবন্ধে কিছু সীমাবদ্ধতা অন্বেষণ করেছি এবং স্থাপত্য উন্নত করার উপায় প্রস্তাব করেছি।


আজ, আমরা এমবেডিং-ভিত্তিক আর্কিটেকচারের সাথে আরেকটি সীমাবদ্ধতা অন্বেষণ করব এবং আর্কিটেকচারের সীমাবদ্ধতাগুলিকে ঘিরে যাওয়ার একটি উপায় প্রস্তাব করব।

সমস্যা বিবৃতি

এমবেডিং-ভিত্তিক RAG-এর সীমাবদ্ধতা

ধরুন আমরা একটি প্রকাশনা যা একটি চ্যাট ইন্টারফেস তৈরি করতে চায় যা পাঠক এবং ক্লায়েন্টদের প্রশ্ন জিজ্ঞাসা করতে দেয়।


অবশ্যই, আমরা "X সম্পর্কে আপনার মতামত কি?" এর মতো প্রশ্নের উত্তর দিতে সক্ষম হব? অথবা "আপনি Y সম্পর্কে কি বলেছেন?" একটি সাধারণ RAG বাস্তবায়নের সাথে, কিন্তু একটি RAG আর্কিটেকচার সত্যিই সংগ্রাম শুরু করে যখন আপনি "2021 সালে X সম্পর্কে কী বলেছিলেন?" বা "2021 এবং 2023 এর মধ্যে আপনার Y-এর কভারেজ কীভাবে পরিবর্তিত হয়েছে?"


একটি এম্বেডিং-ভিত্তিক RAG-এর সাথে একটি চ্যালেঞ্জ হল যে এমবেডিং মডেলগুলি সাধারণত একটি পদ্ধতিগত উপায়ে মেটাডেটা এনকোড করতে অক্ষম হয়, এবং সেইজন্য যে কোনও লুকআপের জন্য প্রকাশনার তারিখ বা লেখকের নামের মতো জিনিসগুলি সম্পর্কে জ্ঞান প্রয়োজন তা আপনার RAG সিস্টেমকে বেশ কিছুটা সমস্যায় ফেলবে। .


আমরা এই সমস্যার সমাধান করতে পারি বৃহৎ ভাষার মডেলের সবচেয়ে উত্তেজনাপূর্ণ বৈশিষ্ট্যগুলির একটি - কোড জেনারেশনের মাধ্যমে। আমরা একটি বাস্তব-বিশ্বের প্রকাশনা দেখব, একটি LLM-ভিত্তিক অ্যালগরিদম ডিজাইন করব যা RAG আর্কিটেকচারে উন্নতি করে এবং অ্যালগরিদমের উপর ভিত্তি করে একটি চ্যাটবট তৈরি করব৷

ব্যবসায়িক সমস্যা

আজ, আমরা CB ইনসাইটস নিউজলেটার দেখব, একটি জনপ্রিয় দৈনিক নিউজলেটার যা স্টার্টআপ এবং প্রযুক্তি কভার করে। CB Insights-এর একজন প্রাক্তন ফুল-স্ট্যাক ডেভেলপার হিসেবে, আমি প্রায়ই কর্মদিবসের শেষে প্রতিষ্ঠাতার অনন্য ব্র্যান্ডের বুদ্ধি এবং অন্তর্দৃষ্টির অপেক্ষায় থাকতাম।


আজ, আমরা একটি চ্যাটবট তৈরি করতে বেস ডেটা হিসাবে CB ইনসাইটস নিউজলেটার আর্কাইভ ব্যবহার করব যা মেটাডেটা-ভিত্তিক প্রাকৃতিক ভাষার প্রশ্নের উত্তর দিতে পারে এমনভাবে যা ভ্যানিলা এম্বেডিং-ভিত্তিক RAG বাস্তবায়নের চেয়ে উচ্চতর।


বিশেষ করে, আমরা চাই চ্যাটবট এই ধরনের প্রশ্নের উত্তর দিতে সক্ষম হোক:


  • 2020 সালে উবার সম্পর্কে আপনি কী বলেছিলেন?


  • 2016-2019 এর মধ্যে Airbnb-এর ভাগ্য কীভাবে পরিবর্তিত হয়েছে?


  • 2020-এর দশকে ভারত থেকে কিছু উল্লেখযোগ্য ইউনিকর্ন স্টার্টআপ কী কী?


চলুন এটা পেতে!

ব্যবহৃত প্রযুক্তি

এই কাজটি সম্পন্ন করতে, আমরা নিম্নলিখিত প্রযুক্তিগুলি ব্যবহার করব:

পাইথন

আপনি যদি আমার অন্যান্য নিবন্ধগুলি অনুসরণ করেন তবে এতে অবাক হওয়ার কিছু নেই যে আমি এই নিবন্ধের বেশিরভাগ কোডের জন্য পাইথন ব্যবহার করব। পাইথনের চমৎকার ওয়েব স্ক্র্যাপিং, ডেটা প্রসেসিং এবং ওপেনএআই ইন্টিগ্রেশন রয়েছে, যার সবই আমরা আজ আমাদের প্রকল্পের জন্য ব্যবহার করব।

এসকিউএল

SQL হল একটি ক্যোয়ারী ভাষা যা ব্যবহারকারীদের SQLite, MySQL, PostgreSQL, এবং SQL সার্ভার সহ বিভিন্ন প্রধান রিলেশনাল ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করতে দেয়। ভাষা হল ডাটাবেসের নির্দেশাবলীর একটি সেট যাতে ব্যবহারকারীর কাছে ডেটা ফেরত দেওয়ার আগে কীভাবে পুনরুদ্ধার করা যায়, একত্রিত করা যায় এবং ম্যানিপুলেট করা যায়।

এলএলএম কোড জেনারেশন

LLM কোড জেনারেশন হল এমন একটি কৌশল যা গত কয়েক মাস ধরে ব্যাপক মনোযোগ পেয়েছে, কারণ GPT 3.5, GPT 4, এবং LLaMa 2 সহ বেশ কয়েকটি ফাউন্ডেশন মডেল প্রাকৃতিক ভাষার প্রশ্নের উত্তরে আশ্চর্যজনক জটিলতার কোড তৈরি করার ক্ষমতা প্রদর্শন করেছে।


বিশেষভাবে প্রশিক্ষিত এবং টিউন করা সিস্টেমগুলি, যেমন GitHub's Copilot, বিশেষভাবে কোড তৈরির জন্য ডিজাইন করা মডেলগুলি ব্যবহার করে উল্লেখযোগ্যভাবে বুদ্ধিমান কোড লিখতে সক্ষম, কিন্তু একটি সঠিকভাবে প্রম্পট করা সাধারণ-উদ্দেশ্য GPT মডেলের ইতিমধ্যেই ব্যতিক্রমী ক্ষমতা রয়েছে যখন এটি কোড লেখার ক্ষেত্রে আসে।

শব্দার্থিক এম্বেডিং

শব্দার্থিক এম্বেডিং বেশিরভাগ RAG বাস্তবায়নের মেরুদণ্ড। প্রাকৃতিক ভাষার কৌশলগুলির একটি সিরিজ ব্যবহার করে, আমরা প্রাকৃতিক ভাষা পাঠকে সংখ্যার ভেক্টরে পরিণত করতে পারি যা একটি শব্দার্থিক ভেক্টর স্থানের মধ্যে পাঠ্যের বিষয়বস্তুকে উপস্থাপন করে।


তারপরে আমরা এই এমবেডিংগুলি পরিচালনা করতে ভেক্টর বীজগণিত ব্যবহার করতে পারি, যা আমাদের গাণিতিক পদ্ধতি ব্যবহার করে দুটি পাঠ্য কর্পোরার মধ্যে সম্পর্ক নির্ধারণ করতে দেয়।

GPT-3.5 এবং GPT-4

1.7 ট্রিলিয়ন প্যারামিটার সহ, GPT-4 হল সবচেয়ে শক্তিশালী ট্রান্সফরমার-ভিত্তিক বৃহৎ ভাষা মডেল যা বর্তমানে বাজারে উপলব্ধ। GPT-4 টেক্সটের বড় অংশ, জটিল যুক্তি এবং কঠিন প্রম্পটের প্রতিক্রিয়ায় দীর্ঘ-সমৃদ্ধ উত্তর তৈরি করতে সক্ষম।


GPT-3.5, GPT-4 এর অনেক ছোট কাজিন, হল সেই মডেল যেটি চ্যাটজিপিটি চালিত হয়েছিল যখন এটি বিশ্বকে ঝড় তুলেছিল। এটি অবিশ্বাস্যভাবে জটিল প্রম্পট প্রক্রিয়া করতে সক্ষম, এবং এটিতে বিশুদ্ধ যুক্তির ক্ষমতার অভাব রয়েছে, এটি গতি এবং খরচ সঞ্চয় করে।


সহজ কাজের জন্য, GPT3.5 কর্মক্ষমতা এবং নির্ভুলতার মধ্যে ভারসাম্য বজায় রাখে।

চ্যাটবট ব্যাকএন্ড সেট আপ করা হচ্ছে

ডাটাবেস সেট আপ করা হচ্ছে

আমরা আমাদের AI তৈরি করার আগে, আমাদের ডেটা পেতে হবে। এটি করার জন্য, আমরা CB Insights এর নিউজলেটার আর্কাইভ পৃষ্ঠা [ https://www.cbinsights.com/newsletter/ ] ব্যবহার করতে পারি যেখানে অতীতের নিউজলেটারগুলির একটি সংগ্রহ রয়েছে৷


সমস্ত লিঙ্ক পেতে, আমরা পাইথনের অনুরোধ এবং সুন্দর স্যুপ লাইব্রেরি ব্যবহার করতে পারি:

 import requests from bs4 import BeautifulSoup res = requests.get('https://www.cbinsights.com/newsletter/') soup = BeautifulSoup(res.text) article_links = [[i.text, i['href']] for i in soup.find_all('a') if 'campaign-archive' in i['href'] ]


একবার আমাদের কাছে লিঙ্কগুলি হয়ে গেলে, আমরা প্রতিটি লিঙ্কে যেতে পারি এবং নিবন্ধটি HTML ডাউনলোড করতে পারি। পাইথনের তালিকা বোঝার সাথে, আমরা এটি এক লাইনে করতে পারি:


 article_soups = [BeautifulSoup(requests.get(link[1]).text) for link in article_links]


এটি একটু সময় নেবে, কিন্তু অবশেষে, সমস্ত লিঙ্ক স্ক্র্যাপ করা উচিত।


এখন, আমরা প্রাসঙ্গিক বিভাগগুলি বের করতে BeautifulSoup ব্যবহার করতে পারি:


 import re # SEO optimizations cause some articles to appear twice so we dedupe them. # We also remove some multiple newlines and unicode characters. def get_deduped_article_tables(article_table): new_article_tables = [] for i in article_table: text_content = re.sub(r'\n{2,}', '\n', i.replace('\xa0', '').strip()) if text_content not in new_article_tables or text_content == '': new_article_tables.append(text_content) return new_article_tables result_json = {} for soup_meta, soup_art in zip(article_links, article_soups): article_tables = [] cur_article = [] for table in soup_art.find_all('table'): if table.attrs.get('mc:variant') == 'Section_Divider': article_tables.append(get_deduped_article_tables(cur_article)) cur_article = [] else: cur_article.append(table.text) article_tables.append(get_deduped_article_tables(cur_article)) result_json[soup_meta[0]] = article_tables


আসুন আরও কিছু প্রক্রিয়াকরণ করি এবং এটিকে একটি ডেটাফ্রেমে পরিণত করি:


 import pandas as pd result_rows = [] for article_name, article_json in result_json.items(): article_date = article_json[0][1] for idx, tbl in enumerate(article_json[1:]): txt = '\n'.join(tbl).strip() if txt != '': result_rows.append({ 'article_name': article_name, 'article_date': article_date, 'idx': idx, 'text': txt, }) df = apd.DataFrame(result_rows)


আপনি যদি ডেটাফ্রেম পরিদর্শন করেন, তাহলে আপনাকে নীচের মত কিছু দেখতে হবে:



আমাদের কাছে ডেটা থাকাকালীন, আসুন নিবন্ধগুলির জন্য এম্বেডিংগুলিও তৈরি করি৷ OpenAI এর অ্যাডা এমবেডিং মডেলের সাথে, এটি বেশ সহজ।


 import openai EMBEDDING_MODEL = "text-embedding-ada-002" openai.api_key = [YOUR KEY] df['embedding'] = df['text'].map(lambda txt: openai.Embedding.create(model=EMBEDDING_MODEL, input=[txt])['data'][0]['embedding'])


এখন আমরা এই অনুশীলনের জন্য যে ডেটা ব্যবহার করছি তা আমাদের কাছে আছে, আসুন ডেটাকে একটি ডাটাবেসে লোড করি। এই অনুশীলনের জন্য, আমরা SQLite ব্যবহার করব, যা একটি হালকা ওজনের, স্বয়ংসম্পূর্ণ ডাটাবেস সিস্টেম যা পাইথনের সাথে প্যাকেজ করা হয়।


অনুগ্রহ করে মনে রাখবেন যে একটি উত্পাদন পরিবেশে, আপনি সম্ভবত একটি সঠিক ডাটাবেস উদাহরণ ব্যবহার করতে চাইবেন যেমন MySQL বা PostgreSQL আমরা এখানে যে SQL ব্যবহার করছি তাতে ছোটখাট পরিবর্তন করে, কিন্তু সাধারণ কৌশলটি একই থাকবে।


ডাটাবেস ইনস্ট্যান্ট এবং লোড করতে, পাইথনে নিম্নলিখিতটি চালান। নোট করুন যে নিবন্ধের পাঠ্য এবং এম্বেডিংগুলি ছাড়াও, আমরা কিছু মেটাডেটাও সংরক্ষণ করছি, যেমন প্রকাশনার তারিখ।


এছাড়াও মনে রাখবেন যে SQLite3, অন্যান্য SQL ডাটাবেসের বিপরীতে, একটি গতিশীল টাইপিং সিস্টেম ব্যবহার করে, তাই আমাদের তৈরি ক্যোয়ারীতে ডেটা প্রকারগুলি নির্দিষ্ট করতে হবে না।


 import sqlite3 import json con = sqlite3.connect("./cbi_article.db") cur = con.cursor() cur.execute("CREATE TABLE article(name, date, idx, content, embedding_json)") con.commit() rows = [] for _, row in df.iterrows(): rows.append([row['article_name'], row['article_date'], row['idx'], row['text'], json.dumps(row['embedding'])]) cur.executemany("INSERT INTO article VALUES (?, ?, ?, ?, ?)", rows) con.commit()


এবং এর তথ্য অনুসন্ধান করার চেষ্টা করা যাক.


 res = cur.execute(""" SELECT name, date, idx FROM article WHERE date >= DATE('now', '-2 years'); """) res.fetchall()


এর মতো কিছু পাওয়া উচিত:




দেখতে বেশ সুন্দর!


মেটাডেটা লুকআপের জন্য একটি কোড জেনারেটর তৈরি করা

এখন যেহেতু আমরা SQLite ডাটাবেসে ডেটা লোড করেছি, আমরা পরবর্তী পর্যায়ে যেতে পারি। মনে রাখবেন যে এম্বেডিং-শুধুমাত্র RAG বাস্তবায়নের চ্যালেঞ্জগুলির মধ্যে একটি হল নমনীয় মেটাডেটা লুকআপ ক্ষমতার অভাব।


যাইহোক, এখন যেহেতু আমাদের একটি এসকিউএল ডাটাবেসে মেটাডেটা লোড করা আছে, আমরা নমনীয় মেটাডেটা লুকআপ করতে GPT-এর কোড জেনারেশন ক্ষমতা ব্যবহার করতে পারি।


এসকিউএল কোড তৈরি করতে, আমরা কিছু সাধারণ প্রম্পট ইঞ্জিনিয়ারিং ব্যবহার করতে পারি।


 response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a SQL query writer that can construct queries based on incoming questions. Answer with only the SQL query."}, {"role": "user", "content": """ Suppose we have the SQLite database table called "article" with the following columns, which contains newsletter articles from a publication: name, date, idx, content, embedding_json Write a question that would retrieve the rows necessary to answer the following user question. Only filter on date. Do not filter on any other column. Make sure the query returns every row in the table by name. Reply only with the SQL query. User question: What did you say about the future of the fintech industry in summer of 2022? """}, ] )


নিম্নলিখিত প্রম্পট ইঞ্জিনিয়ারিং লক্ষ্য করুন 1) আমরা ডাটাবেস স্কিমা দিই তবে এটি সহজ রাখি। 2) আমরা রিটার্ন কলাম নির্দিষ্ট করি। 3) আমরা ফিল্টারিংয়ের জন্য উপলব্ধ কলামগুলি নির্দিষ্ট করি। 4) আমরা SQL ফ্লেভার নির্দিষ্ট করি। এই প্রম্পটটি নীচের মত SQL কোড তৈরি করবে:


 SELECT * FROM article WHERE date BETWEEN '2022-06-01' AND '2022-08-31'


এখন, কারণ রিটার্ন মান নির্ধারক নয়, কখনও কখনও আপনি আপনার জেনারেট করা কোডে আইডিওসিঙ্ক্রাসিসের সাথে শেষ হবেন। এই অবস্থাগুলি পরিচালনা করার জন্য, ডেটা পুনরুত্পাদন করার চেষ্টা করার জন্য আমরা কেবল একটি ট্রাই-ক্যাচ লুপ থাকতে পারি। আমরা অবশ্যই এটি অসীমভাবে করতে চাই না, তাই যদি আমরা তিনটি চেষ্টায় একটি সঠিক এসকিউএল তৈরি করতে না পারি, আমরা কেবল প্রস্থান করব এবং ভ্যানিলা RAG-এ ফিরে যাব।


আমরা ফিল্টারটি এভাবে বাস্তবায়ন করতে পারি:


 res = [] for i in range(3): response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a SQL query writer that can construct queries based on incoming questions. Answer with only the SQL query."}, {"role": "user", "content": """ Suppose we have the SQLite database table called "article" with the following columns, which contains newsletter articles from a publication: name, date, idx, content, embedding_json Write a question that would retrieve the rows necessary to answer the following user question. Only filter on date. Do not filter on any other column. Make sure the query returns every row in the table by name. Reply only with the SQL query. User question: What did you say about the future of the fintech industry in summer of 2022? """}, ] ) generated_query = response.choices[0].message['content'] is_query_safe = True for no_use_word in {'DELETE', 'UPDATE', 'DROP'}: if no_use_word in generated_query.upper(): is_query_safe = False if not is_query_safe: break # the user input is likely malicious. Try to answer the question with vanilla RAG res = cur.execute(generated_query).fetchall() if len(res) > 0: break if len(res) == 0: # vanilla RAG in memory. Use a vector DB in production please. res = cur.execute('''SELECT * FROM articles''').fetchall()


এটি একটি তুলনামূলকভাবে অপরিশোধিত ফিল্টার, তাই উত্পাদন ব্যবহারের ক্ষেত্রে, আপনি সম্ভবত প্রাসঙ্গিকতা এবং SQL সঠিকতার জন্য আরও পরীক্ষা চালাতে চাইবেন, তবে এটি আমাদের উদাহরণের জন্য যথেষ্ট।


AI সুরক্ষার উপর একটি দ্রুত নোট , AI থেকে ফেরত আসা কোড চালানোর সময় আমাদের সতর্ক হওয়া উচিত, বিশেষ করে যদি ব্যবহারকারীর ইনপুট প্রম্পটের অংশ হিসাবে ব্যবহার করা হয়।


আমরা যদি আউটপুটকে স্যানিটাইজ না করি, তাহলে আমরা নিজেদেরকে প্রম্পট-ইঞ্জিনিয়ারিং আক্রমণের জন্য ঝুঁকির মধ্যে ফেলে রাখি যেখানে ব্যবহারকারী আপডেট তৈরি করতে বা বিবৃতি মুছে ফেলার জন্য AI-কে ম্যানিপুলেট করার চেষ্টা করে।


অতএব, আমাদের কম্পিউটারে কোড চালানোর আগে আউটপুটটি আমাদের প্রত্যাশা অনুযায়ী আছে কিনা তা নিশ্চিত করার জন্য আমাদের সর্বদা পরীক্ষা করা উচিত।


পুনরুদ্ধার ফলাফল দেখতে নিম্নলিখিত কোড চালান:


 df = pd.DataFrame([{c[0]: v for c, v in zip(cur.description, row)} for row in res])


এবং এখন, আপনি নিম্নলিখিত ফলাফল দেখতে হবে:



ফলাফলের সাথে স্ট্যান্ডার্ড RAG চলছে

এখন আমরা মেটাডেটা লুকআপের ফলাফল পেয়েছি, বাকিটা সহজ। আমরা পুনরুদ্ধার করা সমস্ত ফলাফলের জন্য কোসাইন সাদৃশ্য গণনা করি:


 from openai.embeddings_utils import cosine_similarity q_embed = openai.Embedding.create(model=EMBEDDING_MODEL, input=[user_question])['data'][0]['embedding'] df['cosine_similarity'] = df['embedding_json'].map(lambda js: cosine_similarity(json.loads(js), q_embed))


এবং এখন, আমরা শীর্ষ 10টি নিউজলেটার নিতে পারি এবং প্রশ্নের উত্তর দিতে প্রম্পট ইঞ্জিনিয়ারিং ব্যবহার করতে পারি। আমরা এখানে 10টি বেছে নিয়েছি কারণ প্রতিটি নিউজলেটারের অংশ তুলনামূলকভাবে ছোট।


আপনি যদি দীর্ঘ নিবন্ধগুলির সাথে কাজ করেন তবে আপনি সম্ভাব্যভাবে কম নিবন্ধ ব্যবহার করতে চাইবেন বা বোনাস বিভাগে কভার করা কৌশলটি ব্যবহার করতে চাইবেন।


 answer_prompt = ''' Consider the following newsletter excerpts from the following dates: ''' for _, row in df.sort_values('cosine_similarity', ascending=False).iloc[:10].iterrows(): answer_prompt += """ ======= Date: %s ==== %s ===================== """ % (row['date'], row['content']) answer_prompt += """ Answer the following question: %s """ % user_question response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a tech analyst that can summarize the content of newsletters"}, {"role": "user", "content": answer_prompt}, ] )


এটি আপনাকে নিম্নলিখিতগুলির মতো একটি ফলাফল দিতে হবে:


2022 সালের গ্রীষ্মে বিভিন্ন নিউজলেটারে ফিনটেকের ভবিষ্যত নিয়ে আলোচনা করা হয়েছিল। 2021 সালে উচ্চতার পর Q2'22 তহবিল 2020 স্তরের দিকে নেমে যাওয়ায় ফিনটেকের একটি উল্লেখযোগ্য মন্দা ছিল। Q2'22 রিপোর্ট বিশ্বব্যাপী ফিনটেক বিনিয়োগের পতনকে তুলে ধরেছে .


যাইহোক, ফিনটেকের ভবিষ্যত আশাব্যঞ্জক মনে হয়েছে কারণ প্রাথমিক পর্যায়ের স্টার্টআপগুলির দিকে একটি উল্লেখযোগ্য পরিবর্তন লক্ষ্য করা গেছে, বিশেষ করে অর্থপ্রদানের ক্ষেত্রে। অর্থপ্রদানের ক্ষেত্রে বৈশ্বিক বিনিয়োগ 2021 সালের সর্বোচ্চ পর্যায়ের পর স্বাভাবিক অবস্থায় ফিরে আসার কারণে অর্থপ্রদানের ক্ষেত্রে 43% কমে Q2'22 থেকে Q2'22-তে $5.1B-এ নেমে এসেছে।


এই রাজ্যে নতুন প্রবেশকারীরা 2022 সালে এ পর্যন্ত ডিলের বেশি অংশ (63%) আকর্ষণ করেছে, যা স্টার্ট-আপগুলিতে বিনিয়োগকারীদের আগ্রহকে চিহ্নিত করেছে। এছাড়াও রিপোর্ট করা হয়েছে যে ফিনটেক ক্রমবর্ধমান প্রতিযোগিতা খুচরা ব্যাঙ্কগুলির মধ্যে ঘটাচ্ছে, তাদের মূল পরিষেবাগুলির ডিজিটাইজেশনকে অগ্রাধিকার দিতে বাধ্য করছে৷


চ্যাটবট এবং গ্রাহক বিশ্লেষণ প্ল্যাটফর্মের মতো প্রযুক্তি ব্যবহার করে গ্রাহকের অভিজ্ঞতা বৃদ্ধি, বিশেষ করে মোবাইল ব্যাঙ্কিং-এর উপর মনোযোগ কেন্দ্রীভূত করে ব্যাঙ্কিং সেক্টর সাড়া দিয়েছে। এই সবই একটি স্পন্দনশীল এবং প্রতিযোগিতামূলক ফিনটেক শিল্পকে সামনের দিকে নির্দেশ করে।


যা বেশ ভালো! আপনি যদি উত্তরের প্রম্পটটি দেখে উত্তরটি ফ্যাক্ট-চেক করেন, আপনি লক্ষ্য করবেন যে পরিসংখ্যানগুলি সমস্ত উৎস উপাদান থেকে আসছে। আপনি আরও লক্ষ্য করবেন যে উৎস উপাদানে কিছু আইডিওসিঙ্ক্রাটিক বিন্যাস রয়েছে যা GPT4 উপেক্ষা করতে সক্ষম হয়েছিল। এটি ডেটা সংক্ষিপ্তকরণ সিস্টেমে LLM-এর নমনীয়তা দেখায়।

বোনাস: সংক্ষিপ্তকরণ মিডলওয়্যার

এই প্রক্রিয়ায় আপনি যে সমস্যার সম্মুখীন হতে পারেন তা হল, যখন কর্পাস অত্যন্ত বড় হয়, তখন চূড়ান্ত প্রম্পটটি খুব বড় হতে পারে। আপনি যদি GPT-4 ব্যবহার করেন তবে এটি ব্যয়বহুল হতে পারে, তবে একটি খুব দীর্ঘ প্রম্পটে মডেলটিকে বিভ্রান্ত করার সুযোগ রয়েছে।


এটি সমাধান করার জন্য, আমরা GPT-3.5 এর সাথে পৃথক নিবন্ধগুলিকে প্রাক-প্রক্রিয়া করতে পারি, চূড়ান্ত ধাপে আমরা GPT-4-এ পাঠাচ্ছি চূড়ান্ত প্রম্পটটি সংকুচিত করে।


 summarization_prompt = ''' Summarize the following passage and extract only portions that are relevant to answering the user question. Passage: ======= %s ======= User Questions: %s ''' (row['content'], user_question) response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "You are a summarizer of tech industry reports"}, {"role": "user", "content": summarization_prompt}, ] )


আমরা তারপরে সারাংশগুলিকে প্রম্পটে রাখতে পারি, বিশুদ্ধ নিবন্ধটিকে চূড়ান্ত প্রম্পটে রাখার চেয়ে উল্লেখযোগ্য সঞ্চয় সহ।

একটি সহজ ফ্রন্টএন্ড নির্মাণ

এখন যেহেতু আমাদের কাছে পাইথন কোড লেখা আছে, আসুন এটিকে একটি সাধারণ ওয়েব অ্যাপ্লিকেশন হিসাবে প্যাকেজ করি।

ব্যাকএন্ড API

ফ্লাস্কের সাথে ব্যাকএন্ড API হিসাবে কোডটি প্যাকেজ করা তুলনামূলকভাবে সহজ। সহজভাবে একটি ফাংশন তৈরি করুন এবং এটিকে ফ্লাস্কের সাথে লিঙ্ক করুন:


 import requests from bs4 import BeautifulSoup import re import pandas as pd import sqlite3 import json import openai from openai.embeddings_utils import cosine_similarity from flask import Flask, request, jsonify from flask_cors import CORS app = Flask(__name__) CORS(app) EMBEDDING_MODEL = "text-embedding-ada-002" openai.api_key = [Your OpenAI Key] db_location = [Location of your SQLite DB] def process_user_query(user_question): con = sqlite3.connect(db_location) cur = con.cursor() user_question = 'What did you say about the future of the fintech industry in summer of 2022?' res = [] for i in range(3): response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a SQL query writer that can construct queries based on incoming questions. Answer with only the SQL query."}, {"role": "user", "content": """ Suppose we have the SQLite database table called "article" with the following columns, which contains newsletter articles from a publication: name, date, idx, content, embedding_json Write a question that would retrieve the rows necessary to answer the following user question. Only filter on date. Do not filter on any other column. Make sure the query returns every row in the table by name. Reply only with the SQL query. User question: What did you say about the future of the fintech industry in summer of 2022? """}, ] ) generated_query = response.choices[0].message['content'] is_query_safe = True for no_use_word in {'DELETE', 'UPDATE', 'DROP'}: if no_use_word in generated_query.upper(): is_query_safe = False if not is_query_safe: break # the user input is likely malicious. Try to answer the question with vanilla RAG res = cur.execute(generated_query).fetchall() if len(res) > 0: break if len(res) == 0: # vanilla RAG in memory. Use a vector DB in production please. res = cur.execute('''SELECT * FROM articles''').fetchall() df = pd.DataFrame([{c[0]: v for c, v in zip(cur.description, row)} for row in res]) q_embed = openai.Embedding.create(model=EMBEDDING_MODEL, input=[user_question])['data'][0]['embedding'] df['cosine_similarity'] = df['embedding_json'].map(lambda js: cosine_similarity(json.loads(js), q_embed)) answer_prompt = ''' Consider the following newsletter excerpts from the following dates: ''' for _, row in df.sort_values('cosine_similarity', ascending=False).iloc[:10].iterrows(): answer_prompt += """ ======= Date: %s ==== %s ===================== """ % (row['date'], row['content']) answer_prompt += """ Answer the following question: %s """ % user_question response = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a tech analyst that can summarize the content of newsletters"}, {"role": "user", "content": answer_prompt}, ] ) return response.choices[0].message['content'] @app.route('/process_user_question', methods=["POST"]) def process_user_question(): return jsonify({ 'status': 'success', 'result': process_user_query(request.json['user_question']) }) app.run()

এবং যে আসলে আমরা ব্যাকএন্ড জন্য কি করতে হবে!

ফ্রন্টএন্ড কোড

যেহেতু আমাদের শুধুমাত্র একটি শেষ পয়েন্ট আছে এবং আমাদের অ্যাপ্লিকেশনে অনেক স্টেটের প্রয়োজন নেই, ফ্রন্টএন্ড কোডটি বেশ সহজ হওয়া উচিত। অতীতের একটি নিবন্ধে মনে রাখবেন, আমরা রাউটিং সহ একটি প্রতিক্রিয়া অ্যাপ্লিকেশন সেট আপ করেছি যা আমাদের নির্দিষ্ট রুটে উপাদান রেন্ডার করতে দেয়।


একটি React.JS প্রজেক্ট সেট আপ করতে সেই নিবন্ধের নির্দেশাবলী অনুসরণ করুন এবং আপনার পছন্দের রুটে নিম্নলিখিত উপাদান যোগ করুন:


 import React, {useState, useEffect} from 'react'; import axios from 'axios'; const HNArticle = () => { const [result, setResult] = useState(''); const [message, setMessage] = useState(''); const [question, setQuestion] = useState(''); const askQuestion = () => { axios.post("http://127.0.0.1:5000/process_user_question", {user_question: question}) .then(r => r.data) .then(d => { console.log(d); setResult(d.result); }); } return <div className="row" style={{marginTop: '15px'}}> <div className="col-md-12" style={{marginBottom: '15px'}}> <center> <h5>Hackernoon CB Insights Demo</h5> </center> </div> <div className="col-md-10 offset-md-1 col-sm-12 col-lg-8 offset-lg-2" style={{marginBottom: '15px'}}> <ul className="list-group"> <li className="list-group-item"> <h6>Your Question</h6> <p><input className="form-control" placeholder="Question" value={question} onChange={e => setQuestion(e.target.value)} /></p> <p>{message}</p> <p> <button className="btn btn-primary" onClick={askQuestion}>Ask</button> </p> </li> {result? <li className="list-group-item"> <h6>Response</h6> {result.split("\n").map((p, i) => <p key={i}>{p}</p>)} </li>: ''} </ul> </div> </div>; } export default HNArticle;


কোড চালান, এবং আপনি এই মত একটি ইন্টারফেস দেখতে হবে:




একটি প্রশ্ন জিজ্ঞাসা করুন, এবং কিছুক্ষণ পরে, আপনি আউটপুট দেখতে হবে:


আর ভয়েলা! আমরা সফলভাবে একটি ভ্যানিলা RAG সিস্টেমের বাইরে উন্নত ক্যোয়ারী ক্ষমতা সহ একটি চ্যাটবট তৈরি করেছি!

উপসংহার

আজকের নিবন্ধে, আমরা শক্তিশালী কোড-জেনারেশন ক্ষমতা সহ একটি চ্যাটবট তৈরি করেছি। এটি এলএলএম অ্যাপ্লিকেশনগুলির একটি নতুন ক্লাসের একটি উদাহরণ যা এখন অনেক এআই অগ্রগামীদের দ্বারা তৈরি করা হচ্ছে, যা বিশেষজ্ঞ জ্ঞানের সাথে জেনারেটিভ এআই সিস্টেম তৈরি করতে ডেটা, প্রোগ্রামিং ভাষা এবং প্রাকৃতিক ভাষা বোঝার সুবিধা নিতে পারে।


এই বিশেষজ্ঞ সিস্টেমগুলি LLM অ্যাপ্লিকেশনগুলির জন্য বাণিজ্যিক কার্যকারিতা আনলক করার চাবিকাঠি যা OpenAI এবং Anthropic-এর মতো প্ল্যাটফর্ম প্রদানকারীদের থেকে সরাসরি পাওয়া যায় তার বাইরেও মূল্য প্রদান করতে চায়।


কোড জেনারেশন হল সেই কৌশলগুলির মধ্যে একটি যা সাম্প্রতিক প্রজন্মের বাণিজ্যিকভাবে উপলব্ধ বৃহৎ ভাষার মডেলগুলির দ্বারা সম্ভব হয়েছে৷


কীভাবে এলএলএম-এর বাণিজ্যিকীকরণ করা যায় সে সম্পর্কে আপনার যদি ধারণা থাকে বা এআই সম্পর্কে কথোপকথন করতে চান, তাহলে অনুগ্রহ করে LinkedIn বা GitHub- এ পৌঁছাতে দ্বিধা করবেন না। গত বছর ধরে আমি পাঠকদের সাথে অনেক অন্তর্দৃষ্টিপূর্ণ কথোপকথন করেছি এবং আরও অনেক কিছুর জন্য উন্মুখ!