1. Home
  2. LangChain
  3. Basic
  4. ১.৪: প্রথম LangChain অ্যাপ্লিকেশন

১.৪: প্রথম LangChain অ্যাপ্লিকেশন

টিউটোরিয়াল ১.৪: প্রথম লাংচেইন অ্যাপ্লিকেশন

ভূমিকা

আমাদের আগের টিউটোরিয়ালগুলিতে আমরা ডেভেলপমেন্ট এনভায়রনমেন্ট সেটআপ এবং LLM API কনফিগারেশন সম্পর্কে শিখেছি। এখন আমরা আমাদের প্রথম লাংচেইন অ্যাপ্লিকেশন তৈরি করব। এই টিউটোরিয়ালে আমরা শিখব:

  1. বেসিক LLM ইন্টারফেসিং
  2. সিম্পল প্রম্পট তৈরি করা
  3. LLM রেসপন্স পার্স করা
  4. প্র্যাকটিকাল এক্সারসাইজ: সিম্পল Q&A সিস্টেম

আসুন শুরু করি!

১. বেসিক LLM ইন্টারফেসিং

লাংচেইন LLM-এর সাথে ইন্টারফেস করার জন্য একটি সহজ এবং স্ট্যান্ডার্ডাইজড ইন্টারফেস প্রদান করে। এটি আমাদেরকে বিভিন্ন LLM প্রোভাইডার (OpenAI, Hugging Face, ইত্যাদি) ব্যবহার করতে সাহায্য করে একই কোডবেস ব্যবহার করে।

LLM ক্লাস পরিচিতি

লাংচেইনে, LLM ক্লাস হল মূল ইন্টারফেস যা টেক্সট-টু-টেক্সট মডেল রেপ্রেজেন্ট করে। এটি একটি প্রম্পট নেয় এবং একটি স্ট্রিং রিটার্ন করে।

প্রথম LLM অ্যাপ্লিকেশন

আসুন একটি সিম্পল অ্যাপ্লিকেশন তৈরি করি যা OpenAI LLM ব্যবহার করে:

from langchain.llms import OpenAI
from dotenv import load_dotenv
import os

# .env ফাইল থেকে এনভায়রনমেন্ট ভেরিয়েবল লোড করুন
load_dotenv()

# OpenAI LLM ইনিশিয়ালাইজ করুন
llm = OpenAI(
    temperature=0.7,
    model_name="gpt-3.5-turbo-instruct"
)

# সিম্পল প্রম্পট রান করুন
prompt = "বাংলাদেশের জাতীয় ফুলের নাম কি?"
response = llm(prompt)

print(f"প্রম্পট: {prompt}")
print(f"রেসপন্স: {response}")

বিভিন্ন LLM প্যারামিটার

LLM ইনিশিয়ালাইজ করার সময় আমরা বিভিন্ন প্যারামিটার সেট করতে পারি:

# বিভিন্ন প্যারামিটার সহ LLM
creative_llm = OpenAI(
    temperature=0.9,  # উচ্চ ক্রিয়েটিভিটি
    model_name="gpt-3.5-turbo-instruct",
    max_tokens=500,  # লম্বা রেসপন্স
    top_p=0.95,
    frequency_penalty=0.5,  # কম রিপিটেশন
    presence_penalty=0.5
)

factual_llm = OpenAI(
    temperature=0.1,  # লো ক্রিয়েটিভিটি, বেশি ফ্যাকচুয়াল
    model_name="gpt-3.5-turbo-instruct",
    max_tokens=200,  # ছোট রেসপন্স
    top_p=0.5,
    frequency_penalty=0.0,
    presence_penalty=0.0
)

মাল্টিপল প্রম্পট প্রসেসিং

একাধিক প্রম্পট প্রসেস করতে, আমরা generate মেথড ব্যবহার করতে পারি:

# একাধিক প্রম্পট প্রসেস করা
prompts = [
    "বাংলাদেশের রাজধানী কোনটি?",
    "বাংলাদেশের জাতীয় পাখি কি?",
    "বাংলাদেশের জাতীয় ফল কি?"
]

# একাধিক প্রম্পট জেনারেট করুন
results = llm.generate(prompts)

# রেজাল্ট প্রসেস করুন
for i, generation in enumerate(results.generations):
    print(f"প্রম্পট {i+1}: {prompts[i]}")
    print(f"রেসপন্স {i+1}: {generation[0].text}")
    print("-" * 50)

# টোকেন ব্যবহার দেখুন
print(f"টোটাল টোকেন ব্যবহার: {results.llm_output['token_usage']['total_tokens']}")

চ্যাট মডেল ব্যবহার করা

OpenAI এর চ্যাট মডেল (gpt-3.5-turbo, gpt-4) ব্যবহার করতে, আমরা ChatOpenAI ক্লাস ব্যবহার করতে পারি:

from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage, AIMessage

# চ্যাট মডেল ইনিশিয়ালাইজ করুন
chat_model = ChatOpenAI(
    temperature=0.7,
    model_name="gpt-3.5-turbo"
)

# চ্যাট মেসেজ তৈরি করুন
messages = [
    SystemMessage(content="আপনি একজন সহায়ক AI অ্যাসিস্ট্যান্ট যিনি বাংলাদেশ সম্পর্কে বিশেষজ্ঞ।"),
    HumanMessage(content="বাংলাদেশের ঐতিহাসিক স্থান সম্পর্কে আমাকে বলুন।")
]

# চ্যাট মডেল রান করুন
response = chat_model(messages)
print(response.content)

# কনভারসেশন কন্টিনিউ করুন
messages.append(AIMessage(content=response.content))
messages.append(HumanMessage(content="এর মধ্যে সবচেয়ে পুরাতন স্থানটি কোনটি?"))

response = chat_model(messages)
print(response.content)

২. সিম্পল প্রম্পট তৈরি করা

প্রম্পট ইঞ্জিনিয়ারিং হল LLM থেকে ভাল রেজাল্ট পাওয়ার একটি গুরুত্বপূর্ণ অংশ। লাংচেইন প্রম্পট ম্যানেজ করার জন্য PromptTemplate ক্লাস প্রদান করে।

বেসিক প্রম্পট টেমপ্লেট

from langchain.prompts import PromptTemplate

# সিম্পল প্রম্পট টেমপ্লেট তৈরি করুন
template = "আমাকে {country} দেশের রাজধানী সম্পর্কে বলুন।"
prompt_template = PromptTemplate.from_template(template)

# প্রম্পট জেনারেট করুন
prompt = prompt_template.format(country="বাংলাদেশ")
print(prompt)

