টিএল; ডিআর
আপনি স্বয়ংক্রিয়ভাবে আপনার dbt পরিবেশে থেকে প্রতি 1M সারিতে $10 (এটি টাস্ক এবং মডেলের উপর নির্ভর করে) LLM ব্যবহার করে আপনার পাঠ্য ডেটার জন্য সাধারণ প্রাকৃতিক ভাষা প্রক্রিয়াকরণ কাজগুলি (শ্রেণীবিন্যাস, অনুভূতি বিশ্লেষণ, ইত্যাদি) সমাধান করতে পারেন। নির্দেশাবলী, বিবরণ, এবং কোড নীচে আছে
আপনি যদি আপনার রূপান্তর স্তর হিসাবে dbt ব্যবহার করেন, তাহলে আপনার এমন পরিস্থিতি হতে পারে যখন আপনি অসংগঠিত পাঠ্য ডেটা থেকে অর্থপূর্ণ তথ্য বের করতে চান। এই ধরনের ডেটাতে গ্রাহকের পর্যালোচনা, শিরোনাম, বিবরণ, Google Analytics উত্স/মাধ্যম ইত্যাদি অন্তর্ভুক্ত থাকতে পারে। আপনি সেগুলিকে গোষ্ঠীতে শ্রেণীবদ্ধ করতে বা অনুভূতি এবং টোন আনতে চাইতে পারেন।
সম্ভাব্য সমাধান হবে
পাইথন ডিবিটি মডেলগুলি বিকশিত হওয়ার সাথে সাথে আরও একটি সমাধান রয়েছে: আপনি এই প্রাকৃতিক ভাষা প্রক্রিয়াকরণ কাজগুলিকে আপনার ডিবিটি পরিবেশের মধ্যে একটি ডিবিটি মডেল হিসাবে রাখতে পারেন।
যদি এটি আপনার জন্য সহায়ক হতে পারে, তাহলে আপনার dbt প্রকল্পে OpenAI API কীভাবে ব্যবহার করবেন সে সম্পর্কে একটি ধাপে ধাপে নির্দেশিকা দেখুন। আপনি আপনার পরিবেশে এই নির্দেশিকা থেকে সমস্ত কিছু পুনরুত্পাদন করতে পারেন, GitHub সংগ্রহস্থল থেকে কোড এবং ডেটা নমুনা (শেষে লিঙ্কগুলি দেখুন)।
আপনার যদি ইতিমধ্যেই একটি dbt প্রকল্প এবং ডেটা থাকে বা ফলাফলগুলি পুনরুত্পাদন করতে না চান, তাহলে (4) এ যান বা এই বিভাগটি সম্পূর্ণভাবে এড়িয়ে যান৷ অন্যথায়, আপনার নিম্নলিখিতগুলির প্রয়োজন হবে:
ডিবিটি প্রকল্প সেট আপ করুন । অফিসিয়াল ডক্স
GitHub থেকে এই গাইডের জন্য আমি যেটি প্রস্তুত করেছি তা আপনি কেবল ক্লোন করতে পারেন।
আপনার profiles.yml ফাইল তৈরি/আপডেট করতে ভুলবেন না।
ডাটাবেস সেট আপ করুন । আমি স্নোফ্লেক ব্যবহার করেছি। দুর্ভাগ্যবশত, কোন বিনামূল্যের সংস্করণ নেই, তবে তারা একটি 30-দিনের বিনামূল্যে ট্রায়াল প্রদান করে
বর্তমানে, dbt Python মডেলগুলি শুধুমাত্র Snowflake, Databricks এবং BigQuery এর সাথে কাজ করে (কোন PostgreSQL নেই)। সুতরাং, এই টিউটোরিয়ালটি তাদের যেকোনো একটির জন্য কাজ করা উচিত, যদিও কিছু বিবরণ পরিবর্তিত হতে পারে
উৎস তথ্য প্রস্তুত
একটি ডেটাসেট হিসাবে, আমি TidyTuesday সংগ্রহস্থলে প্রকাশিত একটি R প্যাকেজ মেটাডেটা ব্যবহার করেছি।
এটি আপনার ডাটাবেসে আপলোড করুন।
আপনার ডাটাবেস এবং স্কিমার নামের সাথে মেলে dbt প্রকল্পে source.yml
ফাইলটি আপডেট করুন।
OpenAI API কী পান
অফিসিয়াল ডক্স থেকে দ্রুত শুরু করার নির্দেশাবলী অনুসরণ করুন।
না:এটি বিনামূল্যে নয়, তবে এটি-যেমন-যাও-যাওয়ার মতো অর্থপ্রদান। সুতরাং, পরীক্ষা 10-সারি ডেটাসেটের সাথে, আপনার পরীক্ষা চলাকালীন আপনাকে $1 এর বেশি চার্জ করা হবে না।
অতিরিক্ত সতর্কতা অবলম্বন করার জন্য, একটি ব্যয় সীমা সেট করুন।
স্নোফ্লেকে বাহ্যিক অ্যাক্সেস ইন্টিগ্রেশন সেট আপ করুন
প্রথমত, যদি আপনি একটি শ্রেণীবিভাগের কাজ সমাধান করেন, তাহলে আপনার LLM প্রম্পটে ব্যবহার করার জন্য আপনার বিভাগগুলি (ওরফে ক্লাস) প্রয়োজন। মূলত, আপনি বলবেন: "আমার কাছে এই বিভাগগুলির একটি তালিকা আছে, আপনি কি এই পাঠ্যটি কোনটির অন্তর্ভুক্ত তা নির্ধারণ করতে পারেন?"
এখানে কিছু বিকল্প:
ম্যানুয়ালি পূর্বনির্ধারিত বিভাগের একটি তালিকা তৈরি করুন
আপনার যদি স্থিতিশীল এবং অনুমানযোগ্য বিভাগগুলির প্রয়োজন হয় তবে এটি উপযুক্ত।
এখানে "অন্যান্য" যোগ করতে ভুলবেন না, তাই অনিশ্চিত হলে এলএলএম-এর কাছে এই বিকল্পগুলি থাকবে৷
যখনই এটি "অন্যান্য" বিভাগ ব্যবহার করে তখন একটি বিভাগের নাম প্রস্তাব করতে আপনার প্রম্পটে LLM কে বলুন।
ডাটাবেসের কাঁচা স্তরে একটি পূর্বনির্ধারিত তালিকা আপলোড করুন বা আপনার dbt প্রকল্পে একটি CSV হিসাবে ( dbt seed
ব্যবহার করে)।
আপনার ডেটার একটি নমুনা LLM-কে দিন এবং এটিকে N বিভাগগুলির সাথে আসতে বলুন।
আগের মত একই পন্থা, কিন্তু আমরা তালিকার সাহায্য পাচ্ছি।
আপনি যদি জিপিটি ব্যবহার করেন তবে প্রজননযোগ্যতার জন্য এখানে বীজ ব্যবহার করা ভাল।
পূর্বনির্ধারিত বিভাগ ছাড়াই যান এবং যেতে যেতে এলএলএমকে কাজ করতে দিন।
এটি কম অনুমানযোগ্য ফলাফল হতে পারে।
একই সময়ে, আপনি যদি এলোমেলোতার মার্জিন দিয়ে ঠিক থাকেন তবে এটি যথেষ্ট ভাল।
জিপিটি ব্যবহারের ক্ষেত্রে, আপনাকে পুনরায় চালানোর প্রয়োজন হলে ভিন্ন ফলাফল এড়াতে তাপমাত্রা = 0 রাখা ভাল।
এই ব্লগ পোস্টে, আমি 3য় বিকল্পের সাথে যাব।
এখন, এই পোস্টের মাংসে যাওয়া যাক এবং একটি dbt মডেল তৈরি করা যাক যা আপস্ট্রিম টেবিল থেকে নতুন পাঠ্য ডেটা নেবে, এটি OpenAI API-তে ফিড করবে এবং টেবিলে বিভাগটি সংরক্ষণ করবে।
উপরে উল্লিখিত হিসাবে, আমি R প্যাকেজ ডেটাসেট ব্যবহার করতে যাচ্ছি। তথ্য বিশ্লেষণে R একটি অত্যন্ত জনপ্রিয় প্রোগ্রামিং ভাষা। এই ডেটাসেটে CRAN প্রকল্পের R প্যাকেজ সম্পর্কে তথ্য রয়েছে, যেমন সংস্করণ, লাইসেন্স, লেখক, শিরোনাম, বিবরণ, ইত্যাদি। আমরা title
ক্ষেত্রে আগ্রহী, কারণ আমরা প্রতিটি প্যাকেজের শিরোনামের উপর ভিত্তি করে একটি বিভাগ তৈরি করতে যাচ্ছি।
মডেলের জন্য বেস প্রস্তুত করুন
dbt কনফিগারেশন dbt.config(...)
পদ্ধতির মাধ্যমে পাস করা যেতে পারে।
dbt.config এ অতিরিক্ত আর্গুমেন্ট আছে, উদাহরণস্বরূপ, packages
একটি প্যাকেজ প্রয়োজনীয়তা।
dbt পাইথন মডেল আপস্ট্রিম মডেল dbt.ref('...')
বা dbt.source('...')
উল্লেখ করতে পারে
এটি একটি ডেটাফ্রেম ফেরত দিতে হবে। আপনার ডাটাবেস এটি একটি টেবিল হিসাবে সংরক্ষণ করবে.
import os import openai import pandas as pd COL_TO_CATEGORIZE = 'title' def model(dbt, session): import _snowflake dbt.config( packages=['pandas', 'openai'], ) df = dbt.ref('package').to_pandas() df.drop_duplicates(subset=[COL_TO_CATEGORIZE], inplace=True) return df
OpenAI API-তে সংযোগ করুন
আমাদের dbt.config-এ secrets
এবং external_access_integrations
পাস করতে হবে। এতে আপনার স্নোফ্লেক এক্সটার্নাল অ্যাক্সেস ইন্টিগ্রেশনে সংরক্ষিত গোপন রেফারেন্স থাকবে।
দ্রষ্টব্য: এই বৈশিষ্ট্যটি মাত্র কয়েক দিন আগে প্রকাশিত হয়েছিল এবং এটি শুধুমাত্র বিটা ডিবিটি সংস্করণ 1.8.0-বি3-এ উপলব্ধ
dbt.config( packages=['pandas', 'openai'], secrets={'openai_key': 'openai_key', 'openai_org': 'openai_org'}, external_access_integrations=['openai_external_access_integration'], ) client = openai.OpenAI( api_key=_snowflake.get_generic_secret_string('openai_key'), organization=_snowflake.get_generic_secret_string('openai_org'), )
dbt মডেলকে ক্রমবর্ধমান করুন এবং সম্পূর্ণ রিফ্রেশ বন্ধ করুন।
dbt run
চালাবেন তখন আপনি OpenAI-তে সম্পূর্ণ ডেটা পাঠাবেন, যা দিনে কয়েকবার হতে পারে।materialized='incremental'
, incremental_strategy='append'
, full_refresh = False
যোগ করছি dbt.config( materialized='incremental', incremental_strategy='append', full_refresh = False, packages=['pandas', 'openai'], secrets={'openai_key': 'openai_key', 'openai_org': 'openai_org'}, external_access_integrations=['openai_external_access_integration'], ) if dbt.is_incremental: pass
ইনক্রিমেন্টালিটি লজিক যোগ করুন
dbt.this
ব্যবহার করে এটি করতে পারি। সাধারণ বর্ধিত মডেলের অনুরূপ। if dbt.is_incremental: categorized_query = f''' SELECT DISTINCT "{ COL_TO_CATEGORIZE }" AS primary_key FROM { dbt.this } WHERE "category" IS NOT NULL ''' categorized = [row.PRIMARY_KEY for row in session.sql(categorized_query).collect()] df = df.loc[~df[COL_TO_CATEGORIZE].isin(categorized), :]
ব্যাচে OpenAI API কল করুন
max_tokens
সীমাবদ্ধতা যোগ করেছি। BATCH_SIZE = 5 n_rows = df.shape[0] categories = [None for idx in range(n_rows)] for idx in range(0, n_rows, BATCH_SIZE): df_sliced = df.iloc[idx:idx+BATCH_SIZE, :] user_prompt = f'```{ "|".join(df_sliced[COL_TO_CATEGORIZE].to_list()) }```' chat_completion = client.chat.completions.create( messages=[ {'role': 'system', 'content': SYSTEM_PROMPT}, {'role': 'user', 'content': user_prompt} ], model='gpt-3.5-turbo', temperature=0, max_tokens=10*BATCH_SIZE + 2*BATCH_SIZE, ) gpt_response = chat_completion.choices[0].message.content gpt_response = [category.strip() for category in gpt_response.split('|')] categories[idx:idx + len(gpt_response)] = gpt_response df['category'] = categories df.dropna(subset=['category'], inplace=True)
এলএলএম-এর জন্য একটি প্রম্পট সম্পর্কে কথা বলার সময়। আমি যা পেয়েছি তা হল:
আপনাকে ``` বন্ধনীতে CRAN R প্যাকেজ শিরোনামের একটি তালিকা প্রদান করা হবে। শিরোনাম "|" দ্বারা পৃথক করা হবে চিহ্ন. প্রতিটি শিরোনামের জন্য একটি বিভাগ নিয়ে আসুন। "|" দ্বারা বিভক্ত শুধুমাত্র বিভাগের নামগুলি ফেরত দিন চিহ্ন.
চূড়ান্ত ডিবিটি মডেল কোড
import os import openai import pandas as pd SYSTEM_PROMPT = '''You will be provided a list of CRAN R package titles in ``` brackets. Titles will be separated by "|" sign. Come up with a category for each title. Return only category names separated by "|" sign. ''' COL_TO_CATEGORIZE = 'title' BATCH_SIZE = 5 def model(dbt, session): import _snowflake dbt.config( materialized='incremental', incremental_strategy='append', full_refresh = False, packages=['pandas', 'openai'], secrets={'openai_key': 'openai_key', 'openai_org': 'openai_org'}, external_access_integrations=['openai_external_access_integration'], ) client = openai.OpenAI( api_key=_snowflake.get_generic_secret_string('openai_key'), organization=_snowflake.get_generic_secret_string('openai_org'), ) df = dbt.ref('package').to_pandas() df.drop_duplicates(subset=[COL_TO_CATEGORIZE], inplace=True) if dbt.is_incremental: categorized_query = f''' SELECT DISTINCT "{ COL_TO_CATEGORIZE }" AS primary_key FROM { dbt.this } WHERE "category" IS NOT NULL ''' categorized = [row.PRIMARY_KEY for row in session.sql(categorized_query).collect()] df = df.loc[~df[COL_TO_CATEGORIZE].isin(categorized), :] n_rows = df.shape[0] categories = [None for idx in range(n_rows)] for idx in range(0, n_rows, BATCH_SIZE): df_sliced = df.iloc[idx:idx+BATCH_SIZE, :] user_prompt = f'```{ "|".join(df_sliced[COL_TO_CATEGORIZE].to_list()) }```' chat_completion = client.chat.completions.create( messages=[ {'role': 'system', 'content': SYSTEM_PROMPT}, {'role': 'user', 'content': user_prompt} ], model='gpt-3.5-turbo', temperature=0, max_tokens=10*BATCH_SIZE + 2*BATCH_SIZE, ) gpt_response = chat_completion.choices[0].message.content gpt_response = [category.strip() for category in gpt_response.split('|')] categories[idx:idx + len(gpt_response)] = gpt_response df['category'] = categories df.dropna(subset=['category'], inplace=True) return df
OpenAI API মূল্য এখানে তালিকাভুক্ত করা হয়েছে। তারা অনুরোধ করা এবং ফেরত দেওয়া টোকেনের সংখ্যার জন্য চার্জ করে। টোকেনটি আপনার অনুরোধের কয়েকটি অক্ষরের সাথে সম্পর্কিত একটি উদাহরণ। একটি প্রদত্ত পাঠ্যের জন্য বেশ কয়েকটি টোকেন মূল্যায়ন করার জন্য ওপেন সোর্স প্যাকেজ রয়েছে। উদাহরণস্বরূপ, টিকটোকেন । আপনি যদি এটিকে ম্যানুয়ালি মূল্যায়ন করতে চান, তবে যাওয়ার জায়গাটি এখানে একটি অফিসিয়াল OpenAI টোকেনাইজার।
আমাদের ডেটাসেটে, ~18K শিরোনাম রয়েছে৷ মোটামুটিভাবে, এটি 320K ইনপুট টোকেনের সমান (180K শিরোনাম এবং 140K সিস্টেম প্রম্পট যদি আমরা ব্যাচের আকার = 5 ব্যবহার করি) এবং 50K আউটপুট টোকেন। মডেলের উপর নির্ভর করে, সম্পূর্ণ স্ক্যানের জন্য খরচ হবে:
GPT-4 Turbo
: $4.7 । মূল্য: ইনপুট: $10 / 1M টোকেন; আউটপুট: $30 / 1M টোকেন।GPT-4
: $12.6। মূল্য: ইনপুট: $30 / 1M টোকেন; আউটপুট: $60 / 1M টোকেন।GPT-3.5 Turbo
: $0.2। মূল্য: ইনপুট: $0.5 / 1M টোকেন; আউটপুট: $1.5 / 1M টোকেন।ডিবিটি মডেল একটি কবজ মত কাজ. আমি সফলভাবে কোনো ফাঁক ছাড়াই সমস্ত 18K প্যাকেজ শ্রেণীবদ্ধ করেছি। মডেলটি সাশ্রয়ী এবং একাধিক ডিবিটি রানের বিরুদ্ধে সুরক্ষিত বলে প্রমাণিত হয়েছে।
আমি এখানে মূক পাবলিক ফলাফল ড্যাশবোর্ড প্রকাশ. নির্দ্বিধায় এটির সাথে খেলুন, ডেটা ডাউনলোড করুন এবং এর উপরে আপনি যা চান তা তৈরি করুন।
কিছু আকর্ষণীয় বিবরণ আমি পেয়েছি:
Data Visualization
(1,190 প্যাকেজ, বা 6%)। আমি অনুমান করি এটি একটি ভিজ্যুয়ালাইজেশন টুল হিসাবে R-এর জনপ্রিয়তা প্রমাণ করে, বিশেষ করে চকচকে, প্লটলি এবং অন্যান্য প্যাকেজের সাথে।
Data Import
এবং Data Processing
। R এর মতো শব্দগুলি ডেটা-প্রসেসিং টুল হিসাবে আরও বেশি ব্যবহার করা শুরু করেছে।
Natural Language Processing
বিখ্যাত কাগজ "অ্যাটেনশন ইজ অল ইউ নিড" এর দুই বছর পর এবং GPT-1 প্রকাশের অর্ধেক বছর পর :)আমরা একটি বিকল্প পদ্ধতি ব্যবহার করতে পারি — GPT এম্বেডিং ।
এটা অনেক সস্তা.
কিন্তু আরও ইঞ্জিনিয়ারিং-ভারী কারণ আপনার নিজের শ্রেণীবিভাগের অংশটি করা উচিত (সাথে থাকুন, কারণ আমি পরবর্তী পোস্টগুলির মধ্যে একটিতে এই বিকল্পটি অন্বেষণ করতে যাচ্ছি)।
অবশ্যই, ডিবিটি থেকে এই অংশটি সরিয়ে ফেলা এবং এটিকে ক্লাউড ফাংশনে বা আপনি যে কোনও ইনফ্রা ব্যবহার করেন তাতে ঠেলে দেওয়া বোধগম্য। একই সময়ে, আপনি যদি এটি dbt-এর অধীনে রাখতে চান — এই পোস্টটি আপনাকে কভার করে।
মডেলে কোনো যুক্তি যোগ করা এড়িয়ে চলুন। এটি একটি কাজ করা উচিত - LLM কল করুন এবং ফলাফল সংরক্ষণ করুন। এটি আপনাকে এটি পুনরায় চালানো থেকে দূরে থাকতে সহায়তা করবে।
সম্ভাবনা বেশি যে আপনি আপনার ডিবিটি প্রকল্পে অনেক পরিবেশ ব্যবহার করছেন। আপনাকে সচেতন হতে হবে এবং প্রতিটি পুল অনুরোধে প্রতিটি বিকাশকারী পরিবেশে বারবার এই মডেলটি চালানো এড়াতে হবে।
এটি করার জন্য, আপনি if dbt.config.get("target_name") == 'dev'
এর সাথে যুক্তি যুক্ত করতে পারেন
একটি ডিলিমিটারের সাথে প্রতিক্রিয়া অস্থির হতে পারে।
উদাহরণস্বরূপ, জিপিটি আপনার প্রত্যাশার চেয়ে কম উপাদান ফেরত দিতে পারে এবং বিভাগগুলির তালিকায় প্রাথমিক শিরোনাম ম্যাপ করা কঠিন হবে৷
এটি কাটিয়ে উঠতে, JSON আউটপুটের প্রয়োজনের জন্য আপনার অনুরোধে response_format={ "type": "json_object" }
যোগ করুন। অফিসিয়াল ডক্স দেখুন।
JSON আউটপুট দিয়ে, আপনি {"title": "category"} ফরম্যাটে একটি উত্তর দেওয়ার জন্য প্রম্পটে জিজ্ঞাসা করতে পারেন এবং তারপর এটিকে আপনার প্রাথমিক মানগুলিতে ম্যাপ করতে পারেন৷
মনে রাখবেন এটি আরও ব্যয়বহুল হবে, কারণ এটি প্রতিক্রিয়া আকার বৃদ্ধি করবে।
আশ্চর্যজনকভাবে, আমি যখন GPT 3.5 Turbo-এর জন্য JSON-এ স্যুইচ করি তখন শ্রেণীবিভাগের গুণমান নাটকীয়ভাবে কমে যায়।
স্নোফ্লেক-এ একটি বিকল্প রয়েছে - cortex.complete() ফাংশন ব্যবহার করে। ডিবিটি ব্লগে জোয়েল ল্যাবেসের একটি দুর্দান্ত পোস্ট দেখুন।
এটাই! আমার সম্পর্কে আপনি কী মনে করেন জানি।
GitHub-এ সম্পূর্ণ কোড: লিঙ্ক
মূকনাট্য পাবলিক ড্যাশবোর্ড: লিঙ্ক
টিডিটুসডে আর ডেটাসেট:লিঙ্ক