LLM کو اپنی ضروریات کے مطابق ترتیب دینا

موجودہ AI ماڈل ڈومین میں، ماڈلوں کی بڑی تعداد ہے اور لینگچین کی آفیشل انٹیگریشن سب ماڈلوں کو شامل نہیں کرتی۔ کبھی کبھار آپ کو اپنی ماڈل کو زیادہ عمدگی کے ساتھ استعمال کرنے کی ضرورت پیش آ سکتی ہے اور اسے لینگچین فریم ورک میں شامل کرنا ہوتا ہے۔

اس باب میں آپ کو بتایا جائے گا کہ کس طرح آپ اپنے خود کے LLM ورپر بنا سکتے ہیں تاکہ آپ اپنا خود کا ماڈل یا لینگچین مدد نہ ہونے والے ماڈل کو استعمال کر سکیں۔

لینگچین میں اگر آپ اپنا خود کا LLM یا لینگچین کی سپورٹ نہیں کرنے والے ورپر کو استعمال کرنا چاہتے ہیں تو آپ ایک کسٹم LLM ورپر بنا سکتے ہیں۔ ایک کسٹم LLM کو صرف دو مطلوبہ میتھڈز پر عمل کیا جانا چاہئے:

  • ایک _call میتھڈ، جس میں ایک اسٹرنگ کو ان پٹ لینتا ہے، کچھ ضروری stop words اور ایک اسٹرنگ کو براٹا ہے، _call میتھڈ میں ماڈل کو بلانے کی تشریقات پر عمل کرنا۔
  • ایک _llm_type اٹربیوٹ، جو صرف لاگنگ کے مقاصد کے لئے استعمال ہونے والا ہے، واپس کرنے والا ایک اسٹرنگ ہوتا ہے جو ماڈل کا نام ظاہر کرتا ہے۔

ضمن مطلوبہ میتھڈز کے علاوہ، ایک کسٹم LLM کو کچھ اختیاری میتھڈ بھی عمل کر سکتا ہے:

  • ایک _identifying_params اٹربیوٹ، جو کلاس کو پرنٹ کرنے میں مدد کرتا ہے😊. یہ ایک ڈکشنری واپس کرنا چاہئے۔

ایک سادہ کسٹم LLM کو پورا کرنا

چلو ہم یہاں ایک بہت ہی سادہ کسٹم LLM کو پورا کرتے ہیں جو صرف ان پٹ کی پہلی n چیزیں لوٹاتا ہے۔

from typing import Any, List, Mapping, Optional

from langchain_core.callbacks.manager import CallbackManagerForLLMRun
from langchain_core.language_models.llms import LLM

class CustomLLM(LLM):
    n: int

    @property
    def _llm_type(self) -> str:
        return "custom"

    def _call(
        self,
        prompt: str,
        stop: Optional[List[str]] = None,
        run_manager: Optional[CallbackManagerForLLMRun] = None,
        **kwargs: Any,
    ) -> str:
        if stop is not None:
            raise ValueError("stop kwargs are not permitted.")
        return prompt[: self.n]

    @property
    def _identifying_params(self) -> Mapping[str, Any]:
        """تشخیصی پیرامیٹرز حاصل کریں۔"""
        return {"n": self.n}

اب ہم اس کسٹم LLM کا استعمال کر سکتے ہیں جیسے کسی دوسرے LLM کا استعمال کرتے ہیں۔

کسٹم LLM کا استعمال کرنا

ہم کسٹم LLM اکائیں بنا کر استعمال کر سکتے ہیں، کس طرح سے کسٹم LLM کو بلایا جا سکتا ہے، اور پرینٹ اوٹپٹ کو تشکیل دینا۔

llm = CustomLLM(n=10)
llm.invoke("یہ ایک فوبار چیز ہے")
'یہ ایک فوبار '

ہم LLM کو پرنٹ بھی کر سکتے ہیں اور اس کا تشکیل شدہ پرنٹ اوٹپٹ دیکھ سکتے ہیں۔

print(llm)
CustomLLM
Params: {'n': 10}

چیٹ ماڈل کو کسٹمائز کرنا

یہاں ہم سمجھائیں گے کہ لیانگ چین کے چیٹ ماڈل کو کس طرح کسٹمائز کریں۔

پیغام ان پٹ اور آؤٹ پٹ

