check: description, externalSourceName, key
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 35/100
Direzione di ricerca
Inizia in src/Chroma/src/ChromaVectorCollection.cs, in AddAsync, dove TODO contrassegna description, externalSourceName e key nella costruzione di MemoryRecord. Leggi l’utilizzo di MemoryRecord e MemoryRecordMetadata disponibile in questo repository e verifica quali valori dovrebbero ricevere questi campi; il lavoro è completato quando i tre campi non sono più irrisolti e la collection continua a preservare gli identificatori degli elementi e i metadati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
using System.Text.Json;
using System.Text.Json.Serialization;
using LangChain.Databases.JsonConverters;
using Microsoft.SemanticKernel.Connectors.Chroma;
using Microsoft.SemanticKernel.Memory;
namespace LangChain.Databases.Chroma;
/// <summary>
/// ChromaDB vector collection.
/// According: https://api.python.langchain.com/en/latest/_modules/langchain/vectorstores/chroma.html
/// </summary>
public class ChromaVectorCollection(
ChromaMemoryStore store,
string name = VectorCollection.DefaultName,
string? id = null)
: VectorCollection(name, id), IVectorCollection
{
// TODO: SemanticKernel impl doesn't support collection metadata. Need changes when moved to another impl
//private Dictionary<string, string> CollectionMetadata { get; } = [];
/// <inheritdoc />
public async Task<Vector?> GetAsync(string id, CancellationToken cancellationToken = default)
{
var record = await store.GetAsync(Name, id, withEmbedding: true, cancellationToken: cancellationToken).ConfigureAwait(false);
if (record == null)
{
return null;
}
var text = record.Metadata.Text;
var metadata = DeserializeMetadata(record.Metadata);
return new Vector
{
Text = text,
Metadata = metadata,
};
}
/// <inheritdoc />
public async Task<bool> DeleteAsync(
IEnumerable<string> ids,
CancellationToken cancellationToken = default)
{
await store.RemoveBatchAsync(Name, ids, cancellationToken).ConfigureAwait(false);
return true;
}
private static float SelectRelevanceScoreFn(float distance)
{
//const string distanceKey = "hnsw:space";
var distanceType = "l2";
//if (CollectionMetadata.TryGetValue(distanceKey, out var value))
//{
// distanceType = value;
//}
return distanceType switch
{
"cosine" => RelevanceScoreFunctions.Cosine(distance),
"l2" => RelevanceScoreFunctions.Euclidean(distance),
"ip" => RelevanceScoreFunctions.MaxInnerProduct(distance),
_ => throw new ArgumentException(
$@"No supported normalization function for distance metric of type: {distanceType}.
Consider providing relevance_score_fn to Chroma constructor.")
};
}
/// <inheritdoc />
public async Task<IReadOnlyCollection<string>> AddAsync(
IReadOnlyCollection<Vector> items,
CancellationToken cancellationToken = default)
{
items = items ?? throw new ArgumentNullException(nameof(items));
var records = new MemoryRecord[items.Count];
for (var index = 0; index < items.Count; index++)
{
var item = items.ElementAt(index);
// TODO: check: description, externalSourceName, key
records[index] = new MemoryRecord
(
new MemoryRecordMetadata
(
isReference: false,
id: item.Id,
text: item.Text,
description: string.Empty,
externalSourceName: string.Empty,
additionalMetadata: SerializeMetadata(item.Metadata ?? new Dictionary<string, object>())
),
new ReadOnlyMemory<float>(item.Embedding ?? []),
key: null
);
}
var resultIds = new List<string>(items.Count);
var resultIdsIterator = store.UpsertBatchAsync(Name, records, cancellationToken);
await foreach (var item in resultIdsIterator.ConfigureAwait(false))
{
resultIds.Add(item);
}
return resultIds;
}
/// <inheritdoc />
public async Task<VectorSearchResponse> SearchAsync(
VectorSearchRequest request,
VectorSearchSettings? settings = default,
CancellationToken cancellationToken = default)
{
request = request ?? throw new ArgumentNullException(nameof(request));
settings ??= new VectorSearchSettings();
settings.RelevanceScoreFunc ??= SelectRelevanceScoreFn;
var matches = await store
.GetNearestMatchesAsync(
collectionName: Name,
embedding: new System.ReadOnlyMemory<float>(request.Embeddings.First()),
limit: settings.NumberOfResults,
cancellationToken: cancellationToken)
.ToListAsync(cancellationToken)
.ConfigureAwait(false);
return new VectorSearchResponse
{
Items = matches
.Select(record =>
{
var text = record.Item1.Metadata.Text;
var metadata = DeserializeMetadata(record.Item1.Metadata);
return new Vector
{
Id = record.Item1.Metadata.Id,
Text = text,
Metadata = metadata,
Embedding = record.Item1.Embedding.ToArray(),
Distance = (float)record.Item2
};
})
.ToArray(),
};
}
/// <inheritdoc />
public Task<bool> IsEmptyAsync(CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}
private static string SerializeMetadata(IReadOnlyDictionary<string, object> metadata)
{
return JsonSerializer.Serialize(metadata, SourceGenerationContext.Default.IReadOnlyDictionaryStringObject);
}
private static IReadOnlyDictionary<string, object> DeserializeMetadata(MemoryRecordMetadata metadata)
{
return JsonSerializer.Deserialize(metadata.AdditionalMetadata, SourceGenerationContext.Default.IReadOnlyDictionaryStringObject)
?? new Dictionary<string, object>();
}
}
[JsonSourceGenerationOptions(Converters = [typeof(ObjectAsPrimitiveConverter)])]
[JsonSerializable(typeof(IReadOnlyDictionary<string, object>))]
[JsonSerializable(typeof(double))]
[JsonSerializable(typeof(float))]
[JsonSerializable(typeof(int))]
[JsonSerializable(typeof(decimal))]
internal sealed partial class SourceGenerationContext : JsonSerializerContext;
- Lingua principale
- C#
- Stelle
- 12
- Fork
- 8
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di tryAGI/LangChain.Databases
-
enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 20/100
-
Weaviate does not workApertabug dependencies documentation help wanted
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
tryAGI/LangChain.Databases#53 · 6 commenti ·
-
use async methodsApertatodo
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
-
review way to map metadataApertatodo
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
-
todo
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
Tutte le issue di tryAGI/LangChain.Databases
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
NethermindEth/nethermind#14012 ·
I maintainer di solito rispondono entro 1 giorno
-
dependencies Status: Triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
json-schema-org/website#2518 ·
I maintainer di solito rispondono entro 1 giorno
-
agentic-workflows
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
builtbybel/Flyoobe#498 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
builtbybel/CrapFixer#112 ·