| @@ -1,8 +1,6 @@ | |||
| using System.Text.RegularExpressions; | |||
| using LLama.Batched; | |||
| using LLama.Common; | |||
| using Spectre.Console; | |||
| using LLama.Abstractions; | |||
| using LLama.Native; | |||
| namespace LLama.Examples.Examples | |||
| @@ -20,9 +18,8 @@ namespace LLama.Examples.Examples | |||
| var prompt = $"{{{modelImage}}}\nUSER:\nProvide a full description of the image.\nASSISTANT:\n"; | |||
| var parameters = new ModelParams(modelPath) | |||
| { | |||
| }; | |||
| var parameters = new ModelParams(modelPath); | |||
| using var model = LLamaWeights.LoadFromFile(parameters); | |||
| using var context = model.CreateContext(parameters); | |||
| @@ -45,16 +42,16 @@ namespace LLama.Examples.Examples | |||
| var imageMatches = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | |||
| var imageCount = imageMatches.Count(); | |||
| var hasImages = imageCount > 0; | |||
| byte[][] imageBytes = null; | |||
| if (hasImages) | |||
| { | |||
| var imagePathsWithCurlyBraces = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | |||
| var imagePaths = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Groups[1].Value); | |||
| var imagePaths = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Groups[1].Value).ToList(); | |||
| List<byte[]> imageBytes; | |||
| try | |||
| { | |||
| imageBytes = imagePaths.Select(File.ReadAllBytes).ToArray(); | |||
| imageBytes = imagePaths.Select(File.ReadAllBytes).ToList(); | |||
| } | |||
| catch (IOException exception) | |||
| { | |||
| @@ -77,10 +74,7 @@ namespace LLama.Examples.Examples | |||
| foreach (var path in imagePathsWithCurlyBraces) | |||
| { | |||
| // First image replace to tag <image, the rest of the images delete the tag | |||
| if (index++ == 0) | |||
| prompt = prompt.Replace(path, "<image>"); | |||
| else | |||
| prompt = prompt.Replace(path, ""); | |||
| prompt = prompt.Replace(path, index++ == 0 ? "<image>" : ""); | |||
| } | |||
| @@ -105,7 +99,7 @@ namespace LLama.Examples.Examples | |||
| // | |||
| foreach (var image in imagePaths) | |||
| { | |||
| ex.Images.Add(File.ReadAllBytes(image)); | |||
| ex.Images.Add(await File.ReadAllBytesAsync(image)); | |||
| } | |||
| } | |||
| @@ -121,7 +115,7 @@ namespace LLama.Examples.Examples | |||
| // let the user finish with exit | |||
| // | |||
| if (prompt.Equals("/exit", StringComparison.OrdinalIgnoreCase)) | |||
| if (prompt != null && prompt.Equals("/exit", StringComparison.OrdinalIgnoreCase)) | |||
| break; | |||
| } | |||
| @@ -25,7 +25,7 @@ namespace LLama.Abstractions | |||
| public LLavaWeights? ClipModel { get; } | |||
| /// <summary> | |||
| /// List of images: Image filen path, uri or image byte array. See ImageData. | |||
| /// List of images: List of images in byte array format. | |||
| /// </summary> | |||
| public List<byte[]> Images { get; } | |||
| @@ -79,7 +79,7 @@ namespace LLama | |||
| public LLavaWeights? ClipModel { get; } | |||
| /// <inheritdoc /> | |||
| public List<byte[]> Images { get; set; } | |||
| public List<byte[]> Images { get; } | |||
| /// <summary> | |||
| /// Current "mu" value for mirostat sampling | |||
| @@ -2,9 +2,9 @@ | |||
| ```cs | |||
| using System.Text.RegularExpressions; | |||
| using LLama.Batched; | |||
| using LLama.Common; | |||
| using Spectre.Console; | |||
| using LLama.Native; | |||
| namespace LLama.Examples.Examples | |||
| { | |||
| @@ -21,11 +21,8 @@ namespace LLama.Examples.Examples | |||
| var prompt = $"{{{modelImage}}}\nUSER:\nProvide a full description of the image.\nASSISTANT:\n"; | |||
| var parameters = new ModelParams(modelPath) | |||
| { | |||
| ContextSize = 4096, | |||
| Seed = 1337, | |||
| }; | |||
| var parameters = new ModelParams(modelPath); | |||
| using var model = LLamaWeights.LoadFromFile(parameters); | |||
| using var context = model.CreateContext(parameters); | |||
| @@ -48,16 +45,16 @@ namespace LLama.Examples.Examples | |||
| var imageMatches = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | |||
| var imageCount = imageMatches.Count(); | |||
| var hasImages = imageCount > 0; | |||
| byte[][] imageBytes = null; | |||
| if (hasImages) | |||
| { | |||
| var imagePathsWithCurlyBraces = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | |||
| var imagePaths = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Groups[1].Value); | |||
| var imagePaths = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Groups[1].Value).ToList(); | |||
| List<byte[]> imageBytes; | |||
| try | |||
| { | |||
| imageBytes = imagePaths.Select(File.ReadAllBytes).ToArray(); | |||
| imageBytes = imagePaths.Select(File.ReadAllBytes).ToList(); | |||
| } | |||
| catch (IOException exception) | |||
| { | |||
| @@ -70,15 +67,17 @@ namespace LLama.Examples.Examples | |||
| break; | |||
| } | |||
| // Each prompt with images we clear cache | |||
| // When the prompt contains images we clear KV_CACHE to restart conversation | |||
| // See: | |||
| // https://github.com/ggerganov/llama.cpp/discussions/3620 | |||
| ex.Context.NativeHandle.KvCacheRemove( LLamaSeqId.Zero, -1, -1 ); | |||
| int index = 0; | |||
| foreach (var path in imagePathsWithCurlyBraces) | |||
| { | |||
| // First image replace to tag <image, the rest of the images delete the tag | |||
| if (index++ == 0) | |||
| prompt = prompt.Replace(path, "<image>"); | |||
| else | |||
| prompt = prompt.Replace(path, ""); | |||
| prompt = prompt.Replace(path, index++ == 0 ? "<image>" : ""); | |||
| } | |||
| @@ -101,7 +100,10 @@ namespace LLama.Examples.Examples | |||
| // Initilize Images in executor | |||
| // | |||
| ex.ImagePaths = imagePaths.ToList(); | |||
| foreach (var image in imagePaths) | |||
| { | |||
| ex.Images.Add(await File.ReadAllBytesAsync(image)); | |||
| } | |||
| } | |||
| Console.ForegroundColor = Color.White; | |||
| @@ -116,7 +118,7 @@ namespace LLama.Examples.Examples | |||
| // let the user finish with exit | |||
| // | |||
| if (prompt.Equals("/exit", StringComparison.OrdinalIgnoreCase)) | |||
| if (prompt != null && prompt.Equals("/exit", StringComparison.OrdinalIgnoreCase)) | |||
| break; | |||
| } | |||
| @@ -28,9 +28,9 @@ public interface ILLamaExecutor | |||
| public LLavaWeights? ClipModel { get; } | |||
| /// <summary> | |||
| /// List of images: Image filename and path (jpeg images). | |||
| /// List of images: List of images in byte array format. | |||
| /// </summary> | |||
| public List<string> ImagePaths { get; set; } | |||
| public List<byte[]> Images { get; } | |||
| /// <summary> | |||