# LLM-এ প্রম্পট পাঠান
response = llm(prompt)
print(response)

মাল্টিপল ভেরিয়েবল সহ প্রম্পট টেমপ্লেট

# মাল্টিপল ভেরিয়েবল সহ প্রম্পট টেমপ্লেট
multi_var_template = PromptTemplate(
    input_variables=["country", "topic"],
    template="{country} দেশের {topic} সম্পর্কে আমাকে বিস্তারিত তথ্য দিন।"
)

# প্রম্পট জেনারেট করুন
prompt = multi_var_template.format(
    country="বাংলাদেশ",
    topic="সংস্কৃতি"
)
print(prompt)

# LLM-এ প্রম্পট পাঠান
response = llm(prompt)
print(response)

ফিউ-শট লার্নিং প্রম্পট

ফিউ-শট লার্নিং হল LLM-কে কয়েকটি উদাহরণ দেখিয়ে একটি নির্দিষ্ট ফরম্যাটে রেসপন্স দেওয়ার জন্য প্রশিক্ষণ দেওয়া।

# ফিউ-শট লার্নিং প্রম্পট টেমপ্লেট
few_shot_template = """আমি আপনাকে কিছু শব্দ দেব, আপনি সেগুলির বাংলা অর্থ দিন।

শব্দ: Apple
অর্থ: আপেল

শব্দ: Book
অর্থ: বই

শব্দ: Computer
অর্থ: কম্পিউটার

শব্দ: {word}
অর্থ:"""

few_shot_prompt = PromptTemplate.from_template(few_shot_template)

# প্রম্পট জেনারেট করুন
prompt = few_shot_prompt.format(word="Elephant")
print(prompt)

# LLM-এ প্রম্পট পাঠান
response = llm(prompt)
print(response)

চ্যাট প্রম্পট টেমপ্লেট

চ্যাট মডেলের জন্য, আমরা ChatPromptTemplate ব্যবহার করতে পারি:

from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate

# সিস্টেম এবং হিউম্যান মেসেজ টেমপ্লেট তৈরি করুন
system_template = "আপনি একজন {role} যিনি {topic} সম্পর্কে বিশেষজ্ঞ।"
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)

human_template = "{question}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

# চ্যাট প্রম্পট টেমপ্লেট তৈরি করুন
chat_prompt = ChatPromptTemplate.from_messages([
    system_message_prompt,
    human_message_prompt
])

# প্রম্পট জেনারেট করুন
messages = chat_prompt.format_messages(
    role="ইতিহাসবিদ",
    topic="বাংলাদেশের মুক্তিযুদ্ধ",
    question="১৯৭১ সালে বাংলাদেশের মুক্তিযুদ্ধের প্রধান ঘটনাগুলি কী কী ছিল?"
)

# চ্যাট মডেলে প্রম্পট পাঠান
response = chat_model(messages)
print(response.content)

৩. LLM রেসপন্স পার্স করা

LLM থেকে প্রাপ্ত রেসপন্স প্রায়ই স্ট্রাকচার্ড ফরম্যাটে পার্স করতে হয়। লাংচেইন এই কাজটি সহজ করার জন্য বিভিন্ন টুল প্রদান করে।

বেসিক রেসপন্স পার্সিং

# সিম্পল রেসপন্স পার্সিং
response_text = llm("বাংলাদেশের ৫টি বিখ্যাত পর্যটন স্পট লিস্ট আকারে দিন")

# লাইন-বাই-লাইন পার্স করুন
tourist_spots = [spot.strip() for spot in response_text.split("\n") if spot.strip()]
print("পর্যটন স্পট:")
for i, spot in enumerate(tourist_spots, 1):
    print(f"{i}. {spot}")

স্ট্রাকচার্ড আউটপুট পার্সিং

লাংচেইনের OutputParser ব্যবহার করে আমরা LLM আউটপুট স্ট্রাকচার্ড ফরম্যাটে পার্স করতে পারি:

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List

# আউটপুট মডেল ডিফাইন করুন
class TouristDestination(BaseModel):
    name: str = Field(description="পর্যটন স্পটের নাম")
    location: str = Field(description="পর্যটন স্পটের অবস্থান (জেলা)")
    description: str = Field(description="পর্যটন স্পট সম্পর্কে সংক্ষিপ্ত বিবরণ")

class TouristGuide(BaseModel):
    destinations: List[TouristDestination] = Field(description="পর্যটন স্পটের তালিকা")

# আউটপুট পার্সার তৈরি করুন
parser = PydanticOutputParser(pydantic_object=TouristGuide)

# পার্সার ফরম্যাট ইনস্ট্রাকশন পান
format_instructions = parser.get_format_instructions()

# প্রম্পট টেমপ্লেট তৈরি করুন
template = """বাংলাদেশের {num_spots}টি বিখ্যাত পর্যটন স্পট সম্পর্কে তথ্য দিন।

{format_instructions}"""

prompt_template = PromptTemplate(
    template=template,
    input_variables=["num_spots"],
    partial_variables={"format_instructions": format_instructions}
)

# প্রম্পট জেনারেট করুন
prompt = prompt_template.format(num_spots=3)

# LLM-এ প্রম্পট পাঠান
response = llm(prompt)

# রেসপন্স পার্স করুন
try:
    output = parser.parse(response)
    print("পার্স করা আউটপুট:")
    for dest in output.destinations:
        print(f"নাম: {dest.name}")
        print(f"অবস্থান: {dest.location}")
        print(f"বিবরণ: {dest.description}")
        print("-" * 50)
except Exception as e:
    print(f"পার্সিং এরর: {e}")
    print("রো রেসপন্স:")
    print(response)

JSON রেসপন্স পার্সিং

from langchain.output_parsers import JsonOutputParser

# JSON আউটপুট পার্সার তৈরি করুন
json_parser = JsonOutputParser()

