Aracılığıyla paylaş


Alma Artırılmış Oluşturma (RAG) için eklentileri kullanma

Yapay zeka aracılarınızın genellikle topraklanmış yanıtlar oluşturmak için dış kaynaklardan veri alması gerekir. Bu ek bağlam olmadan yapay zeka aracılarınız halüsinasyon görüyor veya yanlış bilgi sağlıyor olabilir. Bu sorunu çözmek için eklentileri kullanarak dış kaynaklardan veri alabilirsiniz.

Alma Artırılmış Nesil (RAG) eklentilerini göz önünde bulundururken kendinize iki soru sormalısınız:

  1. Gerekli verileri nasıl "arayacaksınız" (veya yapay zeka temsilciniz) ? Anlamsal aramaya mı yoksa klasik aramaya mı ihtiyacınız var?
  2. Yapay zeka aracısının önceden ihtiyaç duyduğu verileri zaten biliyor musunuz (önceden getirilen veriler) veya yapay zeka aracısının verileri dinamik olarak alması mı gerekiyor?
  3. Verilerinizin güvenliğini nasıl sağlayacak ve hassas bilgilerin aşırı paylaşılmasını nasıl önleyeceksiniz?

Alma Artırılmış Nesil (RAG) için eklentiler geliştirirken iki tür arama kullanabilirsiniz: anlamsal arama ve klasik arama.

Anlamsal arama, yalnızca eşleşen anahtar sözcükler yerine sorgunun anlam ve bağlamına göre bilgileri anlamak ve almak için vektör veritabanlarını kullanır. Bu yöntem, arama altyapısının eş anlamlılar, ilgili kavramlar ve sorgunun ardındaki genel amaç gibi dilin nüanslarını kavramasını sağlar.

Anlamsal arama, kullanıcı sorgularının karmaşık, açık uçlu olduğu veya içeriğin daha derin anlaşılmasını gerektiren ortamlarda üstünlük sağlar. Örneğin, "fotoğraf için en iyi akıllı telefonlar" araması, yalnızca "en iyi", "akıllı telefonlar" ve "fotoğraf" sözcükleriyle eşleştirmek yerine akıllı telefonlardaki fotoğraf özelliklerinin bağlamını dikkate alan sonuçlar verir.

LLM'ye anlamsal arama işlevi sağlarken genellikle tek bir arama sorgusuyla işlev tanımlamanız yeterlidir. LLM daha sonra gerekli bilgileri almak için bu işlevi kullanır. Aşağıda, belirli bir sorguya benzer belgeleri bulmak için Azure AI Search kullanan bir anlamsal arama işlevi örneği verilmiştir.

using System.ComponentModel;
using System.Text.Json.Serialization;
using Azure;
using Azure.Search.Documents;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Models;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Embeddings;

public class InternalDocumentsPlugin
{
    private readonly ITextEmbeddingGenerationService _textEmbeddingGenerationService;
    private readonly SearchIndexClient _indexClient;

    public AzureAISearchPlugin(ITextEmbeddingGenerationService textEmbeddingGenerationService, SearchIndexClient indexClient)
    {
        _textEmbeddingGenerationService = textEmbeddingGenerationService;
        _indexClient = indexClient;
    }

    [KernelFunction("Search")]
    [Description("Search for a document similar to the given query.")]
    public async Task<string> SearchAsync(string query)
    {
        // Convert string query to vector
        ReadOnlyMemory<float> embedding = await _textEmbeddingGenerationService.GenerateEmbeddingAsync(query);

        // Get client for search operations
        SearchClient searchClient = _indexClient.GetSearchClient("default-collection");

        // Configure request parameters
        VectorizedQuery vectorQuery = new(embedding);
        vectorQuery.Fields.Add("vector");

        SearchOptions searchOptions = new() { VectorSearch = new() { Queries = { vectorQuery } } };

        // Perform search request
        Response<SearchResults<IndexSchema>> response = await searchClient.SearchAsync<IndexSchema>(searchOptions);

        // Collect search results
        await foreach (SearchResult<IndexSchema> result in response.Value.GetResultsAsync())
        {
            return result.Document.Chunk; // Return text from first result
        }

        return string.Empty;
    }

    private sealed class IndexSchema
    {
        [JsonPropertyName("chunk")]
        public string Chunk { get; set; }

        [JsonPropertyName("vector")]
        public ReadOnlyMemory<float> Vector { get; set; }
    }
}

