การเขียนปลั๊กอินโมเดล Genkit

ปลั๊กอินโมเดล Genkit จะเพิ่มโมเดล Generative AI อย่างน้อย 1 รายการลงใน Genkit รีจิสทรี โมเดลแสดงถึงโมเดล Generative ทั้งหมดที่สามารถรับ พรอมต์เป็นอินพุตและสร้างข้อความ สื่อ หรือข้อมูลเป็นเอาต์พุต

ก่อนเริ่มต้น

อ่านการเขียนปลั๊กอิน Genkit เพื่อดูข้อมูลเกี่ยวกับการเขียน ปลั๊กอิน Genkit รวมถึงปลั๊กอินโมเดล โดยเฉพาะอย่างยิ่ง โปรดทราบว่า ปลั๊กอินทุกตัวจะต้องส่งออกฟังก์ชัน Init ซึ่งคาดว่าผู้ใช้จะเรียกใช้ ก่อนใช้ปลั๊กอิน

คำจำกัดความของโมเดล

โดยทั่วไป ปลั๊กอินโมเดลจะทำการเรียก ai.DefineModel อย่างน้อย 1 ครั้งใน Init - 1 ครั้งต่อโมเดลที่ปลั๊กอินจะมีอินเทอร์เฟซให้ เป็น

คำจำกัดความของโมเดลประกอบด้วย 3 องค์ประกอบดังนี้

  1. ข้อมูลเมตาที่ประกาศความสามารถของโมเดล
  2. ประเภทการกำหนดค่าที่มีพารามิเตอร์เฉพาะที่โมเดลรองรับ
  3. ฟังก์ชันการสร้างที่ยอมรับ ai.GenerateRequest และแสดงผล ai.GenerateResponse คาดว่ากำลังใช้โมเดล AI ในการสร้างรายการหลัง

ในระดับสูง โค้ดจะมีลักษณะดังนี้

type MyModelConfig struct {
	ai.GenerationCommonConfig
	CustomOption int
	AnotherCustomOption string
}
ai.DefineModel(
	providerID, "my-model",
	&ai.ModelMetadata{
		Label: "my-model",
		Supports: ai.ModelCapabilities{
			Multiturn:  true,  // Does the model support multi-turn chats?
			SystemRole: true,  // Does the model support syatem messages?
			Media:      false, // Can the model accept media input?
			Tools:      false, // Does the model support function calling (tools)?
		},
	},
	func(ctx context.Context,
		genRequest *ai.GenerateRequest,
		_ ai.ModelStreamingCallback,
	) (*ai.GenerateResponse, error) {
		// Verify that the request includes a configuration that conforms to
		// your schema .
		if _, ok := genRequest.Config.(MyModelConfig); !ok {
			return nil, fmt.Errorf("request config must be type MyModelConfig")
		}

		// Use your custom logic to convert Genkit's ai.GenerateRequest
		// into a form usable by the model's native API.
		apiRequest, err := apiRequestFromGenkitRequest(genRequest)
		if err != nil {
			return nil, err
		}

		// Send the request to the model API, using your own code or the
		// model API's client library.
		apiResponse, err := callModelAPI(apiRequest)
		if err != nil {
			return nil, err
		}

		// Use your custom logic to convert the model's response to Genkin's
		// ai.GenerateResponse.
		response, err := genResponseFromAPIResponse(apiResponse)
		if err != nil {
			return nil, err
		}

		return response, nil
	},
)

ประกาศความสามารถของโมเดล

ทุกคำจำกัดความโมเดลต้องมีข้อมูลเมตาเป็นส่วนหนึ่งของ ค่า ai.ModelCapabilities ที่ประกาศฟีเจอร์ที่โมเดลรองรับ Genkit ใช้ข้อมูลนี้เพื่อระบุพฤติกรรมบางอย่าง เช่น การยืนยัน อินพุตบางรายการที่ถูกต้องสำหรับโมเดลหรือไม่ ตัวอย่างเช่น หากโมเดล ไม่รองรับการโต้ตอบแบบมัลติเทิร์น การรับส่งข้อความถือเป็นข้อผิดพลาด ประวัติการเข้าชม