چیٹ ماڈل میں، پیغامات ان پٹ اور آؤٹ پٹ کا توجہ ہوتا ہے۔ ایک پیغام وہ مواد ہوتا ہے جو صارف نے داخل کیا ہے اور ماڈل کی طرف سے پیدا کیا گیا جواب۔

پیغامات

چیٹ ماڈل پیغامات کو ان پٹ لینا ہوتا ہے فرماں پر عمل کرتا ہے اور پھر ایک یا زیادہ پیغامات کو آؤٹ پٹ کے طور پر بناتا ہے۔ لینگ چین میں کئی ساختہ پیغامات کے اندراج ہیں، جن میں:

  • SystemMessage: عام طور پر پہلے پیغام کے طور پر استعمال ہوتا ہے۔
  • HumanMessage: صارف کے چیٹ ماڈل سے مواقعہ کو ظاہر کرتا ہے۔
  • AIMessage: چیٹ ماڈل سے پیغامات، جو ٹیکسٹ یا ٹول تشریقات کی درخواستوں کا مواد ہوسکتے ہیں، کے پیغامات کو ظاہر کرتا ہے۔
  • FunctionMessage / ToolMessage: چیٹ ماڈل کو ٹول کی تشریقات کے نتیجے کو واپس بھیجنے کے لئے استعمال کیا جاتا ہے۔

یہ پیغامات کی استعمال کو مختصر کیا جا سکتا ہے اور ان کو خصوصی ضروریات کے مطابق بڑھایا و تخصیص دیا جا سکتا ہے، جیسے کہ OpenAI کے function اور tool پیرامیٹر سے مسلسل کرنا۔

from langchain_core.messages import (
    AIMessage,
    BaseMessage,
    FunctionMessage,
    HumanMessage,
    SystemMessage,
)

فلوئنٹ بیریئنٹس

تمام چیٹ پیغامات کے فلوئنٹ ویرینٹ، ان کے ناموں میں Chunk والے ہوتے ہیں۔

from langchain_core.messages import (
    AIMessageChunk,
    FunctionMessageChunk,
    HumanMessageChunk,
    SystemMessageChunk,
    ToolMessageChunk,
)

یہ Chunk چیٹ ماڈل کو سٹریم کرنے کے وقت استعمال کیے جاتے ہیں اور ہر ایک میں ان کی میں ان انجم کو تعین کرتا ہے!

مثال

AIMessageChunk(content="ہیلو") + AIMessageChunk(content=" دنیا!")

نتیجہ یہ بکتا ہے

AIMessageChunk(content='ہیلو دنیا!')

سادہ چیٹ ماڈل

SimpleChatModel سے ورثاپ یورفع کرنے سے سادہ چیٹ ماڈل کو تیزی سے پورا کرنے کی اجازت ہوتی ہے۔

اس کا مطلب یہ نہیں ہۈنا چاہئے کہ چیٹ ماڈل کے لئے پوری خصوصیات شامل ہوں، لیکن یہ تیزی سے پیشکش فراہم کرتا ہے۔ اگر مزید خصوصیات کی ضرورت ہو تو نیچے بیان شدہ BaseChatModel میں منتقلی ممکن ہے۔

SimpleChatModel سے وراثت لینا _call میتھڈ کی تنفیذ کا مطلب ہوتا ہے۔

اس کے علاوہ، مندرجہ ذیل مخصوص کیا جا سکتا ہے:

_identifying_params امکانی طور پر۔ خصوصیات - ماڈل میں پیرامیٹرائز ہونے والی معلومات ریکارڈ کرنے کے لئے استعمال ہوتا ہے۔

  • _stream میتھڈ - استریمنگ خروجات کی تنفیذ کے لئے استعمال ہوتا ہے۔

بیس چیٹ ماڈل

BaseChatModel سے وراثت لینے سے _generate میتھڈ اور _llm_type خصوصیات کی تنفیذ کی ضرورت ہوتی ہے۔ جوکہ اختیاری طور پر، _stream، _agenerate، _astream، اور _identifying_params کی تنفیذ ممکن ہے۔

کسٹم چیٹ ماڈل کی مثال

اس سیکشن میں، ہم کسٹم چیٹ ماڈل CustomChatModelAdvanced کے کوڈ کی تنظیم کا مظاہرہ کریں گے، جس میں چیٹ کے نتائج، سٹریمنگ خروجات، اور غیر متعین سٹریم تنظیم کی گئی ہو۔

