UseFunctionInvoction возвращает бессмысленный выводC#

Место общения программистов C#
Anonymous
UseFunctionInvoction возвращает бессмысленный вывод

Сообщение Anonymous »

Я пытаюсь реализовать свой собственный AI-клиент чата с помощью Microsoft.Extensions.AI после прочтения документации по вызову функций на GitHub.
Я создал простой клиент чата, который должен ответить на какой-то конкретный вопрос, опираясь на информацию, содержащуюся в моих базах данных, с использованием модели phi4-mini и функции вызова функций.
Проблема в том, что во многих случаях выходные данные являются совершенно бессмысленными или чем-то похожим на вызов стека внутренних функций.
/>Это реализация:

Код: Выделить всё

var client = new OllamaChatClient(new Uri("http://locahost:11434/"), "phi4-mini")
.AsBuilder()
.UseFunctionInvocation() // Enable automatic function calling
.Build();

var chatOptions = new ChatOptions
{
Tools =
[
AIFunctionFactory.Create(GetSymbolFromOpenFigi),
AIFunctionFactory.Create(GetLastDailyPrice),
AIFunctionFactory.Create(GetToday)
],
};

var conversation = new List()
{
new(ChatRole.System,
"You are an internal assistant of a financial company called Contoso. Your main tasks are to answer questions about stocks or market data using the given functions."),
new(ChatRole.User,
"What is Bloomberg Id BBG000BBD070 symbol?"),
};
await foreach (var response in client.GetStreamingResponseAsync(conversation, chatOptions))
{
Console.Write(response.Text);
}

return;

[Description("Get a document containing all instrument properties inlcuding market symbol for or from a given Bloomberg Id (OpenFIGI)")]
static async Task GetSymbolFromOpenFigi([Description("Bloomberg Id (OpenFIGI) (e.g. BBG000BBD070)")] string bloombergId)
{
var dbClient = new MongoClient("mongodb://root:locahost@locahost:27017/");
var collection = dbClient.GetDatabase("identifiers").GetCollection("identifiers");

var filter = Builders.Filter.Eq("Identifier", bloombergId);
try
{
return (await collection.Find(filter).FirstOrDefaultAsync()).ToJson();
}
catch (Exception e)
{
Console.WriteLine(e);
return "Not found";
}
}

[Description("Get last market day price for a given Bloomberg Id (OpenFIGI)")]
static async Task GetLastDailyPrice([Description("Bloomberg Id (OpenFIGI) (e.g. BBG000BBD070)")]string bloombergId)
{
await using var conn =
new NpgsqlConnection(
"host=locahost;port=8812;username=admin;password=locahost;database=qdb;ServerCompatibilityMode=NoTypeLoading;GSS Encryption Mode=Disable");
await conn.OpenAsync();

var json = await GetRowAsJsonAsync(
conn,
$"select * from 1d where identifier = '{bloombergId}' order by 1 desc limit 1");

return json;
}

[Description("Get today UTC datetime")]
static string GetToday()
{
return DateTime.UtcNow.ToString(CultureInfo.InvariantCulture);
}

static async Task GetRowAsJsonAsync(
NpgsqlConnection conn,
string sql,
CancellationToken ct = default)
{
await using var cmd = new NpgsqlCommand(sql, conn);
await using var reader = await cmd.ExecuteReaderAsync(ct);

if (!await reader.ReadAsync(ct))
return null;

var row = new Dictionary();

for (var i = 0; i < reader.FieldCount; i++)
{
var value = await reader.IsDBNullAsync(i, ct)
? null
: reader.GetValue(i);

row[reader.GetName(i)] = value;
}

return JsonSerializer.Serialize(row);
}
Пример вывода:

Код: Выделить всё

??!????BBG000BBD070?????,??????_getSymbolFromOpenFigi???????
[Pause for effect as the assistant would perform the function internally]
??:??????,BBG000BBD070??????"AT&T Inc."??????????????,????????????T(American Tel)????????????????????????,?????,??????????????,????????????????????????????,????!
Почему это произошло? Я что-то игнорирую в реализации?

Вернуться в «C#»