109 lines
4.3 KiB
C#
109 lines
4.3 KiB
C#
using LLama.Abstractions;
|
|
using LLama.Native;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using LLama.Extensions;
|
|
|
|
namespace LLama
|
|
{
|
|
using llama_token = Int32;
|
|
|
|
/// <summary>
|
|
/// Assorted llama utilities
|
|
/// </summary>
|
|
public static class Utils
|
|
{
|
|
[Obsolete("Use LLamaWeights.LoadFromFile and LLamaWeights.CreateContext instead")]
|
|
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
|
public static SafeLLamaContextHandle InitLLamaContextFromModelParams(IModelParams @params)
|
|
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
|
|
{
|
|
using var weights = LLamaWeights.LoadFromFile(@params);
|
|
|
|
using (@params.ToLlamaContextParams(out var lparams))
|
|
return SafeLLamaContextHandle.Create(weights.NativeHandle, lparams);
|
|
}
|
|
|
|
[Obsolete("Use SafeLLamaContextHandle Tokenize method instead")]
|
|
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
|
public static IEnumerable<llama_token> Tokenize(SafeLLamaContextHandle ctx, string text, bool add_bos, Encoding encoding)
|
|
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
|
|
{
|
|
return ctx.Tokenize(text, add_bos, encoding);
|
|
}
|
|
|
|
[Obsolete("Use SafeLLamaContextHandle GetLogits method instead")]
|
|
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
|
public static Span<float> GetLogits(SafeLLamaContextHandle ctx, int length)
|
|
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
|
|
{
|
|
if (length != ctx.VocabCount)
|
|
throw new ArgumentException("length must be the VocabSize");
|
|
|
|
return ctx.GetLogits();
|
|
}
|
|
|
|
[Obsolete("Use SafeLLamaContextHandle Eval method instead")]
|
|
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
|
public static int Eval(SafeLLamaContextHandle ctx, llama_token[] tokens, int startIndex, int n_tokens, int n_past, int n_threads)
|
|
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
|
|
{
|
|
var slice = tokens.AsSpan().Slice(startIndex, n_tokens);
|
|
return ctx.Eval(slice, n_past, n_threads) ? 0 : 1;
|
|
}
|
|
|
|
[Obsolete("Use SafeLLamaContextHandle TokenToString method instead")]
|
|
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
|
public static string TokenToString(llama_token token, SafeLLamaContextHandle ctx, Encoding encoding)
|
|
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
|
|
{
|
|
return ctx.TokenToString(token, encoding);
|
|
}
|
|
|
|
[Obsolete("No longer used internally by LlamaSharp")]
|
|
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
|
public static string PtrToString(IntPtr ptr, Encoding encoding)
|
|
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
|
|
{
|
|
#if NET6_0_OR_GREATER
|
|
// ReSharper disable once PossibleUnintendedReferenceComparison
|
|
if(encoding == Encoding.UTF8)
|
|
{
|
|
return Marshal.PtrToStringUTF8(ptr)!;
|
|
}
|
|
// ReSharper disable once PossibleUnintendedReferenceComparison
|
|
else if(encoding == Encoding.Unicode)
|
|
{
|
|
return Marshal.PtrToStringUni(ptr)!;
|
|
}
|
|
else
|
|
{
|
|
return Marshal.PtrToStringAuto(ptr)!;
|
|
}
|
|
#else
|
|
unsafe
|
|
{
|
|
byte* tp = (byte*)ptr.ToPointer();
|
|
List<byte> bytes = new();
|
|
while (true)
|
|
{
|
|
byte c = *tp++;
|
|
if (c == '\0')
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
bytes.Add(c);
|
|
}
|
|
}
|
|
return encoding.GetString(bytes.ToArray());
|
|
}
|
|
#endif
|
|
}
|
|
|
|
}
|
|
}
|