from typing import Any, AsyncIterator, Dict, Iterator, List, Optional

from langchain_core.callbacks import (
    AsyncCallbackManagerForLLMRun,
    CallbackManagerForLLMRun,
)
from langchain_core.language_models import BaseChatModel, SimpleChatModel
from langchain_core.messages import AIMessageChunk, BaseMessage, HumanMessage
from langchain_core.outputs import ChatGeneration, ChatGenerationChunk, ChatResult
from langchain_core.runnables import run_in_executor


class CustomChatModelAdvanced(BaseChatModel):
    """طرف سے خود مخصوص چیٹ ماڈل کی تنظیم کا عمل"""


    n: int
    """خود مخصوص ماڈل پیرامیٹر"""

    def _generate(
        self,
        messages: List[BaseMessage],
        stop: Optional[List[str]] = None,
        run_manager: Optional[CallbackManagerForLLMRun] = None,
        **kwargs: Any,
    ) -> ChatResult:
        """یہاں، ماڈل کی کالنگ منطق کی تنظیم ہوتی ہے، عموماً کسی تیسری طرف کے ماڈل کے API کو بلانے کا ذریعہ ہوتا ہے، اور پھر API کے ذریعہ واپسی کردی گئی نتیجے کو langchain کی تسلیم کرنے کے قابل فارمیٹ میں بنانے کے ذریعہ کا جوابی پیرامیٹر کے بیان کا عمل ہوتا ہے۔
        کلیدی پیرامیٹر بیان:
            messages: پیغامات کا مشتملہ کیفل میں سے تھوک رمپٹس کی فہرست
        """
        last_message = messages[-1]
        tokens = last_message.content[: self.n]
        message = AIMessage(content=tokens)
        generation = ChatGeneration(message=message)
        return ChatResult(generations=[generation])

    def _stream(
        self,
        messages: List[BaseMessage],
        stop: Optional[List[str]] = None,
        run_manager: Optional[CallbackManagerForLLMRun] = None,
        **kwargs: Any,
    ) -> Iterator[ChatGenerationChunk]:
        """ماڈل سٹریمنگ خروجات کی تنظیم، _generate میتھڈ کی طرح نظر آتا ہے، لیکن سٹریمنگ خروجات کی پروسیسنگ کے ساتھ۔"""
        last_message = messages[-1]
        tokens = last_message.content[: self.n]

        for token in tokens:
            chunk = ChatGenerationChunk(message=AIMessageChunk(content=token))

            if run_manager:
                run_manager.on_llm_new_token(token, chunk=chunk)

            yield chunk

    async def _astream(
        self,
        messages: List[BaseMessage],
        stop: Optional[List[str]] = None,
        run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
        **kwargs: Any,
    ) -> AsyncIterator[ChatGenerationChunk]:
        """`stream` میتھڈ کی بے تناسبی ورژن کا عمل تنظیم ہوا
        result = await run_in_executor(
            None,
            self._stream,
            messages,
            stop=stop,
            run_manager=run_manager.get_sync() if run_manager else None,
            **kwargs,
        )
        for chunk in result:
            yield chunk
        """
        for chunk in result:
            yield chunk

    @property
    def _llm_type(self) -> str:
        """کسٹم ماڈل کے ٹیگ واپس کریں"""
        return "echoing-chat-model-advanced"

    @property
    def _identifying_params(self) -> Dict[str, Any]:
        """خود مخصوص ڈیبگ معلومات کو واپس کریں"""
        return {"n": self.n}

کسٹم چیٹ ماڈل کی تجربہ ورزی

چلو آؤ کسٹم چیٹ ماڈل کا امتحان کریں، جیسے کہ invoke، batch، stream میتھڈز، اور غیر متعین سٹریم تنظیم کی تجربہ ورزی۔

model = CustomChatModelAdvanced(n=3)

model.invoke([HumanMessage(content="hello!")])

model.invoke("hello")

model.batch(["hello", "goodbye"])

for chunk in model.stream("cat"):
    print(chunk.content, end="|")

async for chunk in model.astream("cat"):
    print(chunk.content, end="|")

async for event in model.astream_events("cat", version="v1"):
    print(event)