# প্রম্পট টেমপ্লেট তৈরি করুন
json_template = """বাংলাদেশের {num_spots}টি বিখ্যাত পর্যটন স্পট সম্পর্কে তথ্য দিন।

প্রতিটি পর্যটন স্পটের জন্য নাম, অবস্থান, এবং বিবরণ দিন।

আপনার রেসপন্স অবশ্যই JSON ফরম্যাটে হতে হবে, যেখানে একটি "destinations" অ্যারে থাকবে, এবং প্রতিটি আইটেমে "name", "location", এবং "description" ফিল্ড থাকবে।

JSON ফরম্যাট:

json
{{
“destinations”: [
{{
“name”: “পর্যটন স্পটের নাম”,
“location”: “অবস্থান”,
“description”: “বিবরণ”
}}
]
}}

json_prompt_template = PromptTemplate(
    template=json_template,
    input_variables=["num_spots"]
)

# প্রম্পট জেনারেট করুন
json_prompt = json_prompt_template.format(num_spots=3)

# LLM-এ প্রম্পট পাঠান
json_response = llm(json_prompt)

# রেসপন্স পার্স করুন
try:
    parsed_json = json_parser.parse(json_response)
    print("পার্স করা JSON:")
    for dest in parsed_json["destinations"]:
        print(f"নাম: {dest['name']}")
        print(f"অবস্থান: {dest['location']}")
        print(f"বিবরণ: {dest['description']}")
        print("-" * 50)
except Exception as e:
    print(f"JSON পার্সিং এরর: {e}")
    print("রো রেসপন্স:")
    print(json_response)

রেসপন্স ভ্যালিডেশন

from langchain.output_parsers import OutputFixingParser

# ভ্যালিডেশন এবং ফিক্সিং
try:
    output = parser.parse(response)
except Exception as e:
    print(f"পার্সিং এরর: {e}")

    # আউটপুট ফিক্সিং পার্সার ব্যবহার করুন
    fixing_parser = OutputFixingParser.from_llm(parser=parser, llm=llm)

    try:
        fixed_output = fixing_parser.parse(response)
        print("ফিক্স করা আউটপুট:")
        for dest in fixed_output.destinations:
            print(f"নাম: {dest.name}")
            print(f"অবস্থান: {dest.location}")
            print(f"বিবরণ: {dest.description}")
            print("-" * 50)
    except Exception as e2:
        print(f"ফিক্সিং এরর: {e2}")
        print("রো রেসপন্স:")
        print(response)

৪. সিম্পল চেইন তৈরি করা

লাংচেইনের একটি মূল কনসেপ্ট হল “চেইন” – যা বিভিন্ন কম্পোনেন্ট একসাথে সংযুক্ত করে একটি পাইপলাইন তৈরি করে।

বেসিক LLM চেইন

from langchain.chains import LLMChain

# প্রম্পট টেমপ্লেট তৈরি করুন
template = "{country} দেশের {topic} সম্পর্কে আমাকে বিস্তারিত তথ্য দিন।"
prompt_template = PromptTemplate.from_template(template)

# LLM চেইন তৈরি করুন
chain = LLMChain(
    llm=llm,
    prompt=prompt_template
)

# চেইন রান করুন
response = chain.run(country="বাংলাদেশ", topic="ঐতিহাসিক স্থান")
print(response)

# অথবা, ডিকশনারি ব্যবহার করে
response = chain({"country": "বাংলাদেশ", "topic": "খাবার"})
print(response["text"])

সিকোয়েনশিয়াল চেইন

from langchain.chains import SimpleSequentialChain, SequentialChain

# প্রথম চেইন: দেশের তথ্য জেনারেট করে
country_template = "আমাকে {country} দেশের সংক্ষিপ্ত পরিচিতি দিন।"
country_prompt = PromptTemplate.from_template(country_template)
country_chain = LLMChain(llm=llm, prompt=country_prompt, output_key="country_info")

# দ্বিতীয় চেইন: দেশের তথ্য থেকে পর্যটন গাইড তৈরি করে
tourism_template = """নিচের দেশের তথ্য পড়ুন এবং একটি পর্যটন গাইড তৈরি করুন:

{country_info}

উপরের তথ্য ব্যবহার করে, একটি ৩ দিনের ট্যুর প্ল্যান তৈরি করুন।
"""
tourism_prompt = PromptTemplate.from_template(tourism_template)
tourism_chain = LLMChain(llm=llm, prompt=tourism_prompt, output_key="tour_plan")

# সিকোয়েনশিয়াল চেইন তৈরি করুন
sequential_chain = SequentialChain(
    chains=[country_chain, tourism_chain],
    input_variables=["country"],
    output_variables=["country_info", "tour_plan"],
    verbose=True
)

# চেইন রান করুন
result = sequential_chain({"country": "বাংলাদেশ"})
print("দেশের তথ্য:")
print(result["country_info"])
print("\nট্যুর প্ল্যান:")
print(result["tour_plan"])

সিম্পল সিকোয়েনশিয়াল চেইন

# সিম্পল সিকোয়েনশিয়াল চেইন (শুধুমাত্র একটি ইনপুট এবং একটি আউটপুট)
first_chain = LLMChain(llm=llm, prompt=country_prompt)
second_chain = LLMChain(llm=llm, prompt=tourism_prompt)

simple_sequential_chain = SimpleSequentialChain(
    chains=[first_chain, second_chain],
    verbose=True
)

# চেইন রান করুন
response = simple_sequential_chain.run("বাংলাদেশ")
print(response)

৫. প্র্যাকটিকাল এক্সারসাইজ: সিম্পল Q&A সিস্টেম

এখন আমরা একটি সিম্পল Q&A সিস্টেম তৈরি করব যা ইউজারের প্রশ্নের উত্তর দিতে পারে।

বেসিক Q&A সিস্টেম

from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory

# কনভারসেশন মেমরি তৈরি করুন
memory = ConversationBufferMemory()

# কনভারসেশন চেইন তৈরি করুন
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# প্রথম প্রশ্ন
response = conversation.predict(input="বাংলাদেশের রাজধানী কোনটি?")
print(response)

# দ্বিতীয় প্রশ্ন (কনটেক্সট মনে রাখবে)
response = conversation.predict(input="এটি কবে থেকে রাজধানী হয়েছে?")
print(response)

# তৃতীয় প্রশ্ন
response = conversation.predict(input="বাংলাদেশের আগের রাজধানী কি ছিল?")
print(response)

# মেমরি দেখুন
print("\nকনভারসেশন হিস্টোরি:")
print(memory.buffer)

টেমপ্লেট-ভিত্তিক Q&A সিস্টেম

# কাস্টম টেমপ্লেট সহ Q&A সিস্টেম
template = """আপনি একজন সহায়ক AI অ্যাসিস্ট্যান্ট যিনি বাংলাদেশ সম্পর্কে বিশেষজ্ঞ।

আপনার কাজ হল ইউজারের প্রশ্নের সঠিক এবং বিস্তারিত উত্তর দেওয়া।
আপনার উত্তর অবশ্যই বাংলা ভাষায় হতে হবে।

আগের কথোপকথন:
{history}

