নিজ ওয়েব সাইটের জন্য সেলফ হোস্টেড চ্যাটবট তৈরি

চ্যাটজিপিটি, ডিপসীক বা জেমিনির মত জেনারেটিভ এআই বলা যায় সব বিষয়ে পণ্ডিত। কাস্টোমার সাপোর্ট বা নিজ ওয়েব সাইট, মেসেঞ্জার বা অ্যাপের জন্য এগুলো ব্যবহার করা যায়। তবে মোটামুটি ভালোই এক্সপেন্সিভ। এখন থেকে ১০/১২ বছর আগে চ্যাটবট নিয়ে প্রচুর হাইপ ছিল। এখন যেমন এআই হাইপ, তেমন আরকি। সবাই চ্যাটবট তৈরি করত। সব কিছুতে চ্যাটবট ইন্ট্রিগ্রেশন মাস্ট। কিন্তু ঐ হাইপ কেনো জানি বেশিদিন টিকেনি। তবে চ্যাটবটের উপযোগিতা কমে যায়নি। স্পেসিফিক কাজে এখনো দরকার।

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

রাসা ছাড়াও অনেক লাইব্রেরী রয়েছে। যেমন Langchain, যার সাথে আবার যে কোন LLM যেমন চ্যাটজিপিটি বা যে কোন ওপেনসোর্স মডেল ব্যবহার করতে পারব। এরপর নিজেদের ডেটা দিয়ে ট্রেইন করে নিতে পারব।

রাসা দিয়ে সিম্পল একটা উদাহরণ দেখি। রাসা দিয়ে একটা প্রজেক্ট তৈরি করে নিব। সব কিছু টার্মিনাল বা কমান্ড লাইন থেকেই করতে পারব। আমি Conda ব্যবহার করব।

রাসা পাইথন 3.10 পর্যন্ত সাপোর্ট করে। তাই পাইথনের ঐ ভার্সন ব্যবহার করে একটা নতুন এনভারনমেন্ট তৈরি করে নিব।

conda create -n rasa-env python=3.10 -y
conda activate rasa-env

pip, setuptools এবং wheel আপগ্রেড করে নিবঃ

pip install --upgrade pip setuptools wheel

এরপর রাসা ইন্সটল করবঃ

pip install rasa

রাসা ভার্সন দেখতে চাইলেঃ

rasa --version

এবার রাসা ব্যবহার করে একটা প্রজেক্ট তৈরি করতে প্রস্তুত। যে ডিরেক্টরিতে রাসা ব্যবহার করব, ঐ ডিরেক্টরিতে ন্যাভিগেট করে লিখবঃ

rasa init

আমাদের কিছু প্রশ্ন জিজ্ঞেস কবরে। যেমন প্রথমে জিজ্ঞেস করবে আমরা কোন ডিরেক্টরিতে প্রজেক্ট তৈরি করব। যদি বর্তমান ডিরেক্টরিতে ইন্সটল করতে চাই, তাহলে এন্ট্রার প্রেস করব।

রাসা আমাদের জন্য একটা সিম্পল মডেল তৈরি করে দিবে। তা ট্রেইন করব কিনা, জিজ্ঞেস করবে। y প্রেস করলে মডেল ট্রেইন করে দিবে। ট্রেইনিং শেসে মডেলের সাথে চ্যাট করতে পারব।

চ্যাট থেকে বের হওয়ার জন্য টাইপ করবঃ

/stop

আবারও টার্মিনালে চ্যাট করতে লিখতে পারি

rasa shell

রাসার গুরুতপূর্ণ ফাইল গুলো হচ্ছে data ফোল্ডারের nlu.yml, rules.yml, stories.yml এবং domain.yml।

nlu.yml

এই ফাইলে ইউজার কি করতে চায় এবং ইউজার প্রতিটা কাজের জন্য কি কি মেসেজ দিতে পারে, তার কিছু উদাহরণ দেওয়া থাকে। যেমনঃ

