{"id":3919,"date":"2024-12-06T11:32:15","date_gmt":"2024-12-06T19:32:15","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/semantic-kernel\/?p=3919"},"modified":"2024-12-10T10:49:15","modified_gmt":"2024-12-10T18:49:15","slug":"customer-case-study-how-to-use-elasticsearch-vector-store-connector-for-microsoft-semantic-kernel-for-ai-agent-development","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/agent-framework\/customer-case-study-how-to-use-elasticsearch-vector-store-connector-for-microsoft-semantic-kernel-for-ai-agent-development\/","title":{"rendered":"Customer Case Study: How to use Elasticsearch Vector Store Connector for Microsoft Semantic Kernel for AI Agent development"},"content":{"rendered":"<h2><span style=\"font-size: 18pt;\"><strong>How to use Elasticsearch Vector Store Connector for Microsoft Semantic Kernel for AI Agent development<\/strong><\/span><\/h2>\n<p>Today we&#8217;re excited to feature the Elastic team to share more about their Semantic Kernel Elasticsearch Vector Store connector for Microsoft Semantic Kernel. Read the entire announcement <a href=\"https:\/\/www.elastic.co\/search-labs\/blog\/elasticsearch-connector-microsoft-semantic-kernel\">here<\/a>. I&#8217;ll turn it over to Srikanth Manvi and Florian Bernd to dive into it.<\/p>\n<p class=\"mb-24\">In collaboration with the\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/learn.microsoft.com\/en-us\/semantic-kernel\/overview\/\" rel=\"noopener noreferrer\">Microsoft Semantic Kernel<\/a>\u00a0team, we are announcing the availability of\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/github.com\/elastic\/semantic-kernel-net\/\" rel=\"noopener noreferrer\">Semantic Kernel Elasticsearch Vector Store Connector<\/a>, for\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/learn.microsoft.com\/en-us\/semantic-kernel\/overview\/\" rel=\"noopener noreferrer\">Microsoft Semantic Kernel<\/a>\u00a0(.NET) users. Semantic Kernel simplifies building enterprise-grade AI agents, including the capability to enhance large language models (LLMs) with more relevant, data-driven responses from a Vector Store. Semantic Kernel provides a seamless abstraction layer for interacting with Vector Stores like Elasticsearch, offering essential features such as creating, listing, and deleting collections of records and uploading, retrieving, deleting individual records.<\/p>\n<p class=\"mb-24\">The\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/learn.microsoft.com\/en-us\/semantic-kernel\/concepts\/vector-store-connectors\/out-of-the-box-connectors\/elasticsearch-connector?pivots=programming-language-csharp\" rel=\"noopener noreferrer\">out-of-the-box Semantic Kernel Elasticsearch Vector Store Connector<\/a>\u00a0supports the Semantic Kernel\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/learn.microsoft.com\/en-us\/semantic-kernel\/concepts\/vector-store-connectors\/?pivots=programming-language-csharp#the-vector-store-abstraction\" rel=\"noopener noreferrer\">vector store abstractions<\/a>\u00a0which make it very easy for developers to plugin Elasticsearch as a vector store while building AI agents.<\/p>\n<p class=\"mb-24\">Elasticsearch has a strong foundation in the open-source community and recently adopted the\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/www.elastic.co\/blog\/elasticsearch-is-open-source-again\" rel=\"noopener noreferrer\">AGPL license<\/a>. Combined with the open-source Microsoft Semantic Kernel, these tools offer a powerful, enterprise-ready solution. You can get started locally by spinning up Elasticsearch in a few minutes by running this command\u00a0<code>curl -fsSL https:\/\/elastic.co\/start-local | sh\u00a0<\/code>(refer\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/current\/run-elasticsearch-locally.html\" rel=\"noopener noreferrer\">start-local<\/a>\u00a0for details) and move to\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/cloud.elastic.co\/registration?onboarding_token=vectorsearch&amp;utm_source=semantickernel&amp;utm_content=documentation\" rel=\"noopener noreferrer\">cloud-hosted<\/a>\u00a0or\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/8.16\/install-elasticsearch.html\" rel=\"noopener noreferrer\">self-hosted<\/a>\u00a0versions while productionizing your AI agents.<\/p>\n<p class=\"mb-24\">In this blog we look at how to use\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/github.com\/elastic\/semantic-kernel-net\/\" rel=\"noopener noreferrer\">Semantic Kernel Elasticsearch Vector Store Connector<\/a>\u00a0when using Semantic Kernel. A Python version of the connector will be made available in the future.<\/p>\n<h3 class=\"mb-24\"><strong>High-level scenario<\/strong><\/h3>\n<p class=\"mb-24\">In the following section we go through an example. At a high-level we are building a RAG (Retrieval Augmented Generation) application which takes a user&#8217;s question as input and returns an answer. We will use Azure OpenAI (<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/devblogs.microsoft.com\/semantic-kernel\/introducing-new-ollama-connector-for-local-models\/\" rel=\"noopener noreferrer\">local LLM<\/a>\u00a0can be used as well) as the LLM, Elasticsearch as the vector store and Semantic Kernel (.net) as the framework to tie all components together.<\/p>\n<p class=\"mb-24\">If you are not familiar with RAG architectures, you can have a quick introduction with this article:\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/www.elastic.co\/search-labs\/blog\/retrieval-augmented-generation-rag\" rel=\"noopener noreferrer\">https:\/\/www.elastic.co\/search-labs\/blog\/retrieval-augmented-generation-rag<\/a>.<\/p>\n<p class=\"mb-24\">The answer is generated by the LLM which is fed with context, relevant to the question, retrieved from Elasticsearch vectorstore. The response also includes the source that was used as the context by the LLM.<\/p>\n<h3><strong><span style=\"font-size: 14pt;\">RAG Example<\/span><\/strong><\/h3>\n<p class=\"mb-24\">In this specific example, we build an application that allows users to ask questions about hotels stored in an internal hotel database. The user could e.g. search for a specific hotel, based on different criteria, or ask for a list of hotels.<\/p>\n<p class=\"mb-24\">For the example database, we generated a\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/github.com\/elastic\/semantic-kernel-net\/blob\/main\/Elastic.SemanticKernel.Playground\/hotels.csv\" rel=\"noopener noreferrer\">list of hotels<\/a>\u00a0containing 100 entries. The sample size is intentionally small to allow you to try out the connector demo as easily as possible. In a real-world application, the Elasticsearch connector would show its advantages over other options, such as the `InMemory` vector store implementation, especially when working with extremely large amounts of data.<\/p>\n<p class=\"mb-24\">The complete demo application can be found in the Elasticsearch vector store connector\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/github.com\/elastic\/semantic-kernel-net\/tree\/main\/Elastic.SemanticKernel.Playground\" rel=\"noopener noreferrer\">repository<\/a>.<\/p>\n<p class=\"mb-24\">Let\u2019s start with adding the required NuGet packages and using directives to our project:<\/p>\n<pre class=\"prettyprint language-cs language-csharp\"><code class=\"language-cs language-csharp\">dotnet add package \"Elastic.Clients.Elasticsearch\" -v 8.16.2\r\ndotnet add package \"Elastic.SemanticKernel.Connectors.Elasticsearch\" -v 0.1.2\r\ndotnet add package \"Microsoft.Extensions.Hosting\" -v 9.0.0\r\ndotnet add package \"Microsoft.SemanticKernel.Connectors.AzureOpenAI\" -v 1.30.0\r\ndotnet add package \"Microsoft.SemanticKernel.PromptTemplates.Handlebars\" -v 1.30.0<\/code><\/pre>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">using System;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\n\r\nusing Elastic.Clients.Elasticsearch;\r\nusing Elastic.Transport;\r\n\r\nusing Microsoft.Extensions.DependencyInjection;\r\nusing Microsoft.Extensions.Hosting;\r\nusing Microsoft.Extensions.VectorData;\r\nusing Microsoft.SemanticKernel;\r\nusing Microsoft.SemanticKernel.Data;\r\nusing Microsoft.SemanticKernel.Embeddings;\r\nusing Microsoft.SemanticKernel.PromptTemplates.Handlebars;<\/code><\/pre>\n<p>We can now create our data model and provide it with Semantic Kernel specific attributes to define the storage model schema and some hints for the text search:<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">\/\/\/ &lt;summary&gt;\r\n\/\/\/ Data model for storing a \"hotel\" with a name, a description, a  description embedding and an optional reference link.\r\n\/\/\/ &lt;\/summary&gt;\r\npublic sealed record Hotel\r\n{\r\n\t[VectorStoreRecordKey]\r\n\tpublic required string HotelId { get; set; }\r\n\r\n\t[TextSearchResultName]\r\n\t[VectorStoreRecordData(IsFilterable = true)]\r\n\tpublic required string HotelName { get; set; }\r\n\r\n\t[TextSearchResultValue]\r\n\t[VectorStoreRecordData(IsFullTextSearchable = true)]\r\n\tpublic required string Description { get; set; }\r\n\r\n\t[VectorStoreRecordVector(Dimensions: 1536, DistanceFunction.CosineSimilarity, IndexKind.Hnsw)]\r\n\tpublic ReadOnlyMemory&lt;float&gt;? DescriptionEmbedding { get; set; }\r\n\r\n\t[TextSearchResultLink]\r\n\t[VectorStoreRecordData]\r\n\tpublic string? ReferenceLink { get; set; }\r\n}<\/code><\/pre>\n<p class=\"mb-24\">The Storage Model Schema attributes (`VectorStore*`) are most relevant for the actual use of the Elasticsearch Vector Store Connector, namely:<\/p>\n<ul class=\"ContentFormatter_list__9QrWL\">\n<li><code>VectorStoreRecordKey<\/code>\u00a0to mark a property on a record class as the key under which the record is stored in a vector store.<\/li>\n<li><code>VectorStoreRecordData<\/code>\u00a0to mark a property on a record class as &#8216;data&#8217;.<\/li>\n<li><code>VectorStoreRecordVector<\/code>\u00a0to mark a property on a record class as a vector.<\/li>\n<\/ul>\n<p class=\"mb-24\">All of these attributes accept various optional parameters that can be used to further customize the storage model. In the case of\u00a0<code>VectorStoreRecordKey\u00a0<\/code>, for example, it is possible to specify a different distance function or a different index type.<\/p>\n<p class=\"mb-24\">The text search attributes (<code>TextSearch*<\/code>) will be important in the last step of this example. We will come back to them later.<\/p>\n<p class=\"mb-24\">In the next step, we initialize the Semantic Kernel engine and obtain references to the core services. In a real world application,\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/core\/extensions\/dependency-injection\" rel=\"noopener noreferrer\">dependency injection<\/a>\u00a0should be used instead of directly accessing the service collection. The same thing applies to the hardcoded configuration and secrets, which should be read using a\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/core\/extensions\/configuration\" rel=\"noopener noreferrer\">configuration provider<\/a>\u00a0instead:<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">var builder = Host.CreateApplicationBuilder(args);\r\n\r\n\/\/ Register AI services.\r\nvar kernelBuilder = builder.Services.AddKernel();\r\n\r\nkernelBuilder.AddAzureOpenAIChatCompletion(\"gpt-4o\", \"https:\/\/my-service.openai.azure.com\", \"my_token\");\r\n\r\nkernelBuilder.AddAzureOpenAITextEmbeddingGeneration(\"ada-002\", \"https:\/\/my-service.openai.azure.com\", \"my_token\");\r\n\r\n\/\/ Register text search service.\r\nkernelBuilder.AddVectorStoreTextSearch&lt;Hotel&gt;();\r\n\r\n\/\/ Register Elasticsearch vector store.\r\nvar elasticsearchClientSettings = new ElasticsearchClientSettings(new Uri(\"https:\/\/my-elasticsearch-instance.cloud\"))\r\n    .Authentication(new BasicAuthentication(\"elastic\", \"my_password\"));\r\n\r\nkernelBuilder.AddElasticsearchVectorStoreRecordCollection&lt;string, Hotel&gt;(\"skhotels\", elasticsearchClientSettings);\r\n\r\n\/\/ Build the host.\r\nusing var host = builder.Build();\r\n\r\n\/\/ For demo purposes, we access the services directly without using a DI context.\r\n\r\nvar kernel = host.Services.GetService&lt;Kernel&gt;()!;\r\nvar embeddings = host.Services.GetService&lt;ITextEmbeddingGenerationService&gt;()!;\r\nvar vectorStoreCollection = host.Services.GetService&lt;IVectorStoreRecordCollection&lt;string, Hotel&gt;&gt;()!;\r\n\r\n\/\/ Register search plugin.\r\nvar textSearch = host.Services.GetService&lt;VectorStoreTextSearch&lt;Hotel&gt;&gt;()!;\r\nkernel.Plugins.Add(textSearch.CreateWithGetTextSearchResults(\"SearchPlugin\"));<\/code><\/pre>\n<p>The\u00a0<code>vectorStoreCollection<\/code>\u00a0service can now be used to create the collection and to ingest a few\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/github.com\/elastic\/semantic-kernel-net\/blob\/main\/Elastic.SemanticKernel.Playground\/hotels.csv\" rel=\"noopener noreferrer\">demo records<\/a>:<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">await vectorStoreCollection.CreateCollectionIfNotExistsAsync();\r\n\r\n\/\/ CSV format: ID;Hotel Name;Description;Reference Link\r\nvar hotels = (await File.ReadAllLinesAsync(\"hotels.csv\"))\r\n    .Select(x =&gt; x.Split(';'));\r\n\r\nforeach (var chunk in hotels.Chunk(25))\r\n{\r\n    var descriptionEmbeddings = await embeddings.GenerateEmbeddingsAsync(chunk.Select(x =&gt; x[2]).ToArray());\r\n    \r\n    for (var i = 0; i &lt; chunk.Length; ++i)\r\n    {\r\n        var hotel = chunk[i];\r\n        await vectorStoreCollection.UpsertAsync(new Hotel\r\n        {\r\n            HotelId = hotel[0],\r\n            HotelName = hotel[1],\r\n            Description = hotel[2],\r\n            DescriptionEmbedding = descriptionEmbeddings[i],\r\n            ReferenceLink = hotel[3]\r\n        });\r\n    }\r\n}<\/code><\/pre>\n<div id=\"code_5e82fdd92a64265719dae86021f6dbf8\" class=\"CodeBlock_codeContainer__9QCmo\"><\/div>\n<div id=\"code_453b54cea940222480532790cfd7735f\" class=\"CodeBlock_codeContainer__9QCmo\">\n<div class=\"token-line\">This shows how Semantic Kernel reduces the use of a vector store with all its complexity to a few simple method calls.<\/div>\n<\/div>\n<p class=\"mb-24\">Under the hood, a new index is created in Elasticsearch and all the necessary property mappings are created. Our data set is then mapped completely transparently into the storage model and finally stored in the index. Below is how the mappings look in Elasticsearch.<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">{\r\n  \"mappings\": {\r\n    \"properties\": {\r\n      \"descriptionEmbedding\": {\r\n        \"dims\": 1536,\r\n        \"index\": true,\r\n        \"index_options\": {\r\n          \"type\": \"hnsw\"\r\n        },\r\n        \"similarity\": \"cosine\",\r\n        \"type\": \"dense_vector\"\r\n      },\r\n      \"hotelName\": {\r\n        \"type\": \"keyword\"\r\n      },\r\n      \"description\": {\r\n        \"type\": \"text\"\r\n      }\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p class=\"mb-24\">The <code>embeddings.GenerateEmbeddingsAsync()<\/code>\u00a0calls transparently called the configured Azure AI Embeddings Generation service.<\/p>\n<p class=\"mb-24\">Even more magic can be observed in the last step of this demo.<\/p>\n<p class=\"mb-24\">With just a single call to\u00a0<code>InvokePromptAsync<\/code>, all of the following operations are performed when the user asks a question about the data:<\/p>\n<p class=\"mb-24\">1. An embedding for the user&#8217;s question is generated<\/p>\n<p class=\"mb-24\">2. The vector store is searched for relevant entries<\/p>\n<p class=\"mb-24\">3. The results of the query are inserted into a prompt template<\/p>\n<p class=\"mb-24\">4. The actual query in the form of the final prompt is sent to the AI chat completion service<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">\/\/ Invoke the LLM with a template that uses the search plugin to\r\n\/\/ 1. get related information to the user query from the vector store\r\n\/\/ 2. add the information to the LLM prompt.\r\nvar response = await kernel.InvokePromptAsync(\r\n    promptTemplate: \"\"\"\r\n                    Please use this information to answer the question:\r\n                    {{#with (SearchPlugin-GetTextSearchResults question)}}\r\n                      {{#each this}}\r\n                        Name: {{Name}}\r\n                        Value: {{Value}}\r\n                        Source: {{Link}}\r\n                        -----------------\r\n                      {{\/each}}\r\n                    {{\/with}}\r\n                    \r\n                    Include the source of relevant information in the response.\r\n\r\n                    Question: {{question}}\r\n                    \"\"\",\r\n    arguments: new KernelArguments\r\n    {\r\n        { \"question\", \"Please show me all hotels that have a rooftop bar.\" },\r\n    },\r\n    templateFormat: \"handlebars\",\r\n    promptTemplateFactory: new HandlebarsPromptTemplateFactory());<\/code><\/pre>\n<div id=\"code_32f7c6ef9a575ac3d1bdadb3a7d36ac1\" class=\"CodeBlock_codeContainer__9QCmo\"><\/div>\n<p class=\"mb-24\">Remember the\u00a0<code>TextSearch*<\/code>\u00a0attributes, we previously defined on our data model? These attributes enable us to use corresponding placeholders in our prompt template which are automatically populated with the information from our entries in the vector store.<\/p>\n<p class=\"mb-24\">The final response to our question &#8220;Please show me all hotels that have a rooftop bar.&#8221; is as follows:<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">Console.WriteLine(response.ToString());\r\n\r\n\/\/ &gt; The hotel that has a rooftop bar is Skyline Suites. You can find more information about this hotel [here](https:\/\/example.com\/yz567).<\/code><\/pre>\n<p>The answer correctly refers to the following entry in our hotels.csv<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">9;\r\nSkyline Suites;\r\nOffering panoramic city views from every suite, this hotel is perfect for those who love the urban landscape. Enjoy luxurious amenities, a rooftop bar, and close proximity to attractions. Luxurious and contemporary.;\r\nhttps:\/\/example.com\/yz567<\/code><\/pre>\n<p class=\"mb-24\">This example shows very well how the use of Microsoft Semantic Kernel achieves a significant reduction in complexity through its well thought abstractions, as well as enabling a very high level of flexibility. By changing a single line of code, for example, the vector store or the AI services used can be replaced without having to refactor any other part of the code.<\/p>\n<p class=\"mb-24\">At the same time, the framework provides an enormous set of high-level functionality, such as the `InvokePrompt` function, or the template or search plugin system.<\/p>\n<p class=\"mb-24\">The complete demo application can be found in the Elasticsearch vector store connector repository.<\/p>\n<h2 id=\"what-else-is-possible-with-es\" class=\"ContentFormatter_h2__jrduH\">What else is possible with ES<\/h2>\n<ul class=\"ContentFormatter_list__9QrWL\">\n<li><a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/www.elastic.co\/search-labs\/blog\/semantic-search-simplified-semantic-text\" rel=\"noopener noreferrer\">Elasticsearch new semantic_text mapping: Simplifying semantic search<\/a><\/li>\n<li><a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/www.elastic.co\/search-labs\/blog\/semantic-reranking-with-retrievers\" rel=\"noopener noreferrer\">Semantic reranking in Elasticsearch with retrievers<\/a><\/li>\n<li><a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/www.elastic.co\/search-labs\/blog\/advanced-rag-techniques-part-1\" rel=\"noopener noreferrer\">Advanced RAG techniques part 1: Data processing<\/a><\/li>\n<li><a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/www.elastic.co\/search-labs\/blog\/advanced-rag-techniques-part-2\" rel=\"noopener noreferrer\">Advanced RAG techniques part 2: Querying and testing<\/a><\/li>\n<\/ul>\n<h2 id=\"what's-next?\" class=\"ContentFormatter_h2__jrduH\">What&#8217;s next?<\/h2>\n<ul class=\"ContentFormatter_list__9QrWL\">\n<li>We showed how the Elasticsearch vector store can be easily plugged into Semantic Kernel while building GenAI applications in .NET. Stay tuned for a Python integration next.<\/li>\n<li>As Semantic Kernel builds abstractions for advanced search features like\u00a0<a class=\"ContentFormatter_link__e4ogw\" href=\"https:\/\/www.elastic.co\/search-labs\/tutorials\/search-tutorial\/vector-search\/hybrid-search\" rel=\"noopener noreferrer\">hybrid search<\/a>, the Elasticsearch connect will enable .NET developers to easily implement them while using Semantic Kernel.<\/li>\n<\/ul>\n<div class=\"mt-32\">\n<p class=\"Text_gray__zXHOH\">Elasticsearch has native integrations to industry leading Gen AI tools and providers. Check out our webinars on going\u00a0<a href=\"https:\/\/www.elastic.co\/virtual-events\/beyond-rag-basics\">Beyond RAG Basics<\/a>, or building prod-ready apps\u00a0<a href=\"https:\/\/www.elastic.co\/virtual-events\/vector-databases-fast-track-production\">Elastic Vector Database<\/a>.<\/p>\n<p class=\"Text_gray__zXHOH\">To build the best search solutions for your use case, start a\u00a0<a href=\"https:\/\/cloud.elastic.co\/registration?onboarding_token=search&amp;cta=cloudregistration&amp;tech=trial&amp;plcmt=cross%20module&amp;pg=search-labs\">free cloud trial<\/a>\u00a0or try Elastic on your\u00a0<a href=\"https:\/\/github.com\/elastic\/start-local\">local machine<\/a> now.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>How to use Elasticsearch Vector Store Connector for Microsoft Semantic Kernel for AI Agent development Today we&#8217;re excited to feature the Elastic team to share more about their Semantic Kernel Elasticsearch Vector Store connector for Microsoft Semantic Kernel. Read the entire announcement here. I&#8217;ll turn it over to Srikanth Manvi and Florian Bernd to dive [&hellip;]<\/p>\n","protected":false},"author":149071,"featured_media":2302,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[17,42,1],"tags":[79,48,82,28,63,9],"class_list":["post-3919","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-announcements","category-customer-story","category-semantic-kernel","tag-net","tag-ai","tag-announcement","tag-elasticsearch","tag-microsoft-semantic-kernel","tag-semantic-kernel"],"acf":[],"blog_post_summary":"<p>How to use Elasticsearch Vector Store Connector for Microsoft Semantic Kernel for AI Agent development Today we&#8217;re excited to feature the Elastic team to share more about their Semantic Kernel Elasticsearch Vector Store connector for Microsoft Semantic Kernel. Read the entire announcement here. I&#8217;ll turn it over to Srikanth Manvi and Florian Bernd to dive [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts\/3919","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/users\/149071"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/comments?post=3919"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/posts\/3919\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/media\/2302"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/media?parent=3919"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/categories?post=3919"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/agent-framework\/wp-json\/wp\/v2\/tags?post=3919"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}