Öznitelik tabanlı veya ölçüt tabanlı arama olarak da bilinen klasik arama, bir veri kümesindeki tam terimleri veya değerleri filtrelemeye ve eşleştirmeye dayanır. Özellikle veritabanı sorguları, envanter aramaları ve belirli özniteliklere göre filtrelemenin gerekli olduğu durumlar için etkilidir.

Örneğin, bir kullanıcı belirli bir müşteri kimliğine göre verilen tüm siparişleri bulmak veya belirli bir fiyat aralığı ve kategori içindeki ürünleri almak istiyorsa, klasik arama hassas ve güvenilir sonuçlar sağlar. Ancak klasik arama, bağlamı veya dildeki varyasyonları anlayamamasıyla sınırlıdır.

İpucu

Çoğu durumda mevcut hizmetleriniz zaten klasik aramayı destekler. Anlamsal arama gerçekleştirmeden önce, mevcut hizmetlerinizin yapay zeka aracılarınız için gerekli bağlamı sağlayıp sağlayamayacağını göz önünde bulundurun.

Örneğin, klasik aramayı kullanarak crm sisteminden müşteri bilgilerini alan bir eklentiyi ele alalım. Burada yapay zekanın gerekli bilgileri almak için işlevi müşteri kimliğiyle çağırması GetCustomerInfoAsync yeterlidir.

using System.ComponentModel;
using Microsoft.SemanticKernel;

public class CRMPlugin
{
    private readonly CRMService _crmService;

    public CRMPlugin(CRMService crmService)
    {
        _crmService = crmService;
    }

    [KernelFunction("GetCustomerInfo")]
    [Description("Retrieve customer information based on the given customer ID.")]
    public async Task<Customer> GetCustomerInfoAsync(string customerId)
    {
        return await _crmService.GetCustomerInfoAsync(customerId);
    }
}

Anlamsal arama ile aynı arama işlevini elde etmek, anlamsal sorguların belirleyici olmayan doğası nedeniyle mümkün olmayabilir veya pratik olmayabilir.

Her Birinin Ne Zaman Kullanılacağı

Anlamsal ve klasik arama arasında seçim, sorgunun yapısına bağlıdır. Kullanıcıların soru sorabileceği veya doğal dil kullanan ürünler arayabileceği bilgi bankası ve müşteri desteği gibi içerik açısından yoğun ortamlar için idealdir. Öte yandan duyarlık ve tam eşleşmeler önemli olduğunda klasik arama kullanılmalıdır.

Bazı senaryolarda, kapsamlı arama özellikleri sağlamak için her iki yaklaşımı da birleştirmeniz gerekebilir. Örneğin, bir e-ticaret mağazasında müşterilere yardımcı olan bir sohbet botu, kullanıcı sorgularını anlamak için anlamsal aramayı ve ürünleri fiyat, marka veya kullanılabilirlik gibi belirli özniteliklere göre filtrelemek için klasik aramayı kullanabilir.

Aşağıda, bir e-ticaret veritabanından ürün bilgilerini almak için anlamsal ve klasik aramayı birleştiren bir eklenti örneği verilmiştir.

using System.ComponentModel;
using Microsoft.SemanticKernel;

public class ECommercePlugin
{
    [KernelFunction("search_products")]
    [Description("Search for products based on the given query.")]
    public async Task<IEnumerable<Product>> SearchProductsAsync(string query, ProductCategories category = null, decimal? minPrice = null, decimal? maxPrice = null)
    {
        // Perform semantic and classic search with the given parameters
    }
}

Dinamik ve önceden getirilmiş veri alma karşılaştırması

Alma Artırılmış Nesil (RAG) için eklentiler geliştirirken, veri alma işleminin statik mi yoksa dinamik mi olduğunu da göz önünde bulundurmanız gerekir. Bu, yalnızca gerektiğinde verileri alarak yapay zeka aracılarınızın performansını iyileştirmenize olanak tanır.

Dinamik veri alma

Çoğu durumda, kullanıcı sorgusu yapay zeka aracısının alması gereken verileri belirler. Örneğin, bir kullanıcı iki farklı ürün arasındaki farkı isteyebilir. Daha sonra yapay zeka aracısının işlev çağrısını kullanarak yanıt oluşturmak için bir veritabanından veya API'den ürün bilgilerini dinamik olarak alması gerekir. Tüm olası ürün bilgilerini önceden getirmek ve yapay zeka aracısına vermek pratik olmaz.

Aşağıda, dinamik veri alımının gerekli olduğu bir kullanıcı ile yapay zeka aracısı arasında ileri geri sohbet örneği verilmiştir.