- intent: greet
  examples: |
    - hello
    - hi
    - hey there

এখানে intent বা এই চ্যাটবটের উদ্দেশ্য গুলো যোগ করব।

domain.yml

এই ফাইল হচ্ছে চ্যাটবটের ব্রেইনের মত। প্রতিটা ইন্টেন্টের বিপরীতে চ্যাটবট কি রিপ্লাই দিবে, তা এখানে উল্লেখ করে দিব। এখানে প্রতিটা ইন্টেন্টের বিপরীতে একাধিক রেসপন্স যোগ করতে পারব। একাধিক রেসপন্স যোগ করলে চ্যাটবট রেন্ডমলি একটা ব্যবহার করবে। যেমন greet ইন্টেন্টের জন্য দুইটা রেসপন্স যোগ করেছিঃ

responses:
  utter_greet:
  - text: "Hey! How are you?"
  - text: "Hi! How can I assist you today?"

ইউজার hello বা এই ধরণের কোন মেসেজ দিলে উপরের দুইটার যে কোন একটা রিপ্লাই দিবে।

rules.yml

এই ফাইলে if else এর মত লজিক ব্যবহার করতে ব্যবহার করা হয়। ইউজার কি মেসেজ দিলে কি ভাবে রেসপন্স করবে, সেগুলো আরকি। যেমনঃ

- rule: say goodbye
  steps:
    - intent: goodbye
    - action: utter_goodbye

এখানে rule: say goodbye হচ্ছে লেভেল। এই লেভেল ডেভেলপারের জন্য, যেন বুঝতে পারে কোনটার কাজ কি। ইন্টেন্ট হচ্ছে nlu.yml তে ডিফাইন করা ইন্টেন্ট গুলো। আর ঐ ইন্টেন্টের জন্য কি ধরণের কাজ করবে (domain.yml থেকে), তা ডিফাইন করে দেওয়া হয় এখানে।

stories.yml

এখানে ডায়ালগ গুলোর ফ্লো ডিফাইন করা থাকে। কোন ডায়লগের পর চ্যাটবট কোন ড্যায়ালগ ব্যবহার করবে, এসব।

- story: happy path
  steps:
  - intent: greet
  - action: utter_greet
  - intent: mood_great
  - action: utter_happy

মডেল ট্রেইন করার পর মডেল গুলো থাকে models ফোল্ডারে। এছাড়া আমরা কাস্টম একশন তৈরি করতে পারি। যেগুলো লিখতে পারি actions.py ফাইলে। যেমন এখানে প্রয়োজন অনুযায়ী ডেটাবেজ থেকে ইউজারের কোন তথ্য বের করে এনে দেখাতে পারি।

Langchain

ল্যাংচেইনের সাহায্যে যে কোন LLM ব্যবহার করে আমরা অ্যাপ তৈরি করতে পারি। এমনকি একাধিক মডেল এক সাথে ব্যবহার করতে পারি। অনেক পাওয়ারফুল একটা লাইব্রেরী হচ্ছে ল্যাংচেইন। এমনকি চাইলে চ্যাটবট তৈরি করতে পারি। চাইলে আমাদের নিজেদের ডেটা দিয়ে মডেল ফাইন টিউন করে নিতে পারব। যদিও এই ক্ষেত্রে ভালো GPU যুক্ত কম্পিউটার লাগবে। আমি এখানে Llama-2-7B-GGUF ব্যবহার করে একটা সিম্পল উদাহরণ দেখাচ্ছি। তার জন্য আমাদের langchain এবং llama-cpp-python ইন্সটল করে নিতে হবে। কেউ যদি লোকাল কম্পিউটারে ডিপসিক সহ যে কোন AI মডেল রান করে দেখতে চান, তাহলে এই লেখাটা দেখতে পারেন।

pip install llama-cpp-python langchain

এরপর এভাবে কোড লিখতে পারিঃ

