ডটপ্রম্পট দিয়ে প্রম্পট পরিচালনা করা

Firebase Genkit ডটপ্রম্পট প্লাগইন এবং টেক্সট ফরম্যাট প্রদান করে যাতে আপনি আপনার জেনারেটিভ এআই প্রম্পট লিখতে এবং সংগঠিত করতে সাহায্য করেন।

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

ডটপ্রম্পট ব্যবহার করতে, প্রথমে আপনার প্রোজেক্ট রুটে একটি prompts ডিরেক্টরি তৈরি করুন এবং তারপর সেই ডিরেক্টরিতে একটি .prompt ফাইল তৈরি করুন। এখানে একটি সাধারণ উদাহরণ যাকে আপনি greeting.prompt বলতে পারেন:

---
model: vertexai/gemini-1.5-flash
config:
  temperature: 0.9
input:
  schema:
    location: string
    style?: string
    name?: string
  default:
    location: a restaurant
---

You are the world's most welcoming AI assistant and are currently working at {{location}}.

Greet a guest{{#if name}} named {{name}}{{/if}}{{#if style}} in the style of {{style}}{{/if}}.

এই প্রম্পটটি ব্যবহার করতে, dotprompt প্লাগইনটি ইনস্টল করুন:

go get github.com/firebase/genkit/go/plugins/dotprompt

তারপর, Open ব্যবহার করে প্রম্পট লোড করুন:

import "github.com/firebase/genkit/go/plugins/dotprompt"
dotprompt.SetDirectory("prompts")
prompt, err := dotprompt.Open("greeting")

আপনি টেমপ্লেট রেন্ডার করার জন্য প্রম্পটের Generate পদ্ধতিতে কল করতে পারেন এবং এটিকে এক ধাপে মডেল API-এ পাস করতে পারেন:

ctx := context.Background()

// Default to the project in GCLOUD_PROJECT and the location "us-central1".
vertexai.Init(ctx, nil)

// The .prompt file specifies vertexai/gemini-1.5-flash, which is
// automatically defined by Init(). However, if it specified a model that
// isn't automatically loaded (such as a specific version), you would need
// to define it here:
// vertexai.DefineModel("gemini-1.0-pro-002", &ai.ModelCapabilities{
// 	Multiturn:  true,
// 	Tools:      true,
// 	SystemRole: true,
// 	Media:      false,
// })

type GreetingPromptInput struct {
	Location string `json:"location"`
	Style    string `json:"style"`
	Name     string `json:"name"`
}
response, err := prompt.Generate(
	ctx,
	&dotprompt.PromptRequest{
		Variables: GreetingPromptInput{
			Location: "the beach",
			Style:    "a fancy pirate",
			Name:     "Ed",
		},
	},
	nil,
)
if err != nil {
	return err
}

fmt.Println(response.Text())

অথবা শুধু একটি স্ট্রিং এ টেমপ্লেট রেন্ডার করুন:

renderedPrompt, err := prompt.RenderText(map[string]any{
	"location": "a restaurant",
	"style":    "a pirate",
})

ডটপ্রম্পটের সিনট্যাক্স হ্যান্ডেলবার টেমপ্লেটিং ভাষার উপর ভিত্তি করে। আপনি if , unless , এবং each সাহায্যকারী আপনার প্রম্পটে শর্তসাপেক্ষ অংশ যোগ করতে বা কাঠামোগত বিষয়বস্তুর মাধ্যমে পুনরাবৃত্তি করতে ব্যবহার করতে পারেন। ফাইল ফর্ম্যাটটি টেমপ্লেটের সাথে একটি প্রম্পট ইনলাইনের জন্য মেটাডেটা প্রদান করতে YAML ফ্রন্টম্যাটার ব্যবহার করে।

Picoschema দিয়ে ইনপুট/আউটপুট স্কিমা সংজ্ঞায়িত করা

ডটপ্রম্পটে একটি কমপ্যাক্ট, YAML-ভিত্তিক স্কিমা সংজ্ঞা বিন্যাস রয়েছে যাকে বলা হয় Picoschema নামক LLM ব্যবহারের জন্য একটি স্কিমার সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করা সহজ করতে। এখানে একটি নিবন্ধের জন্য একটি স্কিমার একটি উদাহরণ:

schema:
  title: string # string, number, and boolean types are defined like this
  subtitle?: string # optional fields are marked with a `?`
  draft?: boolean, true when in draft state
  status?(enum, approval status): [PENDING, APPROVED]
  date: string, the date of publication e.g. '2024-04-09' # descriptions follow a comma
  tags(array, relevant tags for article): string # arrays are denoted via parentheses
  authors(array):
    name: string
    email?: string
  metadata?(object): # objects are also denoted via parentheses
    updatedAt?: string, ISO timestamp of last update
    approvedBy?: integer, id of approver
  extra?: any, arbitrary extra data
  (*): string, wildcard field

উপরের স্কিমাটি নিম্নলিখিত JSON স্কিমার সমতুল্য:

{
  "properties": {
    "metadata": {
      "properties": {
        "updatedAt": {
          "type": "string",
          "description": "ISO timestamp of last update"
        },
        "approvedBy": {
          "type": "integer",
          "description": "id of approver"
        }
      },
      "type": "object"
    },
    "title": {
      "type": "string"
    },
    "subtitle": {
      "type": "string"
    },
    "draft": {
      "type": "boolean",
      "description": "true when in draft state"
    },
    "date": {
      "type": "string",
      "description": "the date of publication e.g. '2024-04-09'"
    },
    "tags": {
      "items": {
        "type": "string"
      },
      "type": "array",
      "description": "relevant tags for article"
    },
    "authors": {
      "items": {
        "properties": {
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string"
          }
        },
        "type": "object",
        "required": ["name"]
      },
      "type": "array"
    }
  },
  "type": "object",
  "required": ["title", "date", "tags", "authors"]
}

Picoschema স্কেলার ধরনের string , integer , number , boolean এবং any সমর্থন করে। অবজেক্ট, অ্যারে এবং এনামগুলির ক্ষেত্রে ক্ষেত্রের নামের পরে একটি বন্ধনী দ্বারা চিহ্নিত করা হয়।

Picoschema দ্বারা সংজ্ঞায়িত অবজেক্টের প্রয়োজনীয় সমস্ত বৈশিষ্ট্য আছে যদি না দ্বারা ঐচ্ছিকভাবে চিহ্নিত করা হয় ? , এবং অতিরিক্ত বৈশিষ্ট্যের অনুমতি দেবেন না। যখন একটি সম্পত্তি ঐচ্ছিক হিসাবে চিহ্নিত করা হয়, তখন একটি ক্ষেত্র বাদ দেওয়ার পরিবর্তে LLM-গুলিকে নাল রিটার্ন করার জন্য আরও সহনশীলতা প্রদানের জন্য এটি বাতিলযোগ্য করা হয়।

একটি বস্তুর সংজ্ঞায়, বিশেষ কী (*) একটি "ওয়াইল্ডকার্ড" ক্ষেত্রের সংজ্ঞা ঘোষণা করতে ব্যবহার করা যেতে পারে। এটি একটি স্পষ্ট কী দ্বারা সরবরাহ করা হয় না এমন কোনও অতিরিক্ত বৈশিষ্ট্যের সাথে মিলবে৷

Picoschema সম্পূর্ণ JSON স্কিমার অনেক ক্ষমতা সমর্থন করে না। আপনার যদি আরও শক্তিশালী স্কিমার প্রয়োজন হয়, আপনি পরিবর্তে একটি JSON স্কিমা সরবরাহ করতে পারেন:

output:
  schema:
    type: object
    properties:
      field1:
        type: number
        minimum: 20

প্রম্পট মেটাডেটা ওভাররাইডিং

যদিও .prompt ফাইলগুলি আপনাকে ফাইলের মধ্যেই মডেল কনফিগারেশনের মতো মেটাডেটা এম্বেড করার অনুমতি দেয়, আপনি প্রতি কলের ভিত্তিতে এই মানগুলি ওভাররাইড করতে পারেন:

// Make sure you set up the model you're using.
vertexai.DefineModel("gemini-1.5-flash", nil)

response, err := prompt.Generate(
	context.Background(),
	&dotprompt.PromptRequest{
		Variables: GreetingPromptInput{
			Location: "the beach",
			Style:    "a fancy pirate",
			Name:     "Ed",
		},
		Model: "vertexai/gemini-1.5-flash",
		Config: &ai.GenerationCommonConfig{
			Temperature: 1.0,
		},
	},
	nil,
)

মাল্টি-মেসেজ প্রম্পট

ডিফল্টরূপে, ডটপ্রম্পট একটি "user" ভূমিকা সহ একটি একক বার্তা তৈরি করে। কিছু প্রম্পট একাধিক বার্তার সংমিশ্রণ হিসাবে ভালভাবে প্রকাশ করা হয়, যেমন একটি সিস্টেম প্রম্পট।

{% verbatim %}{% endverbatim %} সাহায্যকারী মাল্টি-মেসেজ প্রম্পট তৈরি করার একটি সহজ উপায় প্রদান করে:

---
model: vertexai/gemini-1.5-flash
input:
  schema:
    userQuestion: string
---

{{role "system"}}
You are a helpful AI assistant that really loves to talk about food. Try to work
food items into all of your conversations.
{{role "user"}}
{{userQuestion}}

মাল্টি-মডেল প্রম্পট

যে মডেলগুলি মাল্টিমোডাল ইনপুট সমর্থন করে যেমন পাঠ্যের পাশাপাশি ছবি, আপনি {% verbatim %}{% endverbatim %} ব্যবহার করতে পারেন {% verbatim %}{% endverbatim %} সহায়ক:

---
model: vertexai/gemini-1.5-flash
input:
  schema:
    photoUrl: string
---

Describe this image in a detailed paragraph:

{{media url=photoUrl}}

URL হতে পারে https:// অথবা base64-এনকোডেড data: "ইনলাইন" ছবি ব্যবহারের জন্য URI. কোডে, এটি হবে:

dotprompt.SetDirectory("prompts")
describeImagePrompt, err := dotprompt.Open("describe_image")
if err != nil {
	return err
}

imageBytes, err := os.ReadFile("img.jpg")
if err != nil {
	return err
}
encodedImage := base64.StdEncoding.EncodeToString(imageBytes)
dataURI := "data:image/jpeg;base64," + encodedImage

type DescribeImagePromptInput struct {
	PhotoUrl string `json:"photo_url"`
}
response, err := describeImagePrompt.Generate(
	context.Background(),
	&dotprompt.PromptRequest{Variables: DescribeImagePromptInput{
		PhotoUrl: dataURI,
	}},
	nil,
)

প্রম্পট বৈকল্পিক

যেহেতু প্রম্পট ফাইলগুলি কেবলমাত্র পাঠ্য, আপনি সেগুলিকে আপনার সংস্করণ নিয়ন্ত্রণ সিস্টেমে প্রতিশ্রুতিবদ্ধ করতে পারেন (এবং উচিত!) যাতে আপনি সময়ের সাথে সাথে পরিবর্তনগুলি সহজেই তুলনা করতে পারেন৷ প্রায়শই, প্রম্পটগুলির টুইক করা সংস্করণগুলি বিদ্যমান সংস্করণগুলির সাথে পাশাপাশি উত্পাদন পরিবেশে সম্পূর্ণরূপে পরীক্ষা করা যেতে পারে। ডটপ্রম্পট এর বৈকল্পিক বৈশিষ্ট্যের মাধ্যমে এটি সমর্থন করে।

একটি ভেরিয়েন্ট তৈরি করতে, একটি [name].[variant].prompt ফাইল তৈরি করুন। উদাহরণস্বরূপ, আপনি যদি আপনার প্রম্পটে জেমিনি 1.5 ফ্ল্যাশ ব্যবহার করেন কিন্তু দেখতে চান যে জেমিনি 1.5 প্রো আরও ভাল পারফর্ম করবে কিনা, আপনি দুটি ফাইল তৈরি করতে পারেন:

  • my_prompt.prompt : "বেসলাইন" প্রম্পট
  • my_prompt.geminipro.prompt : "geminipro" নামের একটি বৈকল্পিক

একটি প্রম্পট বৈকল্পিক ব্যবহার করতে, লোড করার সময় বৈকল্পিকটি নির্দিষ্ট করুন:

describeImagePrompt, err := dotprompt.OpenVariant("describe_image", "geminipro")

প্রম্পট লোডার সেই নামের ভেরিয়েন্টটি লোড করার চেষ্টা করবে এবং যদি কোনোটিই না থাকে তাহলে বেসলাইনে ফিরে যাবে। এর মানে আপনি আপনার আবেদনের জন্য যে কোন মানদণ্ডের উপর ভিত্তি করে শর্তসাপেক্ষ লোডিং ব্যবহার করতে পারেন:

var myPrompt *dotprompt.Prompt
var err error
if isBetaTester(user) {
	myPrompt, err = dotprompt.OpenVariant("describe_image", "geminipro")
} else {
	myPrompt, err = dotprompt.Open("describe_image")
}

ভেরিয়েন্টের নাম জেনারেশন ট্রেসের মেটাডেটাতে অন্তর্ভুক্ত করা হয়েছে, তাই আপনি Genkit ট্রেস ইন্সপেক্টরের ভেরিয়েন্টের মধ্যে প্রকৃত কর্মক্ষমতা তুলনা করতে এবং বৈসাদৃশ্য করতে পারেন।