ইউজারের প্রশ্ন: {input}
আপনার উত্তর:"""

# কাস্টম প্রম্পট টেমপ্লেট সহ কনভারসেশন
custom_prompt = PromptTemplate(
    input_variables=["history", "input"],
    template=template
)

# কাস্টম কনভারসেশন চেইন
custom_conversation = ConversationChain(
    llm=llm,
    prompt=custom_prompt,
    memory=ConversationBufferMemory(),
    verbose=True
)

# প্রশ্ন জিজ্ঞাসা করুন
response = custom_conversation.predict(input="বাংলাদেশের প্রধান নদীগুলি কী কী?")
print(response)

response = custom_conversation.predict(input="এই নদীগুলির মধ্যে সবচেয়ে বড় নদী কোনটি?")
print(response)

ইন্টারেক্টিভ Q&A সিস্টেম

আসুন একটি সিম্পল ইন্টারেক্টিভ Q&A সিস্টেম তৈরি করি:

def interactive_qa():
    # কনভারসেশন চেইন তৈরি করুন
    conversation = ConversationChain(
        llm=llm,
        memory=ConversationBufferMemory(),
        verbose=False
    )

    print("বাংলাদেশ সম্পর্কে Q&A সিস্টেম")
    print("প্রশ্ন জিজ্ঞাসা করুন, বের হতে 'exit' টাইপ করুন")
    print("=" * 50)

    while True:
        user_input = input("\nআপনার প্রশ্ন: ")

        if user_input.lower() == 'exit':
            print("ধন্যবাদ! আবার দেখা হবে।")
            break

        # প্রশ্নের উত্তর পান
        response = conversation.predict(input=user_input)
        print("\nউত্তর:", response)

# ইন্টারেক্টিভ Q&A সিস্টেম রান করুন
interactive_qa()

ডোমেইন-স্পেসিফিক Q&A সিস্টেম

আমরা একটি ডোমেইন-স্পেসিফিক Q&A সিস্টেম তৈরি করতে পারি যা নির্দিষ্ট বিষয়ে বিশেষজ্ঞ:

def create_domain_expert(domain, domain_description):
    # ডোমেইন এক্সপার্ট টেমপ্লেট
    template = f"""আপনি একজন {domain} বিশেষজ্ঞ। {domain_description}

আপনার কাজ হল ইউজারের প্রশ্নের সঠিক এবং বিস্তারিত উত্তর দেওয়া।
আপনার উত্তর অবশ্যই বাংলা ভাষায় হতে হবে।

আগের কথোপকথন:
{{history}}

ইউজারের প্রশ্ন: {{input}}
আপনার উত্তর:"""

    # কাস্টম প্রম্পট টেমপ্লেট
    domain_prompt = PromptTemplate(
        input_variables=["history", "input"],
        template=template
    )

    # ডোমেইন এক্সপার্ট কনভারসেশন চেইন
    domain_expert = ConversationChain(
        llm=llm,
        prompt=domain_prompt,
        memory=ConversationBufferMemory(),
        verbose=False
    )

    return domain_expert

# বাংলাদেশের ইতিহাস বিশেষজ্ঞ তৈরি করুন
history_expert = create_domain_expert(
    domain="বাংলাদেশের ইতিহাস",
    domain_description="আপনি বাংলাদেশের ইতিহাস সম্পর্কে গভীর জ্ঞান রাখেন, বিশেষ করে মুক্তিযুদ্ধ, প্রাচীন বাংলার ইতিহাস, এবং বাংলাদেশের রাজনৈতিক ইতিহাস সম্পর্কে।"
)

# বাংলাদেশের ভূগোল বিশেষজ্ঞ তৈরি করুন
geography_expert = create_domain_expert(
    domain="বাংলাদেশের ভূগোল",
    domain_description="আপনি বাংলাদেশের ভূগোল সম্পর্কে গভীর জ্ঞান রাখেন, বিশেষ করে নদী, পাহাড়, জলবায়ু, এবং প্রাকৃতিক সম্পদ সম্পর্কে।"
)

# ইতিহাস বিশেষজ্ঞকে প্রশ্ন করুন
history_response = history_expert.predict(input="১৯৭১ সালের মুক্তিযুদ্ধের প্রধান সেক্টরগুলি কী কী ছিল?")
print("ইতিহাস বিশেষজ্ঞের উত্তর:")
print(history_response)
print("=" * 50)

# ভূগোল বিশেষজ্ঞকে প্রশ্ন করুন
geography_response = geography_expert.predict(input="বাংলাদেশের প্রধান নদীগুলি কোন কোন দেশ থেকে উৎপন্ন হয়েছে?")
print("ভূগোল বিশেষজ্ঞের উত্তর:")
print(geography_response)

মাল্টি-ডোমেইন Q&A সিস্টেম

আমরা একটি মাল্টি-ডোমেইন Q&A সিস্টেম তৈরি করতে পারি যা প্রশ্নের ধরন অনুযায়ী সঠিক এক্সপার্টকে রাউট করে:

from langchain.chains.router import MultiPromptChain
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.prompts import PromptTemplate

# ডোমেইন এক্সপার্ট প্রম্পট ডিকশনারি
prompt_infos = [
    {
        "name": "history",
        "description": "বাংলাদেশের ইতিহাস সম্পর্কিত প্রশ্ন",
        "prompt_template": """আপনি বাংলাদেশের ইতিহাস বিশেষজ্ঞ।

প্রশ্ন: {input}
উত্তর:"""
    },
    {
        "name": "geography",
        "description": "বাংলাদেশের ভূগোল সম্পর্কিত প্রশ্ন",
        "prompt_template": """আপনি বাংলাদেশের ভূগোল বিশেষজ্ঞ।

প্রশ্ন: {input}
উত্তর:"""
    },
    {
        "name": "culture",
        "description": "বাংলাদেশের সংস্কৃতি সম্পর্কিত প্রশ্ন",
        "prompt_template": """আপনি বাংলাদেশের সংস্কৃতি বিশেষজ্ঞ।

প্রশ্ন: {input}
উত্তর:"""
    }
]

# রাউটার টেমপ্লেট
router_template = """আপনি একটি প্রশ্ন রাউটার।

ইউজারের প্রশ্ন অনুযায়ী, আপনাকে সঠিক ডোমেইন নির্বাচন করতে হবে।

<ডোমেইন>
{destinations}
</ডোমেইন>