from langchain.llms import LlamaCpp
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# Path to the TinyLlama model
model_path = "llama-2-7b.Q3_K_S.gguf"

# Initialize the LLM
llm = LlamaCpp(
    model_path=model_path,
    temperature=0.7,
    max_tokens=256,
    n_ctx=2048,
    top_p=0.95,
    repeat_penalty=1.1,
    stop=["###"],  # Stop at this token (or you can adjust it depending on TinyLlama's response format)
    verbose=True
)

# Set up the prompt template
prompt = PromptTemplate(
    input_variables=["question"],
    template="Please answer the following question:\n{question}\nAnswer:"
)

# Create LangChain LLMChain
chain = LLMChain(prompt=prompt, llm=llm)

# Test question
question = "Write a Python function to check if a number is even or odd."

# Run the chain
response = chain.run(question).strip()

# Print and save output to a file
print("Response:\n", response)

# Save to output.txt
with open("output.txt", "w", encoding="utf-8") as f:
    f.write(f"Question:\n{question}\n\nResponse:\n{response}\n")

print("✅ Output saved to output.txt")

আমাদের Llama-2-7B-GGUF ডাউনলোড করে নিতে হবে। টার্মিনালে অনেক ইনফরমেশন আউটপুট দেখায়। তাই LLM এর রেসপন্স output.txt ফাইলে রাইট করেছি।

এখন চাইলে আমরা API হিসেবেও কল করতে পারব। তার জন্য FastAPI অথবা অন্য যে কোন পাইথন লাইব্রেরী ব্যবহার করতে পারি। আমি FastAPI ব্যবহার করে দেখাচ্ছি। তার জন্য FastAPI ইন্সটল করে নিতে হবে।

pip install fastapi uvicorn langchain llama-cpp-python

পাইথন ওয়েব সার্ভারের জন্য uvicorn ও ইন্সটল করে নিয়েছি। এরপর এভাবে কোড লিখতে পারিঃ

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from langchain.llms import LlamaCpp
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# FastAPI app initialization
app = FastAPI()

# Path to the LangChain model
model_path = "llama-2-7b.Q3_K_S.gguf"

# Initialize LlamaCpp model (or your specific model)
llm = LlamaCpp(
    model_path=model_path,
    temperature=0.7,
    max_tokens=256,
    n_ctx=2048,
    top_p=0.95,
    repeat_penalty=1.1,
    stop=["###"],
    verbose=True
)

# Set up the prompt template for LangChain
prompt = PromptTemplate(
    input_variables=["question"],
    template="Please answer the following question:\n{question}\nAnswer:"
)

# Create LangChain LLMChain
chain = LLMChain(prompt=prompt, llm=llm)

# Define the request body model
class QuestionRequest(BaseModel):
    question: str

# Define the response model
class Response(BaseModel):
    response: str

@app.post("/generate", response_model=Response)
async def generate_response(request: QuestionRequest):
    # Get the question from the request
    question = request.question

    # Check if question is empty
    if not question:
        raise HTTPException(status_code=400, detail="No question provided")
    
    # Run LangChain to get the response
    response = chain.run(question).strip()

    return {"response": response}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

এবার পোস্টম্যান অথবা অন্য যে কোন API টেস্টিং সফটওয়ারের সাহায্যে আমরা রিকোয়েস্ট করতে পারব। টার্মিনালেও টেস্ট করতে পারব এভাবেঃ

curl -X 'POST' \
  'http://localhost:8000/generate' \
  -H 'Content-Type: application/json' \
  -d '{
  "question": "Write a Python function to check if a number is prime."
}'

যার আউটপুট পাবো এমনঃ

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

আর্টিফিশিয়াল ইন্টিলিজেন্স, মেশিন লার্নিং এর বেশির ভাগ কাজ আমরা পাইথন দিয়ে করতে পারি। পাইথন শিখতে চাইলে পাইথন প্রোগ্রামিং ইবুকটা দেখতে পারেন।

Leave a Comment