Role İleti
🔵Kullanıcı Bana en iyi yatakları anlatır mısın?
🔴Yardımcı (işlev çağrısı) Products.Search("mattresses")
🟢Araç [{"id": 25323, "name": "Cloud Nine"},{"id": 63633, "name": "Best Sleep"}]
🔴Asistan Emin! Hem Cloud Nine hem de En İyi Uyku'ya sahibiz
🔵Kullanıcı Aralarındaki fark nedir?
🔴Yardımcı (işlev çağrısı) Products.GetDetails(25323) Products.GetDetails(63633)
🟢Araç { "id": 25323, "name": "Cloud Nine", "price": 1000, "material": "Memory foam" }
🟢Araç { "id": 63633, "name": "Best Sleep", "price": 1200, "material": "Latex" }
🔴Asistan Cloud Nine, bellek köpüğünden yapılmıştır ve maliyeti 1000 ABD dolarıdır. En İyi Uyku lateksten yapılmıştır ve maliyeti 1200 ABD dolarıdır.

Önceden getirilen veri alma

Statik veri alma işlemi, dış kaynaklardan veri almayı ve her zaman yapay zeka aracısına sağlamayı içerir. Bu, veriler her istek için gerekli olduğunda veya veriler görece kararlı olduğunda ve sık sık değişmediğinde kullanışlıdır.

Örneğin, yerel hava durumu hakkındaki soruları her zaman yanıtlayan bir temsilciyi ele alalım. bir WeatherPluginsahip olduğunuzu varsayarsak, bir hava durumu API'sinden hava durumu verilerini önceden getirebilir ve sohbet geçmişinde sağlayabilirsiniz. Bu, aracının API'den veri istemek için zaman kaybetmeden hava durumuyla ilgili yanıtlar oluşturmasına olanak tanır.

using System.Text.Json;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;

IKernelBuilder builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(deploymentName, endpoint, apiKey);
builder.Plugins.AddFromType<WeatherPlugin>();
Kernel kernel = builder.Build();

// Get the weather
var weather = await kernel.Plugins.GetFunction("WeatherPlugin", "get_weather").InvokeAsync(kernel);

// Initialize the chat history with the weather
ChatHistory chatHistory = new ChatHistory("The weather is:\n" + JsonSerializer.Serialize(weather));

// Simulate a user message
chatHistory.AddUserMessage("What is the weather like today?");

// Get the answer from the AI agent
IChatCompletionService chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
var result = await chatCompletionService.GetChatMessageContentAsync(chatHistory);

Verilerin güvenliğini sağlama

Dış kaynaklardan veri alınırken verilerin güvenli olduğundan ve hassas bilgilerin açığa çıkarılmadığından emin olmak önemlidir. Hassas bilgilerin fazla paylaşılmasını önlemek için aşağıdaki stratejileri kullanabilirsiniz:

Strateji Açıklama
Kullanıcının kimlik doğrulama belirtecini kullanma Kullanıcıların bilgilerini almak için yapay zeka aracısı tarafından kullanılan hizmet sorumluları oluşturmaktan kaçının. Bunun yapılması, kullanıcının alınan bilgilere erişimi olduğunu doğrulamayı zorlaştırır.
Arama hizmetlerini yeniden oluşturmaktan kaçının Vektör veritabanı ile yeni bir arama hizmeti oluşturmadan önce, gerekli verileri içeren hizmet için zaten bir arama hizmeti olup olmadığını denetleyin. Mevcut hizmetleri yeniden kullanarak hassas içeriğin çoğaltılmasını önleyebilir, mevcut erişim denetimlerinden yararlanabilir ve yalnızca kullanıcının erişimi olan verileri döndüren mevcut filtreleme mekanizmalarını kullanabilirsiniz.
Başvurunun içerik yerine vektör DB'lerinde depolanması Hassas içeriği vektör DB'lerine çoğaltmak yerine, gerçek verilere yönelik başvuruları depolayabilirsiniz. Bir kullanıcının bu bilgilere erişebilmesi için kimlik doğrulama belirtecinin önce gerçek verileri almak için kullanılması gerekir.

Sonraki adımlar

Artık yapay zeka aracılarınızı dış kaynaklardan alınan verilerle nasıl temelleyebileceğinize göre, yapay zeka aracılarını kullanarak iş süreçlerini otomatikleştirmeyi öğrenebilirsiniz. Daha fazla bilgi edinmek için bkz . Görev otomasyonu işlevlerini kullanma.