প্রশ্ন: {input}
ডোমেইন:"""

router_prompt = PromptTemplate(
    template=router_template,
    input_variables=["input", "destinations"]
)

# ডেস্টিনেশন চেইন তৈরি করুন
destination_chains = {}
for p_info in prompt_infos:
    name = p_info["name"]
    prompt_template = p_info["prompt_template"]
    prompt = PromptTemplate(template=prompt_template, input_variables=["input"])
    chain = LLMChain(llm=llm, prompt=prompt)
    destination_chains[name] = chain

# ডিফল্ট চেইন
default_chain = LLMChain(
    llm=llm,
    prompt=PromptTemplate(
        template="প্রশ্ন: {input}\nউত্তর:",
        input_variables=["input"]
    )
)

# রাউটার চেইন
router_chain = LLMRouterChain.from_llm(
    llm=llm,
    prompt=router_prompt
)

# মাল্টি প্রম্পট চেইন
multi_prompt_chain = MultiPromptChain(
    router_chain=router_chain,
    destination_chains=destination_chains,
    default_chain=default_chain,
    verbose=True
)

# মাল্টি-ডোমেইন Q&A সিস্টেম রান করুন
history_q = "১৯৭১ সালে বাংলাদেশের স্বাধীনতা যুদ্ধে কারা নেতৃত্ব দিয়েছিলেন?"
print(f"প্রশ্ন: {history_q}")
print(f"উত্তর: {multi_prompt_chain.run(history_q)}")
print("=" * 50)

geography_q = "বাংলাদেশের সবচেয়ে বড় নদী কোনটি এবং এটি কোথায় অবস্থিত?"
print(f"প্রশ্ন: {geography_q}")
print(f"উত্তর: {multi_prompt_chain.run(geography_q)}")
print("=" * 50)

culture_q = "বাংলাদেশের প্রধান উৎসবগুলি কী কী?"
print(f"প্রশ্ন: {culture_q}")
print(f"উত্তর: {multi_prompt_chain.run(culture_q)}")

উপসংহার

এই টিউটোরিয়ালে আমরা শিখেছি:

  1. বেসিক LLM ইন্টারফেসিং – কিভাবে লাংচেইন ব্যবহার করে LLM-এর সাথে ইন্টারফেস করতে হয়
  2. সিম্পল প্রম্পট তৈরি করা – কিভাবে PromptTemplate ব্যবহার করে ডাইনামিক প্রম্পট তৈরি করতে হয়
  3. LLM রেসপন্স পার্স করা – কিভাবে LLM রেসপন্স স্ট্রাকচার্ড ফরম্যাটে পার্স করতে হয়
  4. সিম্পল চেইন তৈরি করা – কিভাবে বিভিন্ন কম্পোনেন্ট একসাথে সংযুক্ত করে চেইন তৈরি করতে হয়
  5. প্র্যাকটিকাল এক্সারসাইজ – কিভাবে একটি সিম্পল Q&A সিস্টেম তৈরি করতে হয়

এখন আপনি লাংচেইন ব্যবহার করে বেসিক AI অ্যাপ্লিকেশন তৈরি করতে প্রস্তুত! পরবর্তী টিউটোরিয়ালে আমরা আরও অ্যাডভান্সড টপিক যেমন মেমরি, এজেন্ট, এবং টুল ইন্টিগ্রেশন নিয়ে আলোচনা করব।

অনুশীলনী

  1. একটি সিম্পল ট্রানসলেশন অ্যাপ্লিকেশন তৈরি করুন যা ইংরেজি থেকে বাংলায় এবং বাংলা থেকে ইংরেজিতে অনুবাদ করতে পারে।
  2. একটি কনটেন্ট জেনারেটর তৈরি করুন যা ইউজারের ইনপুট অনুযায়ী বিভিন্ন ধরনের কনটেন্ট (ব্লগ পোস্ট, সোশ্যাল মিডিয়া পোস্ট, ইমেইল) জেনারেট করতে পারে।
  3. একটি ফ্যাক্ট-চেকিং সিস্টেম তৈরি করুন যা ইউজারের দেওয়া তথ্য যাচাই করে এবং সেটি সত্য, মিথ্যা, বা অনিশ্চিত কিনা তা জানায়।
  4. আমাদের মাল্টি-ডোমেইন Q&A সিস্টেম আপগ্রেড করুন যাতে এটি আরও ডোমেইন (যেমন: খেলাধুলা, অর্থনীতি, বিজ্ঞান) সাপোর্ট করে এবং ইউজারের ফিডব্যাক অনুযায়ী শিখতে পারে।

ভূমিকা

গল্প: রহিম একজন প্রোগ্রামার যিনি LangChain সম্পর্কে শিখেছেন এবং এখন তার প্রথম অ্যাপ্লিকেশন তৈরি করতে চান। তিনি ভাবছেন, “আমি কিভাবে শুরু করব? এটা কি জটিল হবে?” তিনি একটি সহজ প্রোজেক্ট দিয়ে শুরু করার সিদ্ধান্ত নিলেন – একটি সিম্পল Q&A সিস্টেম যা ব্যবহারকারীর প্রশ্নের উত্তর দিতে পারে।

এই টিউটোরিয়ালে, আমরা রহিমের মতো LangChain ব্যবহার করে একটি সিম্পল অ্যাপ্লিকেশন তৈরি করব। আমরা শিখব কিভাবে LLM-এর সাথে ইন্টারফেস করতে হয়, প্রম্পট তৈরি করতে হয়, রেসপন্স পার্স করতে হয়, এবং বেসিক এরর হ্যান্ডলিং করতে হয়।

প্রয়োজনীয় সেটআপ

আমাদের প্রথম LangChain অ্যাপ্লিকেশন তৈরি করার আগে, আমাদের নিশ্চিত করতে হবে যে আমাদের সব প্রয়োজনীয় টুল ইনস্টল করা আছে:

pip install langchain langchain-openai python-dotenv

এবং আমাদের .env ফাইলে API কি সেট করতে হবে:

OPENAI_API_KEY=sk-your-openai-api-key

বেসিক LLM ইন্টারফেসিং

গল্প: রহিম প্রথমে LLM-এর সাথে কথা বলার সবচেয়ে সহজ উপায় খুঁজছিলেন। তিনি ভাবলেন, “এটা কি টেলিফোন কল করার মতো সহজ হতে পারে?” LangChain-এ, এটা সত্যিই সেরকম সহজ!

LLM মডেল সেটআপ করা

LangChain-এ LLM-এর সাথে ইন্টারফেস করার প্রথম ধাপ হল একটি LLM মডেল সেটআপ করা। আমরা OpenAI-এর GPT মডেল ব্যবহার করব:

# first_langchain_app.py
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os

# .env ফাইল থেকে API কি লোড করুন
load_dotenv()

# LLM মডেল সেটআপ করুন
llm = ChatOpenAI(
    model="gpt-3.5-turbo",  # মডেল নাম
    temperature=0.7,        # ক্রিয়েটিভিটি লেভেল (0-1)
    api_key=os.getenv("OPENAI_API_KEY")  # API কি
)

এখানে আমরা কী করলাম:

  1. ChatOpenAI ক্লাস ইমপোর্ট করলাম, যা OpenAI-এর চ্যাট মডেলগুলির সাথে ইন্টারফেস করে
  2. dotenv ব্যবহার করে আমাদের API কি লোড করলাম
  3. ChatOpenAI অবজেক্ট তৈরি করলাম, যেখানে:
  4. model: কোন মডেল ব্যবহার করব (এখানে gpt-3.5-turbo)
  5. temperature: উত্তরের ক্রিয়েটিভিটি নিয়ন্ত্রণ করে (0 = সবচেয়ে নির্ভরযোগ্য, 1 = সবচেয়ে ক্রিয়েটিভ)
  6. api_key: OpenAI API কি

সিম্পল LLM কল করা

এখন আমরা LLM-কে একটি সিম্পল প্রশ্ন জিজ্ঞাসা করব:

# LLM কল করুন
response = llm.invoke("বাংলাদেশের রাজধানী কোনটি?")

# রেসপন্স প্রিন্ট করুন
print(response.content)

এই কোড রান করলে, আমরা দেখব LLM “ঢাকা” উত্তর দিয়েছে।

সিম্পল প্রম্পট তৈরি করা

গল্প: রহিম বুঝতে পারলেন যে LLM-কে সঠিক উত্তর দিতে সাহায্য করার জন্য প্রম্পট গুরুত্বপূর্ণ। এটা একটি রেস্টুরেন্টে অর্ডার দেওয়ার মতো – আপনি যত স্পষ্ট হবেন, আপনি তত ভাল সার্ভিস পাবেন।

প্রম্পট টেমপ্লেট ব্যবহার করা

LangChain-এ, আমরা PromptTemplate ব্যবহার করে স্ট্রাকচার্ড প্রম্পট তৈরি করতে পারি:

from langchain.prompts import PromptTemplate

# প্রম্পট টেমপ্লেট তৈরি করুন
prompt_template = PromptTemplate.from_template(
    "আমি {subject} সম্পর্কে জানতে চাই। আমাকে {subject} সম্পর্কে {num_sentences} টি বাক্যে তথ্য দিন।"
)

# প্রম্পট টেমপ্লেট ব্যবহার করুন
formatted_prompt = prompt_template.format(subject="সৌরজগত", num_sentences=3)
print("ফরম্যাটেড প্রম্পট:", formatted_prompt)

# LLM কল করুন
response = llm.invoke(formatted_prompt)
print("\nLLM রেসপন্স:")
print(response.content)

এখানে আমরা কী করলাম:

  1. PromptTemplate ক্লাস ব্যবহার করে একটি টেমপ্লেট তৈরি করলাম
  2. টেমপ্লেটে প্লেসহোল্ডার ব্যবহার করলাম ({subject}, {num_sentences})
  3. format() মেথড ব্যবহার করে প্লেসহোল্ডারগুলি রিপ্লেস করলাম
  4. ফরম্যাটেড প্রম্পট LLM-এ পাঠালাম

সিস্টেম মেসেজ ব্যবহার করা

আমরা LLM-এর আচরণ নিয়ন্ত্রণ করতে সিস্টেম মেসেজও ব্যবহার করতে পারি:

from langchain.schema import HumanMessage, SystemMessage

# সিস্টেম এবং হিউম্যান মেসেজ তৈরি করুন
messages = [
    SystemMessage(content="আপনি একজন সহায়ক শিক্ষক যিনি ছাত্রদের সহজ ভাষায় বিজ্ঞান বোঝান।"),
    HumanMessage(content="আমাকে গ্রহণ ও উপগ্রহণ সম্পর্কে ব্যাখ্যা করুন।")
]

# মেসেজ ব্যবহার করে LLM কল করুন
response = llm.invoke(messages)
print("LLM রেসপন্স:")
print(response.content)

এখানে আমরা কী করলাম:

  1. SystemMessage ব্যবহার করে LLM-এর ভূমিকা নির্ধারণ করলাম
  2. HumanMessage ব্যবহার করে ব্যবহারকারীর প্রশ্ন তৈরি করলাম
  3. মেসেজ লিস্ট LLM-এ পাঠালাম

LLM রেসপন্স পার্স করা

গল্প: রহিম এখন LLM থেকে রেসপন্স পাচ্ছেন, কিন্তু তিনি চান এই রেসপন্স থেকে স্ট্রাকচার্ড ডাটা বের করতে। এটা একটি লম্বা ইমেইল থেকে মূল পয়েন্টগুলি বের করার মতো।

টেক্সট রেসপন্স পার্স করা

সবচেয়ে সিম্পল কেস হল টেক্সট রেসপন্স পার্স করা:

# সিম্পল টেক্সট রেসপন্স পার্স করা
response = llm.invoke("বাংলাদেশের পাঁচটি বিখ্যাত পর্যটন স্থান তালিকা আকারে দিন")
places = response.content.strip().split('\n')

print("পর্যটন স্থানগুলি:")
for i, place in enumerate(places, 1):
    # লিস্ট মার্কার (*, -, 1. ইত্যাদি) রিমুভ করি
    clean_place = place.lstrip('*-0123456789. \t')
    print(f"{i}. {clean_place}")

স্ট্রাকচার্ড আউটপুট পাওয়া

LangChain-এ, আমরা output_parser ব্যবহার করে স্ট্রাকচার্ড আউটপুট পেতে পারি:

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List

# আউটপুট মডেল ডিফাইন করুন
class TouristDestination(BaseModel):
    name: str = Field(description="পর্যটন স্থানের নাম")
    location: str = Field(description="পর্যটন স্থানের অবস্থান")
    famous_for: str = Field(description="পর্যটন স্থান কিসের জন্য বিখ্যাত")

class TouristDestinations(BaseModel):
    destinations: List[TouristDestination] = Field(description="পর্যটন স্থানের তালিকা")

# আউটপুট পার্সার তৈরি করুন
parser = PydanticOutputParser(pydantic_object=TouristDestinations)

# প্রম্পট টেমপ্লেট তৈরি করুন
prompt_template = PromptTemplate(
    template="বাংলাদেশের তিনটি বিখ্যাত পর্যটন স্থান সম্পর্কে তথ্য দিন।\n{format_instructions}",
    partial_variables={"format_instructions": parser.get_format_instructions()}
)

# প্রম্পট তৈরি করুন
prompt = prompt_template.format()

# LLM কল করুন
response = llm.invoke(prompt)

# রেসপন্স পার্স করুন
try:
    parsed_destinations = parser.parse(response.content)

    print("পার্স করা পর্যটন স্থানগুলি:")
    for dest in parsed_destinations.destinations:
        print(f"নাম: {dest.name}")
        print(f"অবস্থান: {dest.location}")
        print(f"বিখ্যাত: {dest.famous_for}")
        print()
except Exception as e:
    print(f"পার্সিং এরর: {str(e)}")
    print("অরিজিনাল রেসপন্স:")
    print(response.content)

এখানে আমরা কী করলাম:

  1. BaseModel ব্যবহার করে আমাদের কাঙ্খিত আউটপুট স্ট্রাকচার ডিফাইন করলাম
  2. PydanticOutputParser ব্যবহার করে একটি পার্সার তৈরি করলাম
  3. পার্সারের ফরম্যাট ইন্সট্রাকশন প্রম্পটে যোগ করলাম
  4. LLM রেসপন্স পার্স করে স্ট্রাকচার্ড ডাটা পেলাম

বেসিক এরর হ্যান্ডলিং

গল্প: রহিম তার অ্যাপ্লিকেশন টেস্ট করার সময় দেখলেন যে কখনও কখনও এরর হয়। তিনি বুঝলেন যে একটি ভাল অ্যাপ্লিকেশনে এরর হ্যান্ডলিং থাকা উচিত, ঠিক যেমন একটি গাড়িতে এয়ারব্যাগ থাকে।

API এরর হ্যান্ডলিং

LLM API কল করার সময় বিভিন্ন এরর হতে পারে:

import time
from openai import OpenAIError, RateLimitError

def safe_llm_call(prompt, max_retries=3, backoff_factor=2):
    """
    রিট্রাই লজিক সহ সেফ LLM কল
    """
    retries = 0
    while retries <= max_retries:
        try:
            return llm.invoke(prompt)
        except RateLimitError:
            # রেট লিমিট এরর হলে বেশি সময় অপেক্ষা করি
            wait_time = backoff_factor ** retries
            print(f"রেট লিমিট এরর! {wait_time} সেকেন্ড অপেক্ষা করছি...")
            time.sleep(wait_time)
            retries += 1
        except OpenAIError as e:
            # অন্যান্য OpenAI এরর
            print(f"OpenAI এরর: {str(e)}")
            return f"এরর হয়েছে: {str(e)}"
        except Exception as e:
            # অন্যান্য এরর
            print(f"অপ্রত্যাশিত এরর: {str(e)}")
            return f"এরর হয়েছে: {str(e)}"

    return "সর্বাধিক রিট্রাই সংখ্যা অতিক্রম করেছে"

# সেফ LLM কল ব্যবহার করুন
response = safe_llm_call("বাংলাদেশের জাতীয় পাখি কি?")
print(response.content if hasattr(response, 'content') else response)

পার্সিং এরর হ্যান্ডলিং

LLM রেসপন্স পার্স করার সময়ও এরর হতে পারে:

def safe_parse_response(parser, response_text):
    """
    সেফ রেসপন্স পার্সিং
    """
    try:
        return parser.parse(response_text)
    except Exception as e:
        print(f"পার্সিং এরর: {str(e)}")
        # ফলব্যাক: সিম্পল টেক্সট রিটার্ন করি
        return {"error": str(e), "raw_text": response_text}

# সেফ পার্সিং ব্যবহার করুন
response = llm.invoke(prompt)
parsed_result = safe_parse_response(parser, response.content)

if "error" in parsed_result:
    print("পার্সিং এরর হয়েছে। অরিজিনাল টেক্সট:")
    print(parsed_result["raw_text"])
else:
    print("সফলভাবে পার্স করা হয়েছে:", parsed_result)

প্র্যাকটিকাল এক্সারসাইজ: সিম্পল Q&A সিস্টেম

এখন আমরা আমাদের শেখা সবকিছু একত্রিত করে একটি সিম্পল Q&A সিস্টেম তৈরি করব:

# simple_qa_system.py
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.schema import HumanMessage, SystemMessage
from dotenv import load_dotenv
import os
import time

# .env ফাইল থেকে API কি লোড করুন
load_dotenv()

class SimpleQASystem:
    def __init__(self, model_name="gpt-3.5-turbo", temperature=0.7):
        """
        সিম্পল Q&A সিস্টেম ইনিশিয়ালাইজ করুন
        """
        self.llm = ChatOpenAI(
            model=model_name,
            temperature=temperature,
            api_key=os.getenv("OPENAI_API_KEY")
        )

        # সিস্টেম প্রম্পট সেটআপ করুন
        self.system_prompt = """
        আপনি একটি সহায়ক AI অ্যাসিস্ট্যান্ট। আপনার কাজ হল ব্যবহারকারীর প্রশ্নের সঠিক, 
        সংক্ষিপ্ত এবং সহজবোধ্য উত্তর দেওয়া। আপনি বাংলা ভাষায় উত্তর দিবেন।

        যদি আপনি কোন প্রশ্নের উত্তর না জানেন, তাহলে অনুমান করবেন না। 
        সেক্ষেত্রে বলুন যে আপনি এই প্রশ্নের উত্তর জানেন না।
        """

    def ask(self, question):
        """
        প্রশ্ন জিজ্ঞাসা করুন এবং উত্তর পান
        """
        try:
            # মেসেজ তৈরি করুন
            messages = [
                SystemMessage(content=self.system_prompt),
                HumanMessage(content=question)
            ]

            # LLM কল করুন
            start_time = time.time()
            response = self.llm.invoke(messages)
            end_time = time.time()

            return {
                "answer": response.content,
                "time_taken": round(end_time - start_time, 2)
            }
        except Exception as e:
            return {
                "error": str(e),
                "answer": "দুঃখিত, আপনার প্রশ্নের উত্তর দিতে সমস্যা হয়েছে।"
            }

    def ask_with_context(self, question, context):
        """
        কনটেক্সট সহ প্রশ্ন জিজ্ঞাসা করুন
        """
        # প্রম্পট টেমপ্লেট তৈরি করুন
        prompt_template = PromptTemplate.from_template(
            """
            নিম্নলিখিত কনটেক্সট ব্যবহার করে প্রশ্নের উত্তর দিন:

            কনটেক্সট:
            {context}

            প্রশ্ন: {question}

            উত্তর:
            """
        )

        # প্রম্পট ফরম্যাট করুন
        formatted_prompt = prompt_template.format(
            context=context,
            question=question
        )

        try:
            # LLM কল করুন
            start_time = time.time()
            response = self.llm.invoke(formatted_prompt)
            end_time = time.time()

            return {
                "answer": response.content,
                "time_taken": round(end_time - start_time, 2)
            }
        except Exception as e:
            return {
                "error": str(e),
                "answer": "দুঃখিত, আপনার প্রশ্নের উত্তর দিতে সমস্যা হয়েছে।"
            }

# Q&A সিস্টেম ব্যবহার করুন
if __name__ == "__main__":
    qa_system = SimpleQASystem()

    print("সিম্পল Q&A সিস্টেম")
    print("'exit' টাইপ করে বের হতে পারেন\n")

    while True:
        user_question = input("\nআপনার প্রশ্ন লিখুন: ")

        if user_question.lower() in ['exit', 'quit', 'বের হও']:
            print("ধন্যবাদ! আবার দেখা হবে।")
            break

        print("উত্তর খোঁজা হচ্ছে...")
        result = qa_system.ask(user_question)

        if "error" in result:
            print(f"এরর: {result['error']}")

        print(f"\nউত্তর: {result['answer']}")
        print(f"সময় লেগেছে: {result['time_taken']} সেকেন্ড")

এই কোড রান করলে, আমরা একটি ইন্টারেক্টিভ Q&A সিস্টেম পাব যা ব্যবহারকারীর প্রশ্নের উত্তর দিতে পারে।

কনটেক্সট সহ Q&A সিস্টেম ব্যবহার

আমরা কনটেক্সট সহ Q&A সিস্টেম ব্যবহার করতে পারি:

# কনটেক্সট সহ Q&A সিস্টেম ব্যবহার করুন
context = """
বাংলাদেশ দক্ষিণ এশিয়ার একটি দেশ। এর রাজধানী ঢাকা। বাংলাদেশের জনসংখ্যা প্রায় 17 কোটি।
বাংলাদেশের জাতীয় ফুল শাপলা, জাতীয় ফল কাঁঠাল, জাতীয় পাখি দোয়েল এবং জাতীয় পশু রয়েল বেঙ্গল টাইগার।
বাংলাদেশের অর্থনীতি মূলত কৃষি, গার্মেন্টস শিল্প এবং রেমিট্যান্স নির্ভর।
"""

qa_system = SimpleQASystem()
result = qa_system.ask_with_context("বাংলাদেশের জাতীয় পাখি কি?", context)
print(f"উত্তর: {result['answer']}")

সারাংশ

এই টিউটোরিয়ালে, আমরা শিখেছি:

  1. বেসিক LLM ইন্টারফেসিং: কিভাবে LangChain-এ LLM সেটআপ করতে হয় এবং সিম্পল কল করতে হয়
  2. সিম্পল প্রম্পট তৈরি করা: কিভাবে প্রম্পট টেমপ্লেট এবং সিস্টেম মেসেজ ব্যবহার করতে হয়
  3. LLM রেসপন্স পার্স করা: কিভাবে টেক্সট রেসপন্স এবং স্ট্রাকচার্ড আউটপুট পার্স করতে হয়
  4. বেসিক এরর হ্যান্ডলিং: কিভাবে API এরর এবং পার্সিং এরর হ্যান্ডল করতে হয়
  5. প্র্যাকটিকাল এক্সারসাইজ: একটি সিম্পল Q&A সিস্টেম তৈরি করা

এই বেসিক কনসেপ্টগুলি বুঝে, আপনি এখন আরও জটিল LangChain অ্যাপ্লিকেশন তৈরি করতে প্রস্তুত।

অতিরিক্ত অনুশীলনী

  1. Q&A সিস্টেম এক্সটেন্ড করুন: আপনার Q&A সিস্টেমে হিস্টোরি ট্র্যাকিং যোগ করুন যাতে LLM আগের প্রশ্ন-উত্তর মনে রাখতে পারে।
  2. মাল্টিপল LLM সাপোর্ট: আপনার Q&A সিস্টেমে বিভিন্ন LLM (OpenAI, Hugging Face) সাপোর্ট যোগ করুন এবং ব্যবহারকারীকে মডেল সিলেক্ট করার অপশন দিন।
  3. ইউজার ফিডব্যাক: ব্যবহারকারীকে উত্তরের জন্য ফিডব্যাক দেওয়ার অপশন দিন (ভাল/খারাপ) এবং সেই ফিডব্যাক লগ করুন।
  4. কনটেন্ট ফিল্টারিং: অনুপযুক্ত প্রশ্ন ফিল্টার করার জন্য একটি সিম্পল কনটেন্ট ফিল্টার যোগ করুন।
  5. ওয়েব ইন্টারফেস: Flask বা Streamlit ব্যবহার করে আপনার Q&A সিস্টেমের জন্য একটি সিম্পল ওয়েব ইন্টারফেস তৈরি করুন।

পরবর্তী ধাপ

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

আমরা একটি আরও উন্নত Q&A সিস্টেম তৈরি করব যা ডকুমেন্ট থেকে তথ্য খুঁজে বের করতে পারে এবং ব্যবহারকারীর সাথে কনভার্সেশনাল ইন্টারফেস প্রদান করতে পারে।

উপসংহার

আজকের টিউটোরিয়ালে, আমরা LangChain ব্যবহার করে একটি সিম্পল Q&A সিস্টেম তৈরি করেছি। আমরা দেখেছি কিভাবে LLM-এর সাথে ইন্টারফেস করতে হয়, প্রম্পট তৈরি করতে হয়, রেসপন্স পার্স করতে হয়, এবং বেসিক এরর হ্যান্ডলিং করতে হয়।

এই ফাউন্ডেশন ব্যবহার করে, আপনি এখন আরও জটিল LangChain অ্যাপ্লিকেশন তৈরি করতে পারেন। মনে রাখবেন, LLM অ্যাপ্লিকেশন তৈরি করার সময় প্রম্পট ইঞ্জিনিয়ারিং এবং এরর হ্যান্ডলিং অত্যন্ত গুরুত্বপূর্ণ।

আপনার অনুশীলনের জন্য, আমি আপনাকে উৎসাহিত করি আমাদের Q&A সিস্টেমে নতুন ফিচার যোগ করতে এবং বিভিন্ন প্রম্পট এবং মডেল সেটিং এক্সপেরিমেন্ট করতে।

ধন্যবাদ এবং শুভকামনা আপনার LangChain যাত্রায়!

How can we help?