โปรดทราบว่าประกาศเหล่านี้อ้างถึงความสามารถของโมเดลตามที่ระบุไว้ ได้ด้วยตนเอง และไม่จำเป็นต้องแมปแบบ 1 ต่อ 1 เข้ากับความสามารถของ โมเดลและ API โมเดลที่เกี่ยวข้อง ตัวอย่างเช่น แม้ว่าโมเดล API จะไม่ ระบุวิธีที่เจาะจงในการกำหนดข้อความของระบบ ปลั๊กอินของคุณอาจยังคง ประกาศการสนับสนุนสำหรับบทบาทของระบบ และนำไปใช้เป็นตรรกะพิเศษ แทรกข้อความของระบบลงในข้อความแจ้งของผู้ใช้

การกำหนดสคีมาการกำหนดค่าของโมเดล

หากต้องการระบุตัวเลือกการสร้างที่โมเดลรองรับ ให้กำหนดและส่งออก ประเภทการกำหนดค่า Genkit มีประเภท ai.GenerationCommonConfig ที่มี ตัวเลือกที่มักได้รับการรองรับโดยบริการโมเดล Generative AI ซึ่งคุณ ฝังหรือใช้ทันที

ฟังก์ชันการสร้างของคุณควรยืนยันว่าคำขอมี ประเภทตัวเลือก

การเปลี่ยนรูปแบบคําขอและคําตอบ

ฟังก์ชันการสร้างจะทำงานหลักของปลั๊กอินโมเดล Genkit ดังนี้ การเปลี่ยนรูปแบบ ai.GenerateRequest จากรูปแบบทั่วไปของ Genkit เป็นรูปแบบ ที่รองรับโดย API ของโมเดล จากนั้นจะเปลี่ยนรูปแบบการตอบสนองจาก โมเดลของคุณให้อยู่ในรูปแบบ ai.GenerateResponse ที่ Genkit ใช้

ในบางครั้ง การทำเช่นนี้อาจต้องใช้การนวดหรือจัดการข้อมูลเพื่อทำงานกับโมเดล เช่น หากโมเดลของคุณไม่รองรับ system ตั้งแต่ต้น คุณอาจต้องเปลี่ยนรูปแบบข้อความของระบบของข้อความแจ้งเป็นโมเดลผู้ใช้ คู่ข้อความ

การส่งออก

นอกเหนือจากทรัพยากรที่ปลั๊กอินทั้งหมดต้องส่งออกแล้ว Init และประเภท Config ปลั๊กอินโมเดลควรส่งออกฟังก์ชัน ดังต่อไปนี้:

  • ประเภทการกำหนดค่าการสร้างตามที่กล่าวข้างต้น

  • ฟังก์ชัน Model ซึ่งจะแสดงผลการอ้างอิงไปยังโมเดลที่กำหนดของปลั๊กอิน ซึ่งบ่อยครั้งที่เหตุการณ์เช่นนี้มักเป็น:

    func Model(name string) *ai.Model {
        return ai.LookupModel(providerID, name)
    }
    
  • ไม่บังคับ: ฟังก์ชัน DefineModel ซึ่งช่วยให้ผู้ใช้กำหนดโมเดลที่ ปลั๊กอินของคุณนั้นมีให้ แต่ไม่ได้กำหนดโดยอัตโนมัติ มี มี 2 เหตุผลหลักที่คุณอาจต้องการใช้ฟังก์ชันดังกล่าว:

    • ปลั๊กอินของคุณให้สิทธิ์เข้าถึงโมเดลจำนวนมากเกินกว่าที่จะลงทะเบียนแต่ละโมเดลในทางปฏิบัติ ข้อแรก ตัวอย่างเช่น ปลั๊กอิน Ollama สามารถให้สิทธิ์การเข้าถึง รุ่นต่างๆ โดยเพิ่มบ่อยขึ้น ด้วยเหตุนี้ ระบบจึงไม่ กำหนดรูปแบบทั้งหมดโดยอัตโนมัติ และกำหนดให้ผู้ใช้เรียกใช้ DefineModel สำหรับแต่ละโมเดลที่ต้องการใช้

    • เพื่อให้ผู้ใช้ของคุณสามารถใช้โมเดลที่ออกใหม่ ยังไม่ได้เพิ่มลงในปลั๊กอินของคุณ

    โดยทั่วไปแล้ว ฟังก์ชัน DefineModel ของปลั๊กอินจะเป็นฟรอนท์เอนด์ของ ai.DefineModel ที่กำหนดฟังก์ชันการสร้าง แต่อนุญาตให้ผู้ใช้ระบุชื่อโมเดล และความสามารถของโมเดล