Thought for 3 seconds### টিউটোরিয়াল ২.১: মডেল, প্রম্পট এবং পার্সার
ভূমিকা
গল্প: সুমন একজন ডেভেলপার যিনি LangChain ব্যবহার করে একটি বাংলা ভাষার AI অ্যাসিস্ট্যান্ট তৈরি করতে চান। তিনি জানেন যে একটি ভাল AI অ্যাসিস্ট্যান্ট তৈরি করতে হলে সঠিক মডেল নির্বাচন, প্রম্পট ডিজাইন, এবং আউটপুট পার্সিং অত্যন্ত গুরুত্বপূর্ণ। তিনি ভাবছেন, “কোন মডেল আমার প্রয়োজনের জন্য সবচেয়ে উপযুক্ত হবে? আমি কিভাবে সেরা প্রম্পট লিখব? আমি কিভাবে AI-এর আউটপুট থেকে স্ট্রাকচারড ডাটা পাব?”
এই টিউটোরিয়ালে, আমরা সুমনের মতো ডেভেলপারদের জন্য LangChain-এ মডেল, প্রম্পট এবং পার্সার সম্পর্কে বিস্তারিত আলোচনা করব। আমরা দেখব কিভাবে বিভিন্ন মডেল ক্লাস ব্যবহার করতে হয়, কিভাবে প্রম্পট টেমপ্লেট তৈরি করতে হয়, এবং কিভাবে AI আউটপুট থেকে স্ট্রাকচারড ডাটা পেতে হয়।
LLM vs ChatModel ক্লাস
গল্প: সুমন প্রথমে বিভ্রান্ত ছিলেন যে LangChain-এ LLM এবং ChatModel – এই দুটি ক্লাস কেন আছে। এটা যেন একই রেস্টুরেন্টে দুই ধরনের শেফ আছে – একজন লম্বা এসে দীর্ঘ রচনা লিখতে পারেন, অন্যজন কথোপকথনে দক্ষ।
LLM ক্লাস
LLM ক্লাস হল টেক্সট-টু-টেক্সট মডেলের জন্য। এটি একটি স্ট্রিং ইনপুট নেয় এবং একটি স্ট্রিং আউটপুট দেয়:
from langchain_openai import OpenAI
from dotenv import load_dotenv
import os
# .env ফাইল থেকে API কি লোড করুন
load_dotenv()
# LLM মডেল সেটআপ করুন
llm = OpenAI(
model="gpt-3.5-turbo-instruct", # টেক্সট কমপ্লিশন মডেল
temperature=0.7,
api_key=os.getenv("OPENAI_API_KEY")
)
# LLM কল করুন
result = llm.invoke("বাংলাদেশের জাতীয় ফুল কি?")
print("LLM রেসপন্স:", result)
ChatModel ক্লাস
ChatModel ক্লাস চ্যাট মডেলের জন্য ডিজাইন করা হয়েছে। এটি মেসেজের লিস্ট (সিস্টেম, হিউম্যান, অ্যাসিস্ট্যান্ট) ইনপুট নেয় এবং একটি মেসেজ আউটপুট দেয়:
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
# ChatModel সেটআপ করুন
chat_model = ChatOpenAI(
model="gpt-3.5-turbo", # চ্যাট মডেল
temperature=0.7,
api_key=os.getenv("OPENAI_API_KEY")
)
# মেসেজ লিস্ট তৈরি করুন
messages = [
SystemMessage(content="আপনি একজন সহায়ক AI অ্যাসিস্ট্যান্ট।"),
HumanMessage(content="বাংলাদেশের জাতীয় ফুল কি?")
]
# ChatModel কল করুন
result = chat_model.invoke(messages)
print("ChatModel রেসপন্স:", result.content)
LLM vs ChatModel: কখন কোনটি ব্যবহার করবেন
| ফিচার | LLM | ChatModel |
|---|---|---|
| ইনপুট | সিঙ্গেল স্ট্রিং | মেসেজের লিস্ট |
| আউটপুট | স্ট্রিং | মেসেজ অবজেক্ট |
| ইউজ কেস | টেক্সট জেনারেশন, সামারাইজেশন | কনভার্সেশন, রোল-বেসড ইন্টারেকশন |
| কনটেক্সট | সিঙ্গেল প্রম্পট | মাল্টিপল টার্ন কনভার্সেশন |
| উদাহরণ মডেল | gpt-3.5-turbo-instruct | gpt-3.5-turbo, claude-2 |
কখন LLM ব্যবহার করবেন:
- সিম্পল টেক্সট জেনারেশন
- টেক্সট সামারাইজেশন
- টেক্সট ক্লাসিফিকেশন
- সিঙ্গেল-টার্ন ইন্টারেকশন
কখন ChatModel ব্যবহার করবেন:
- কনভার্সেশনাল AI
- রোল-বেসড ইন্টারেকশন (সিস্টেম, হিউম্যান, অ্যাসিস্ট্যান্ট)
- মাল্টি-টার্ন ডায়লগ
- কমপ্লেক্স প্রম্পট ইঞ্জিনিয়ারিং
বিভিন্ন মডেল প্রোভাইডার
গল্প: সুমন বিভিন্ন মডেল প্রোভাইডার এক্সপ্লোর করতে চান। তিনি ভাবছেন, “এটা যেন বিভিন্ন রেস্টুরেন্ট থেকে খাবার অর্ডার করার মতো – প্রত্যেকের নিজস্ব স্পেশালিটি আছে।”
LangChain বিভিন্ন মডেল প্রোভাইডারের সাথে ইন্টিগ্রেট করে। এখানে কয়েকটি জনপ্রিয় প্রোভাইডার দেখানো হল:
OpenAI
OpenAI সবচেয়ে জনপ্রিয় মডেল প্রোভাইডারদের মধ্যে একটি:
from langchain_openai import OpenAI, ChatOpenAI
# টেক্সট কমপ্লিশন মডেল
openai_llm = OpenAI(
model="gpt-3.5-turbo-instruct",
temperature=0.7,
api_key=os.getenv("OPENAI_API_KEY")
)
# চ্যাট মডেল
openai_chat = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7,
api_key=os.getenv("OPENAI_API_KEY")
)
Anthropic
Anthropic-এর Claude মডেল লম্বা কনটেক্সট উইন্ডো এবং সেফটি ফিচারের জন্য জনপ্রিয়:
from langchain_anthropic import ChatAnthropic
# Anthropic Claude মডেল
claude_chat = ChatAnthropic(
model="claude-2",
temperature=0.7,
anthropic_api_key=os.getenv("ANTHROPIC_API_KEY")
)
# Claude মডেল কল করুন
claude_response = claude_chat.invoke([
SystemMessage(content="আপনি একজন সহায়ক AI অ্যাসিস্ট্যান্ট।"),
HumanMessage(content="বাংলাদেশের ঐতিহাসিক স্থানগুলি সম্পর্কে আমাকে বলুন।")
])
print("Claude রেসপন্স:", claude_response.content)
Hugging Face
Hugging Face হাব থেকে ওপেন-সোর্স মডেল ব্যবহার করতে পারেন:
from langchain_huggingface import HuggingFaceEndpoint
# Hugging Face মডেল
hf_model = HuggingFaceEndpoint(
repo_id="mistralai/Mistral-7B-Instruct-v0.2", # মডেল নাম
huggingfacehub_api_token=os.getenv("HUGGINGFACE_API_TOKEN")
)
# Hugging Face মডেল কল করুন
hf_response = hf_model.invoke("বাংলাদেশের জাতীয় খাবার কি?")
print("Hugging Face রেসপন্স:", hf_response)
Google (Vertex AI)
Google-এর Vertex AI মডেল ব্যবহার করতে পারেন:
from langchain_google_vertexai import VertexAI, ChatVertexAI
# Google Vertex AI টেক্সট মডেল
vertex_llm = VertexAI(
model_name="text-bison",
temperature=0.7,
project=os.getenv("GOOGLE_CLOUD_PROJECT")
)
# Google Vertex AI চ্যাট মডেল
vertex_chat = ChatVertexAI(
model_name="chat-bison",
temperature=0.7,
project=os.getenv("GOOGLE_CLOUD_PROJECT")
)
মডেল প্রোভাইডার তুলনা
| প্রোভাইডার | স্ট্রেংথ | উইকনেস | ইউজ কেস |
|---|---|---|---|
| OpenAI | হাই কোয়ালিটি, ভাল ডকুমেন্টেশন | কস্টলি, ক্লোজড-সোর্স | জেনারেল পারপাস, প্রোডাকশন |
| Anthropic | লং কনটেক্সট, সেফটি ফোকাস | কস্টলি, লিমিটেড মডেল | লং ডকুমেন্ট প্রসেসিং, সেফটি-ক্রিটিকাল |
| Hugging Face | ওপেন-সোর্স, সেলফ-হোস্টিং | ভেরিয়েবল কোয়ালিটি | লো-কস্ট, প্রাইভেসি-সেন্সিটিভ |
| এন্টারপ্রাইজ সাপোর্ট, GCP ইন্টিগ্রেশন | কমপ্লেক্স সেটআপ | এন্টারপ্রাইজ, GCP ইউজার |
মডেল প্যারামিটার
গল্প: সুমন বুঝতে পারলেন যে মডেল প্যারামিটার সেটিং একটি রেসিপিতে মশলার পরিমাণের মতো – সঠিক পরিমাণ খুব গুরুত্বপূর্ণ!
LLM এবং ChatModel-এর বিভিন্ন প্যারামিটার আছে যা আউটপুট কন্ট্রোল করে:
সাধারণ প্যারামিটার
from langchain_openai import ChatOpenAI
chat_model = ChatOpenAI(
model="gpt-3.5-turbo", # মডেল নাম
temperature=0.7, # ক্রিয়েটিভিটি (0-1)
max_tokens=500, # সর্বাধিক টোকেন
top_p=0.9, # নিউক্লিয়াস স্যাম্পলিং
frequency_penalty=0.0, # রিপিটেশন পেনাল্টি
presence_penalty=0.0, # নতুন টপিক প্রমোশন
timeout=30, # টাইমআউট (সেকেন্ডে)
api_key=os.getenv("OPENAI_API_KEY")
)
প্যারামিটার বিস্তারিত
- temperature (0-1):
- কম (0.0-0.3): বেশি নির্ভরযোগ্য, ডিটারমিনিস্টিক
- মাঝারি (0.4-0.7): ব্যালেন্সড ক্রিয়েটিভিটি
- বেশি (0.8-1.0): বেশি ক্রিয়েটিভ, র্যান্ডম
- max_tokens:
- আউটপুটের সর্বাধিক দৈর্ঘ্য
- বেশি মান = লম্বা রেসপন্স, বেশি খরচ
- top_p (0-1):
- নিউক্লিয়াস স্যাম্পলিং
- কম মান = বেশি ফোকাসড, বেশি মান = বেশি ডাইভার্স
- frequency_penalty (-2 থেকে 2):
- পজিটিভ মান রিপিটেশন কমায়
- নেগেটিভ মান রিপিটেশন বাড়ায়
- presence_penalty (-2 থেকে 2):
- পজিটিভ মান নতুন টপিক প্রমোট করে
- নেগেটিভ মান একই টপিকে থাকতে উৎসাহিত করে
বিভিন্ন ইউজ কেসের জন্য প্যারামিটার সেটিং
| ইউজ কেস | temperature | max_tokens | top_p | frequency_penalty | presence_penalty |
|---|---|---|---|---|---|
| ফ্যাক্টুয়াল Q&A | 0.0-0.2 | 150-300 | 0.9 | 0.0 | 0.0 |
| ক্রিয়েটিভ রাইটিং | 0.7-1.0 | 500-1000 | 0.9 | 0.0 | 0.0 |
| সামারাইজেশন | 0.3-0.5 | 150-300 | 0.9 | 0.0 | 0.0 |
| কোড জেনারেশন | 0.2-0.4 | 500-1000 | 0.9 | 0.0 | 0.0 |
| ব্রেইনস্টর্মিং | 0.8-1.0 | 300-500 | 0.9 | 0.3 | 0.3 |
| স্ট্রাকচারড আউটপুট | 0.0-0.2 | 500-1000 | 0.9 | 0.0 | 0.0 |
প্যারামিটার এক্সপেরিমেন্ট
বিভিন্ন temperature সেটিং এর প্রভাব দেখি:
# বিভিন্ন temperature সেটিং এর প্রভাব
prompt = "একটি ছোট গল্প লিখুন যেখানে একটি রোবট মানুষের সাথে বন্ধুত্ব করে।"
# কম temperature
low_temp_model = ChatOpenAI(temperature=0.1)
low_temp_response = low_temp_model.invoke([HumanMessage(content=prompt)])
print("কম Temperature (0.1):")
print(low_temp_response.content)
print("\n" + "-"*50 + "\n")
# মাঝারি temperature
mid_temp_model = ChatOpenAI(temperature=0.5)
mid_temp_response = mid_temp_model.invoke([HumanMessage(content=prompt)])
print("মাঝারি Temperature (0.5):")
print(mid_temp_response.content)
print("\n" + "-"*50 + "\n")
# বেশি temperature
high_temp_model = ChatOpenAI(temperature=1.0)
high_temp_response = high_temp_model.invoke([HumanMessage(content=prompt)])
print("বেশি Temperature (1.0):")
print(high_temp_response.content)
প্রম্পট টেমপ্লেট এবং ফরম্যাটিং
গল্প: সুমন বুঝতে পারলেন যে ভাল প্রম্পট লেখা একটি শিল্পের মতো। তিনি ভাবলেন, “এটা যেন একটি রেসিপি লেখার মতো – সঠিক উপাদান এবং নির্দেশনা ছাড়া ভাল খাবার পাওয়া যাবে না।”
LangChain-এ প্রম্পট টেমপ্লেট ব্যবহার করে ডায়নামিক প্রম্পট তৈরি করা যায়:
বেসিক প্রম্পট টেমপ্লেট
from langchain.prompts import PromptTemplate
# সিম্পল প্রম্পট টেমপ্লেট
simple_prompt = PromptTemplate.from_template(
"আমাকে {subject} সম্পর্কে {num_sentences} টি বাক্যে তথ্য দিন।"
)
# প্রম্পট ফরম্যাট করুন
formatted_prompt = simple_prompt.format(subject="সৌরজগত", num_sentences=3)
print("ফরম্যাটেড প্রম্পট:", formatted_prompt)
# LLM কল করুন
response = chat_model.invoke([HumanMessage(content=formatted_prompt)])
print("\nLLM রেসপন্স:")
print(response.content)
কমপ্লেক্স প্রম্পট টেমপ্লেট
# কমপ্লেক্স প্রম্পট টেমপ্লেট
complex_prompt = PromptTemplate.from_template(
"""
আপনি একজন {role} হিসেবে কাজ করছেন।
ব্যবহারকারী: {user_query}
নিম্নলিখিত নির্দেশনা অনুসরণ করুন:
1. {instruction_1}
2. {instruction_2}
3. {instruction_3}
আপনার উত্তর {format} ফরম্যাটে দিন।
"""
)
# প্রম্পট ফরম্যাট করুন
formatted_complex_prompt = complex_prompt.format(
role="বাংলা ভাষার শিক্ষক",
user_query="আমাকে বাংলা ব্যাকরণের নিয়ম সম্পর্কে শেখান",
instruction_1="সহজ ভাষায় ব্যাখ্যা করুন",
instruction_2="উদাহরণ দিন",
instruction_3="অনুশীলনী প্রশ্ন দিন",
format="পয়েন্ট বাই পয়েন্ট"
)
print("কমপ্লেক্স ফরম্যাটেড প্রম্পট:")
print(formatted_complex_prompt)
চ্যাট প্রম্পট টেমপ্লেট
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate
# চ্যাট প্রম্পট টেমপ্লেট
chat_prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template(
"আপনি একজন {role} যিনি {specialty} বিষয়ে বিশেষজ্ঞ।"
),
HumanMessagePromptTemplate.from_template(
"{query}"
)
])
# চ্যাট প্রম্পট ফরম্যাট করুন
formatted_chat_prompt = chat_prompt.format_messages(
role="শিক্ষক",
specialty="বাংলা সাহিত্য",
query="রবীন্দ্রনাথ ঠাকুরের প্রধান কাব্যগ্রন্থগুলি কী কী?"
)
print("ফরম্যাটেড চ্যাট প্রম্পট:")
for message in formatted_chat_prompt:
print(f"{message.type}: {message.content}")
# ChatModel কল করুন
response = chat_model.invoke(formatted_chat_prompt)
print("\nChatModel রেসপন্স:")
print(response.content)
ফিউ-শট লার্নিং প্রম্পট
ফিউ-শট লার্নিং হল LLM-কে উদাহরণ দেখিয়ে শেখানোর একটি কৌশল:
few_shot_prompt = PromptTemplate.from_template(
"""
আপনাকে বাংলা বাক্যের সেন্টিমেন্ট (পজিটিভ/নেগেটিভ/নিউট্রাল) অ্যানালাইসিস করতে হবে।
উদাহরণ:
বাক্য: আজকের খাবারটা খুব মজার ছিল।
সেন্টিমেন্ট: পজিটিভ
বাক্য: বাসে যাত্রা করা খুব কষ্টকর ছিল।
সেন্টিমেন্ট: নেগেটিভ
বাক্য: আমি আজ বাজারে গিয়েছিলাম।
সেন্টিমেন্ট: নিউট্রাল
বাক্য: {input}
সেন্টিমেন্ট:
"""
)
# ফিউ-শট প্রম্পট ব্যবহার করুন
test_sentence = "এই বইটি পড়ে আমি খুব আনন্দিত হয়েছি।"
formatted_few_shot = few_shot_prompt.format(input=test_sentence)
response = llm.invoke(formatted_few_shot)
print(f"বাক্য: {test_sentence}")
print(f"সেন্টিমেন্ট: {response.strip()}")
প্রম্পট টেমপ্লেট বেস্ট প্র্যাকটিস
- স্পষ্ট নির্দেশনা দিন:
আপনি একজন বাংলা ভাষার বিশেষজ্ঞ। নিম্নলিখিত বাক্যের ব্যাকরণগত ভুল সংশোধন করুন এবং কারণ ব্যাখ্যা করুন।
- স্ট্রাকচার প্রদান করুন:
আপনার উত্তর নিম্নলিখিত ফরম্যাটে দিন:
1. সংশোধিত বাক্য:
2. ভুলগুলি:
3. ব্যাখ্যা:
- উদাহরণ দিন (ফিউ-শট):
উদাহরণ:
ইনপুট: আমি বাড়ি যাই।
আউটপুট: এটি সঠিক বাক্য।
ইনপুট: আমি বাড়ি যাইতেছি।
আউটপুট: সংশোধিত বাক্য: আমি বাড়ি যাচ্ছি।
- রোল অ্যাসাইন করুন:
আপনি একজন অভিজ্ঞ বাংলা সাহিত্য শিক্ষক। আপনার কাজ হল...
- আউটপুট ফরম্যাট স্পেসিফাই করুন:
আপনার উত্তর JSON ফরম্যাটে দিন: {"সংশোধিত_বাক্য": "...", "ব্যাখ্যা": "..."}
আউটপুট পার্সার এবং স্ট্রাকচারড আউটপুট
গল্প: সুমন বুঝতে পারলেন যে LLM থেকে টেক্সট পাওয়া ভাল, কিন্তু স্ট্রাকচারড ডাটা পাওয়া আরও ভাল। তিনি ভাবলেন, “এটা যেন একটা রেসিপি থেকে শুধু ইনগ্রেডিয়েন্ট লিস্ট বের করার মতো – আমি পুরো রেসিপি নয়, শুধু লিস্টটাই চাই।”
LangChain-এ আউটপুট পার্সার ব্যবহার করে LLM রেসপন্স থেকে স্ট্রাকচারড ডাটা পাওয়া যায়:
সিম্পল পার্সার
from langchain.output_parsers import CommaSeparatedListOutputParser
# কমা-সেপারেটেড লিস্ট পার্সার
list_parser = CommaSeparatedListOutputParser()
# পার্সার ফরম্যাট ইন্সট্রাকশন
format_instructions = list_parser.get_format_instructions()
# প্রম্পট টেমপ্লেট
list_prompt = PromptTemplate.from_template(
"বাংলাদেশের জনপ্রিয় পাঁচটি খাবারের নাম লিখুন।\n{format_instructions}"
)
# প্রম্পট ফরম্যাট করুন
formatted_list_prompt = list_prompt.format(format_instructions=format_instructions)
print("ফরম্যাটেড লিস্ট প্রম্পট:")
print(formatted_list_prompt)
# LLM কল করুন
response = llm.invoke(formatted_list_prompt)
print("\nLLM রেসপন্স:")
print(response)
# রেসপন্স পার্স করুন
parsed_list = list_parser.parse(response)
print("\nপার্স করা লিস্ট:")
for i, item in enumerate(parsed_list, 1):
print(f"{i}. {item}")
Pydantic পার্সার
Pydantic পার্সার ব্যবহার করে কমপ্লেক্স স্ট্রাকচারড ডাটা পাওয়া যায়:
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List
# আউটপুট মডেল ডিফাইন করুন
class Restaurant(BaseModel):
name: str = Field(description="রেস্টুরেন্টের নাম")
cuisine: str = Field(description="রেস্টুরেন্টের কুইজিন টাইপ")
signature_dish: str = Field(description="রেস্টুরেন্টের সিগনেচার ডিশ")
price_range: str = Field(description="রেস্টুরেন্টের প্রাইস রেঞ্জ (সাশ্রয়ী/মধ্যম/উচ্চ)")
location: str = Field(description="রেস্টুরেন্টের লোকেশন")
# পার্সার তৈরি করুন
pydantic_parser = PydanticOutputParser(pydantic_object=Restaurant)
# পার্সার ফরম্যাট ইন্সট্রাকশন
format_instructions = pydantic_parser.get_format_instructions()
# প্রম্পট টেমপ্লেট
restaurant_prompt = PromptTemplate.from_template(
"""
ঢাকার একটি জনপ্রিয় রেস্টুরেন্ট সম্পর্কে তথ্য দিন।
{format_instructions}
"""
)
# প্রম্পট ফরম্যাট করুন
formatted_restaurant_prompt = restaurant_prompt.format(format_instructions=format_instructions)
print("ফরম্যাটেড রেস্টুরেন্ট প্রম্পট:")
print(formatted_restaurant_prompt)
# LLM কল করুন
response = llm.invoke(formatted_restaurant_prompt)
print("\nLLM রেসপন্স:")
print(response)
# রেসপন্স পার্স করুন
try:
parsed_restaurant = pydantic_parser.parse(response)
print("\nপার্স করা রেস্টুরেন্ট:")
print(f"নাম: {parsed_restaurant.name}")
print(f"কুইজিন: {parsed_restaurant.cuisine}")
print(f"সিগনেচার ডিশ: {parsed_restaurant.signature_dish}")
print(f"প্রাইস রেঞ্জ: {parsed_restaurant.price_range}")
print(f"লোকেশন: {parsed_restaurant.location}")
except Exception as e:
print(f"পার্সিং এরর: {str(e)}")
print("অরিজিনাল রেসপন্স:")
print(response)
স্ট্রাকচারড আউটপুট ফরম্যাট
LangChain বিভিন্ন ফরম্যাটে স্ট্রাকচারড আউটপুট সাপোর্ট করে:
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
# রেসপন্স স্কিমা ডিফাইন করুন
response_schemas = [
ResponseSchema(name="book_title", description="বইয়ের শিরোনাম"),
ResponseSchema(name="author", description="লেখকের নাম"),
ResponseSchema(name="publication_year", description="প্রকাশনার বছর"),
ResponseSchema(name="genre", description="বইয়ের জনরা"),
ResponseSchema(name="summary", description="বইয়ের সংক্ষিপ্ত সারাংশ")
]
# স্ট্রাকচারড আউটপুট পার্সার তৈরি করুন
structured_parser = StructuredOutputParser.from_response_schemas(response_schemas)
# পার্সার ফরম্যাট ইন্সট্রাকশন
format_instructions = structured_parser.get_format_instructions()
# প্রম্পট টেমপ্লেট
book_prompt = PromptTemplate.from_template(
"""
বাংলা সাহিত্যের একটি বিখ্যাত বই সম্পর্কে তথ্য দিন।
{format_instructions}
"""
)
# প্রম্পট ফরম্যাট করুন
formatted_book_prompt = book_prompt.format(format_instructions=format_instructions)
print("ফরম্যাটেড বই প্রম্পট:")
print(formatted_book_prompt)
# LLM কল করুন
response = llm.invoke(formatted_book_prompt)
print("\nLLM রেসপন্স:")
print(response)
# রেসপন্স পার্স করুন
try:
parsed_book = structured_parser.parse(response)
print("\nপার্স করা বই তথ্য:")
for key, value in parsed_book.items():
print(f"{key}: {value}")
except Exception as e:
print(f"পার্সিং এরর: {str(e)}")
print("অরিজিনাল রেসপন্স:")
print(response)
JSON মোড
OpenAI মডেলের JSON মোড ব্যবহার করে স্ট্রাকচারড আউটপুট পাওয়া যায়:
from langchain_openai import ChatOpenAI
# JSON মোড সহ ChatOpenAI
json_model = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0,
response_format={"type": "json_object"}
)
# JSON প্রম্পট
json_prompt = """
বাংলাদেশের তিনটি জনপ্রিয় পর্যটন স্থান সম্পর্কে তথ্য দিন।
প্রতিটি পর্যটন স্থানের জন্য নিম্নলিখিত তথ্য দিন:
- নাম
- অবস্থান
- বিখ্যাত আকর্ষণ
- ভ্রমণের সেরা সময়
আপনার উত্তর JSON ফরম্যাটে দিন।
"""
# JSON মডেল কল করুন
json_response = json_model.invoke([HumanMessage(content=json_prompt)])
print("JSON রেসপন্স:")
print(json_response.content)
# JSON পার্স করুন
import json
try:
parsed_json = json.loads(json_response.content)
print("\nপার্স করা JSON:")
print(json.dumps(parsed_json, indent=2, ensure_ascii=False))
except json.JSONDecodeError as e:
print(f"JSON পার্সিং এরর: {str(e)}")
প্র্যাকটিকাল এক্সারসাইজ: বাংলা টেক্সট অ্যানালাইজার
এখন আমরা আমাদের শেখা সবকিছু একত্রিত করে একটি বাংলা টেক্সট অ্যানালাইজার তৈরি করব:
# bengali_text_analyzer.py
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List
from dotenv import load_dotenv
import os
# .env ফাইল থেকে API কি লোড করুন
load_dotenv()
# আউটপুট মডেল ডিফাইন করুন
class TextAnalysis(BaseModel):
summary: str = Field(description="টেক্সটের সংক্ষিপ্ত সারাংশ (2-3 বাক্য)")
sentiment: str = Field(description="টেক্সটের সেন্টিমেন্ট (পজিটিভ/নেগেটিভ/নিউট্রাল)")
topics: List[str] = Field(description="টেক্সটে আলোচিত প্রধান টপিকগুলি")
formal_rating: int = Field(description="টেক্সটের আনুষ্ঠানিকতার মাত্রা (1-5 স্কেল, 5 = অত্যন্ত আনুষ্ঠানিক)")
complexity: int = Field(description="টেক্সটের জটিলতার মাত্রা (1-5 স্কেল, 5 = অত্যন্ত জটিল)")
suggestions: List[str] = Field(description="টেক্সট উন্নত করার জন্য পরামর্শ")
class BengaliTextAnalyzer:
def __init__(self, model_name="gpt-3.5-turbo", temperature=0):
"""
বাংলা টেক্সট অ্যানালাইজার ইনিশিয়ালাইজ করুন
"""
self.chat_model = ChatOpenAI(
model=model_name,
temperature=temperature,
api_key=os.getenv("OPENAI_API_KEY")
)
# আউটপুট পার্সার সেটআপ করুন
self.parser = PydanticOutputParser(pydantic_object=TextAnalysis)
# চ্যাট প্রম্পট টেমপ্লেট সেটআপ করুন
self.prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template(
"""
আপনি একজন বাংলা ভাষা বিশেষজ্ঞ যিনি টেক্সট অ্যানালাইসিসে দক্ষ।
আপনার কাজ হল বাংলা টেক্সট অ্যানালাইসিস করা এবং নির্দিষ্ট ফরম্যাটে আউটপুট দেওয়া।
{format_instructions}
"""
),
HumanMessagePromptTemplate.from_template(
"""
নিম্নলিখিত বাংলা টেক্সট অ্যানালাইসিস করুন:
{text}
"""
)
])
def analyze(self, text):
"""
বাংলা টেক্সট অ্যানালাইসিস করুন
Args:
text (str): অ্যানালাইসিস করার টেক্সট
Returns:
dict: অ্যানালাইসিস রেজাল্ট
"""
try:
# প্রম্পট ফরম্যাট করুন
formatted_prompt = self.prompt.format_messages(
format_instructions=self.parser.get_format_instructions(),
text=text
)
# মডেল কল করুন
response = self.chat_model.invoke(formatted_prompt)
# রেসপন্স পার্স করুন
parsed_response = self.parser.parse(response.content)
return {
"success": True,
"analysis": parsed_response
}
except Exception as e:
return {
"success": False,
"error": str(e),
"raw_response": response.content if 'response' in locals() else None
}
# টেক্সট অ্যানালাইজার ব্যবহার করুন
if __name__ == "__main__":
analyzer = BengaliTextAnalyzer()
print("বাংলা টেক্সট অ্যানালাইজার")
print("=" * 50)
# টেস্ট টেক্সট
test_text = """
বাংলাদেশ একটি প্রাকৃতিক সৌন্দর্যে ভরপুর দেশ। এখানে রয়েছে সবুজ মাঠ, নদী, পাহাড় এবং সমুদ্র সৈকত।
বাংলাদেশের অর্থনীতি মূলত কৃষি নির্ভর, তবে গার্মেন্টস শিল্প এবং রেমিট্যান্স এর অবদান ক্রমশ বাড়ছে।
দেশের জনসংখ্যা বৃদ্ধি একটি বড় সমস্যা, তবে সরকার বিভিন্ন উন্নয়ন প্রকল্প বাস্তবায়ন করছে।
শিক্ষার হার বাড়ছে এবং ডিজিটাল বাংলাদেশ গড়ার লক্ষ্যে অনেক পদক্ষেপ নেওয়া হয়েছে।
"""
print("অ্যানালাইসিস করা হচ্ছে...")
result = analyzer.analyze(test_text)
if result["success"]:
analysis = result["analysis"]
print("\nঅ্যানালাইসিস রেজাল্ট:")
print("-" * 50)
print(f"সারাংশ: {analysis.summary}")
print(f"সেন্টিমেন্ট: {analysis.sentiment}")
print(f"টপিকস: {', '.join(analysis.topics)}")
print(f"আনুষ্ঠানিকতা: {analysis.formal_rating}/5")
print(f"জটিলতা: {analysis.complexity}/5")
print("\nপরামর্শ:")
for i, suggestion in enumerate(analysis.suggestions, 1):
print(f"{i}. {suggestion}")
else:
print(f"এরর: {result['error']}")
if result["raw_response"]:
print("\nরেসপন্স:")
print(result["raw_response"])
সারাংশ
এই টিউটোরিয়ালে, আমরা শিখেছি:
- LLM vs ChatModel ক্লাস: কখন কোনটি ব্যবহার করবেন এবং তাদের মধ্যে পার্থক্য
- বিভিন্ন মডেল প্রোভাইডার: OpenAI, Anthropic, Hugging Face, Google-এর মডেল ব্যবহার
- মডেল প্যারামিটার: temperature, max_tokens, top_p ইত্যাদি প্যারামিটার সেটিং
- প্রম্পট টেমপ্লেট এবং ফরম্যাটিং: ডায়নামিক প্রম্পট তৈরি করা
- আউটপুট পার্সার এবং স্ট্রাকচারড আউটপুট: LLM রেসপন্স থেকে স্ট্রাকচারড ডাটা পাওয়া
অতিরিক্ত অনুশীলনী
- মাল্টি-প্রোভাইডার সাপোর্ট: বাংলা টেক্সট অ্যানালাইজারে বিভিন্ন মডেল প্রোভাইডার (OpenAI, Anthropic, Hugging Face) সাপোর্ট যোগ করুন।
- কাস্টম আউটপুট ফরম্যাট: বিভিন্ন ধরনের অ্যানালাইসিসের জন্য কাস্টম আউটপুট ফরম্যাট তৈরি করুন (সেন্টিমেন্ট অ্যানালাইসিস, টপিক এক্সট্র্যাকশন, সামারাইজেশন)।
- প্রম্পট অপ্টিমাইজেশন: বিভিন্ন প্রম্পট ভেরিয়েশন তৈরি করুন এবং কোনটি সবচেয়ে ভাল রেজাল্ট দেয় তা পরীক্ষা করুন।
- মডেল প্যারামিটার টিউনিং: বিভিন্ন temperature, top_p, এবং অন্যান্য প্যারামিটার সেটিং এক্সপেরিমেন্ট করুন এবং রেজাল্ট তুলনা করুন।
- ওয়েব ইন্টারফেস: Flask বা Streamlit ব্যবহার করে বাংলা টেক্সট অ্যানালাইজারের জন্য একটি সিম্পল ওয়েব ইন্টারফেস তৈরি করুন।
পরবর্তী ধাপ
পরবর্তী টিউটোরিয়ালে, আমরা LangChain-এর চেইন এবং মেমোরি নিয়ে আলোচনা করব। আমরা শিখব কিভাবে বিভিন্ন কম্পোনেন্ট একত্রিত করে কমপ্লেক্স ওয়ার্কফ্লো তৈরি করতে হয় এবং কিভাবে কনভার্সেশন হিস্টোরি মনে রাখতে হয়।
উপসংহার
আজকের টিউটোরিয়ালে, আমরা LangChain-এ মডেল, প্রম্পট এবং পার্সার সম্পর্কে বিস্তারিত জেনেছি। আমরা দেখেছি কিভাবে বিভিন্ন মডেল ক্লাস ব্যবহার করতে হয়, কিভাবে প্রম্পট টেমপ্লেট তৈরি করতে হয়, এবং কিভাবে AI আউটপুট থেকে স্ট্রাকচারড ডাটা পেতে হয়।
এই ফাউন্ডেশন ব্যবহার করে, আপনি এখন আরও জটিল LangChain অ্যাপ্লিকেশন তৈরি করতে পারেন। মনে রাখবেন, ভাল প্রম্পট ডিজাইন এবং সঠিক মডেল সেটিং LLM অ্যাপ্লিকেশনের সাফল্যের জন্য অত্যন্ত গুরুত্বপূর্ণ।
আপনার অনুশীলনের জন্য, আমি আপনাকে উৎসাহিত করি বিভিন্ন মডেল, প্রম্পট এবং পার্সার এক্সপেরিমেন্ট করতে এবং আপনার নিজের প্রয়োজন অনুযায়ী কাস্টমাইজ করতে।
ধন্যবাদ এবং শুভকামনা আপনার LangChain যাত্রায়!