From d03a1c39ab9fd9c7a67ca0b03763aff9a95b1100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Kirst=C3=A4tter?= <7329802+jochenkirstaetter@users.noreply.github.com> Date: Mon, 18 Mar 2024 21:45:46 +0400 Subject: [PATCH] bump version; update readme and changelog --- README.md | 59 ++++++++++++++++++++++ docs/GeminiTunedModels.png | Bin 0 -> 34066 bytes src/Mscc.GenerativeAI.Google/CHANGELOG.md | 6 +++ src/Mscc.GenerativeAI.Web/CHANGELOG.md | 6 +++ src/Mscc.GenerativeAI/CHANGELOG.md | 20 ++++++++ 5 files changed, 91 insertions(+) create mode 100644 docs/GeminiTunedModels.png diff --git a/README.md b/README.md index d95969d..2b1333b 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,65 @@ _ = await chat.SendMessage("Lastly, give a thorough definition for a CS graduate chat.History.ForEach(c => Console.WriteLine($"{c.Role}: {c.Parts[0].Text}")); ``` +### Create a tuned model + +The Gemini API lets you tune models on your own data. Since it's your data and your tuned models this needs stricter access controls than API-Keys can provide. + +Before you can create a tuned model, you'll need to [setup OAuth for your project](https://ai.google.dev/palm_docs/oauth_quickstart). + +```csharp +using Mscc.GenerativeAI; + +var projectId = "your_google_project_id"; // the ID of a project, not its name. +var accessToken = "your_access_token"; // use `gcloud auth application-default print-access-token` to get it. +var model = new GenerativeModel(apiKey: null, model: Model.Gemini10Pro001) +{ + AccessToken = accessToken, + ProjectId = projectId +}; +var request = new CreateTunedModelRequest() +{ + BaseModel = $"models/{Model.Gemini10Pro001}", + DisplayName = "Autogenerated Test model", + TuningTask = new() + { + Hyperparameters = new() { BatchSize = 2, LearningRate = 0.001f, EpochCount = 3 }, + TrainingData = new() + { + Examples = new() + { + Examples = new() + { + new TrainingDataExample() { TextInput = "1", Output = "2" }, + new TrainingDataExample() { TextInput = "3", Output = "4" }, + new TrainingDataExample() { TextInput = "-3", Output = "-2" }, + new TrainingDataExample() { TextInput = "twenty two", Output = "twenty three" }, + new TrainingDataExample() { TextInput = "two hundred", Output = "two hundred one" }, + new TrainingDataExample() { TextInput = "ninety nine", Output = "one hundred" }, + new TrainingDataExample() { TextInput = "8", Output = "9" }, + new TrainingDataExample() { TextInput = "-98", Output = "-97" }, + new TrainingDataExample() { TextInput = "1,000", Output = "1,001" }, + new TrainingDataExample() { TextInput = "thirteen", Output = "fourteen" }, + new TrainingDataExample() { TextInput = "seven", Output = "eight" }, + } + } + } + } +}; + +// Act +var response = await model.CreateTunedModel(request); +Console.WriteLine($"Name: {response.Name}"); +Console.WriteLine($"Model: {response.Metadata.TunedModel} (Steps: {response.Metadata.TotalSteps})"); +``` +(This is still work in progress but operational. Future release will provide types to simplify the create request.) + +Tuned models appear in your Google AI Studio library. + +[![Tuned models are listed below My Library in Google AI Studio](./docs/GeminiTunedModels.png)](https://aistudio.google.com/app/library) + +### More samples + The folders [samples](./samples/) and [tests](./tests/) contain more examples. - [Simple console application](./samples/Console.Minimal.Prompt/) diff --git a/docs/GeminiTunedModels.png b/docs/GeminiTunedModels.png new file mode 100644 index 0000000000000000000000000000000000000000..e76f0ddd63cf2a63f9b6463a483a09b607937bd8 GIT binary patch literal 34066 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 literal 0 HcmV?d00001 diff --git a/src/Mscc.GenerativeAI.Google/CHANGELOG.md b/src/Mscc.GenerativeAI.Google/CHANGELOG.md index a738455..cc89320 100644 --- a/src/Mscc.GenerativeAI.Google/CHANGELOG.md +++ b/src/Mscc.GenerativeAI.Google/CHANGELOG.md @@ -11,6 +11,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed ### Fixed +## 0.7.1 + +### Changed + +- bump version + ## 0.7.0 ### Added diff --git a/src/Mscc.GenerativeAI.Web/CHANGELOG.md b/src/Mscc.GenerativeAI.Web/CHANGELOG.md index 7c0bc39..6047678 100644 --- a/src/Mscc.GenerativeAI.Web/CHANGELOG.md +++ b/src/Mscc.GenerativeAI.Web/CHANGELOG.md @@ -11,6 +11,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed ### Fixed +## 0.7.1 + +### Changed + +- bump version + ## 0.5.1 ### Changed diff --git a/src/Mscc.GenerativeAI/CHANGELOG.md b/src/Mscc.GenerativeAI/CHANGELOG.md index a0aa862..67ce235 100644 --- a/src/Mscc.GenerativeAI/CHANGELOG.md +++ b/src/Mscc.GenerativeAI/CHANGELOG.md @@ -8,9 +8,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added + +- provide types to simplify creation of tuned model + ### Changed ### Fixed +## 0.7.1 + +### Added + +- implement model tuning (works with stable models only) + - text-bison-001 + - gemini-1.0-pro-001 +- tests for model tuning +- +### Changed + +- improved authentication regarding API key or OAuth/ADC +- added scope https://www.googleapis.com/auth/generative-language.tuning +- harmonized version among NuGet packages +- provide empty response on Safety stop +- merged regular and tuned ModelResponse + ## 0.7.0 ### Added