<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[David Pilato - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[David Pilato - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/es/search-labs/author/david-pilato</link>
    </image>
    <link>https://www.elastic.co/es/search-labs/author/david-pilato</link>
    <atom:link href="https://www.elastic.co/es/search-labs/rss/author/david-pilato.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[es]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 19:00:01 GMT</lastBuildDate>
  <item>
    <title><![CDATA[LangChain4j con Elasticsearch como almacén de incrustaciones]]></title>
    <description><![CDATA[LangChain4j (LangChain para Java) tiene Elasticsearch como almacén de incrustación. Descubre cómo usarlo para construir tu aplicación RAG en Java puro.]]></description>
    <content:encoded><![CDATA[<p>
En la <a href="https://www.elastic.co/search-labs/blog/langchain4j-llm-integration-introduction">publicación anterior</a>, descubrimos qué es LangChain4j y cómo:</p><ul><li><p>Habla con los LLMs implementando un <code>ChatLanguageModel</code> y un <code>ChatMemory</code></p></li><li><p>Conserva el historial de chats en memoria para recordar el contexto de una conversación previa con un LLM</p></li></ul><p>Esta entrada del blog trata sobre cómo:</p><ul><li><p>Crear incrustaciones vectoriales a partir de ejemplos de texto</p></li><li><p>Almacenar incrustaciones vectoriales en el almacenamiento de incrustaciones de Elasticsearch </p></li><li><p>Búsqueda de vectores similares</p></li></ul><h2>Crear incrustaciones</h2><p>Para crear embeddings, necesitamos definir un <code>EmbeddingModel</code> a emplear. Por ejemplo, podemos usar el mismo modelo de mistral que usamos en la <a href="https://www.elastic.co/search-labs/blog/langchain4j-llm-integration-introduction">publicación anterior</a>. Estaba corriendo con ollama:</p>EmbeddingModel model = OllamaEmbeddingModel.builder()
  .baseUrl(ollama.getEndpoint())
  .modelName(MODEL_NAME)
  .build();<p>Un modelo es capaz de generar vectores a partir de texto. Aquí podemos comprobar el número de dimensiones generadas por el modelo:</p>Logger.info("Embedding model has {} dimensions.", model.dimension());
// This gives: Embedding model has 4096 dimensions.<p>Para generar vectores a partir de un texto, podemos usar:</p>Response&lt;Embedding&gt; response = model.embed("A text here");<p>O si también queremos proporcionar metadatos para filtrar cosas como texto, precio, fecha de lanzamiento o lo que sea, podemos usar <code>Metadata.from()</code>. Por ejemplo, aquí agregamos el nombre del juego como campo de metadatos:</p>TextSegment game1 = TextSegment.from("""
    The game starts off with the main character Guybrush Threepwood stating "I want to be a pirate!"
    To do so, he must prove himself to three old pirate captains. During the perilous pirate trials, 
    he meets the beautiful governor Elaine Marley, with whom he falls in love, unaware that the ghost pirate 
    LeChuck also has his eyes on her. When Elaine is kidnapped, Guybrush procures crew and ship to track 
    LeChuck down, defeat him and rescue his love.
""", Metadata.from("gameName", "The Secret of Monkey Island"));
Response&lt;Embedding&gt; response1 = model.embed(game1);
TextSegment game2 = TextSegment.from("""
    Out Run is a pseudo-3D driving video game in which the player controls a Ferrari Testarossa 
    convertible from a third-person rear perspective. The camera is placed near the ground, simulating 
    a Ferrari driver's position and limiting the player's view into the distance. The road curves, 
    crests, and dips, which increases the challenge by obscuring upcoming obstacles such as traffic 
    that the player must avoid. The object of the game is to reach the finish line against a timer.
    The game world is divided into multiple stages that each end in a checkpoint, and reaching the end 
    of a stage provides more time. Near the end of each stage, the track forks to give the player a 
    choice of routes leading to five final destinations. The destinations represent different 
    difficulty levels and each conclude with their own ending scene, among them the Ferrari breaking 
    down or being presented a trophy.
""", Metadata.from("gameName", "Out Run"));
Response&lt;Embedding&gt; response2 = model.embed(game2);<p>Si quieres ejecutar este código, por favor echa un vistazo a la <a href="https://github.com/dadoonet/langchain4j-demo/blob/main/src/test/java/fr/pilato/demo/Step5EmbedddingsTest.java">clase Step5EmbedddingsTest.java</a> .</p><h2>Agregar Elasticsearch para almacenar nuestros vectores</h2><p>LangChain4j proporciona un almacén de incrustación en memoria. Esto es útil para realizar pruebas sencillas:</p>EmbeddingStore&lt;TextSegment&gt; embeddingStore = new InMemoryEmbeddingStore&lt;&gt;();
embeddingStore.add(response1.content(), game1);
embeddingStore.add(response2.content(), game2);<p>Pero obviamente, esto no podría funcionar con un conjunto de datos mucho mayor porque este almacén almacena todo en memoria y no tenemos memoria infinita en nuestros servidores. Así que, en su lugar, podríamos almacenar nuestras incrustaciones en Elasticsearch, que por definición es "elástico" y puede escalar hacia arriba y hacia fuera con tus datos. Para ello, agregamos Elasticsearch a nuestro proyecto:</p>&lt;dependency&gt;
  &lt;groupId&gt;dev.langchain4j&lt;/groupId&gt;
  &lt;artifactId&gt;langchain4j-elasticsearch&lt;/artifactId&gt;
  &lt;version&gt;${langchain4j.version}&lt;/version&gt;
&lt;/dependency&gt;

&lt;dependency&gt;
  &lt;groupId&gt;org.testcontainers&lt;/groupId&gt;
  &lt;artifactId&gt;elasticsearch&lt;/artifactId&gt;
  &lt;version&gt;1.20.1&lt;/version&gt;
  &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;<p>Como notasteis, también agregamos el módulo Elasticsearch TestContainers al proyecto, para poder iniciar una instancia de Elasticsearch a partir de nuestras pruebas:</p>// Create the elasticsearch container
ElasticsearchContainer container =
  new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:8.15.0")
    .withPassword("changeme");

// Start the container. This step might take some time...
container.start();

// As we don't want to make our TestContainers code more complex than
// needed, we will use login / password for authentication.
// But note that you can also use API keys which is preferred.
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "changeme"));

// Create a low level Rest client which connects to the elasticsearch container.
client = RestClient.builder(HttpHost.create("https://" + container.getHttpHostAddress()))
  .setHttpClientConfigCallback(httpClientBuilder -&gt; {
    httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
    httpClientBuilder.setSSLContext(container.createSslContextFromCa());
    return httpClientBuilder;
  })
  .build();

// Check the cluster is running
client.performRequest(new Request("GET", "/"));<p>Para usar Elasticsearch como almacén de embebed, "solo" tienes que cambiar del almacén de datos en memoria de LangChain4j al de Elasticsearch:</p>EmbeddingStore&lt;TextSegment&gt; embeddingStore =
  ElasticsearchEmbeddingStore.builder()
    .restClient(client)
    .build();
embeddingStore.add(response1.content(), game1);
embeddingStore.add(response2.content(), game2);<p>Esto almacenará tus vectores en Elasticsearch en un índice <code>default</code> . También puedes cambiar el nombre del índice por algo más significativo:</p>EmbeddingStore&lt;TextSegment&gt; embeddingStore =
  ElasticsearchEmbeddingStore.builder()
    .indexName("games")
    .restClient(client)
    .build();
embeddingStore.add(response1.content(), game1);
embeddingStore.add(response2.content(), game2);<p>Si quieres ejecutar este código, por favor echa un vistazo a la <a href="https://github.com/dadoonet/langchain4j-demo/blob/main/src/test/java/fr/pilato/demo/Step6ElasticsearchEmbedddingsTest.java">clase Step6ElasticsearchEmbedddingsTest.java</a> .</p><h2>Búsqueda de vectores similares</h2><p>Para buscar vectores similares, primero necesitamos transformar nuestra pregunta en una representación vectorial usando el mismo modelo que usamos anteriormente. Ya lo hicimos, así que no es difícil hacerlo de nuevo. Ten en cuenta que en este caso no necesitamos los metadatos:</p>String question = "I want to pilot a car";
Embedding questionAsVector = model.embed(question).content();<p>Podemos construir una solicitud de búsqueda con esta representación de nuestra pregunta y pedir al almacén de incrustaciones que encuentre los primeros vectores principales:</p>EmbeddingSearchResult&lt;TextSegment&gt; result = embeddingStore.search(
  EmbeddingSearchRequest.builder()
    .queryEmbedding(questionAsVector)
    .build());<p>Podemos iterar sobre los resultados ahora e imprimir algo de información, como el nombre del juego que proviene de los metadatos y el puntaje:</p>result.matches().forEach(m -&gt; Logger.info("{} - score [{}]",
  m.embedded().metadata().getString("gameName"), m.score()));<p>Como era de esperar, esto nos da "Out Run" como primer éxito:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7ca0dcfdb1a9c94f/6a170291cf4f256938b2d017/140b6a962e5edbb4870419250e30bfb815b0d73e-640x480.gif" alt="Carrera" />Out Run - score [0.86672974]
The Secret of Monkey Island - score [0.85569763]<p>Si quieres ejecutar este código, por favor echa un vistazo a la <a href="https://github.com/dadoonet/langchain4j-demo/blob/9ec4b1d4c7c69821f143ddf272bbfed273c67b14/src/test/java/fr/pilato/demo/Step7SearchForVectorsTest.java#L110-L129">clase Step7SearchForVectorsTest.java</a> . </p><h2>Tras bambalinas</h2><p>La configuración predeterminada para la tienda de incrustación de Elasticsearch emplea la <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl-knn-query.html">consulta aproximada kNN</a> detrás de escena.</p>POST games/_search
{
  "query" : {
    "knn": {
      "field": "vector",
      "query_vector": [-0.019137882, /* ... */, -0.0148779955]
    }
  }
}<p>Pero esto podría cambiar proporcionando otra configuración (<code>ElasticsearchConfigurationScript</code>) distinta a la predeterminada (<code>ElasticsearchConfigurationKnn</code>) en la tienda de incrustación:</p>EmbeddingStore&lt;TextSegment&gt; embeddingStore =
  ElasticsearchEmbeddingStore.builder()
    .configuration(ElasticsearchConfigurationScript.builder().build())
    .indexName("games")
    .restClient(client)
    .build();<p>La implementación <code>ElasticsearchConfigurationScript</code> ejecuta entre bastidores una <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl-script-score-query.html">consulta</a> <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl-script-score-query.html"><code>script_score</code></a> usando una <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl-script-score-query.html#vector-functions-cosine">función</a> <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl-script-score-query.html#vector-functions-cosine"><code>cosineSimilarity</code></a>.</p><p>Básicamente, al llamar:</p>EmbeddingSearchResult&lt;TextSegment&gt; result = embeddingStore.search(
  EmbeddingSearchRequest.builder()
    .queryEmbedding(questionAsVector)
    .build());<p>Esto ahora llama:</p>POST games/_search
{
  "query": {
    "script_score": {
      "script": {
        "source": "(cosineSimilarity(params.query_vector, 'vector') + 1.0) / 2",
        "params": {
          "queryVector": [-0.019137882, /* ... */, -0.0148779955]
        }
      }
    }
  }
}<p>En ese caso, el resultado no cambia en términos de "orden", sino que solo se ajusta el puntaje porque la llamada <code>cosineSimilarity</code> no emplea ninguna aproximación, sino que calcula el coseno para cada uno de los vectores emparejados:</p>Out Run - score [0.871952]
The Secret of Monkey Island - score [0.86380446]<p>Si quieres ejecutar este código, por favor echa un vistazo a la <a href="https://github.com/dadoonet/langchain4j-demo/blob/9ec4b1d4c7c69821f143ddf272bbfed273c67b14/src/test/java/fr/pilato/demo/Step7SearchForVectorsTest.java#L132-L155">clase Step7SearchForVectorsTest.java</a> .</p><h2>Conclusión</h2><p>Explicamos lo fácil que es generar incrustaciones a partir de tu texto y cómo puedes almacenar y buscar los vecinos más cercanos en Elasticsearch usando dos enfoques diferentes:</p><ul><li><p>Usando la consulta de <code>knn</code> aproximada y rápida con la opción de <code>ElasticsearchConfigurationKnn</code> por defecto</p></li><li><p>Usando la consulta de <code>script_score</code> exacta pero más lenta con la opción <code>ElasticsearchConfigurationScript</code></p></li></ul><p>El siguiente paso será construir una aplicación completa de RAG, basada en lo que aprendimos aquí.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/langchain4j-elasticsearch-embedding-store</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/langchain4j-elasticsearch-embedding-store</guid>
    <category><![CDATA[Java]]></category>
    <category><![CDATA[AI]]></category>
    <category><![CDATA[Base de datos vectorial]]></category>
    <dc:creator><![CDATA[David Pilato]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc873b86c76d1798/6a170293acf088f666be99b3/abd8a4a809064101c037af66b87f28e5ecde03b0-1474x645.jpg" length="0" type="image/jpeg"/>
    <pubDate>Tue, 08 Oct 2024 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Presentamos LangChain4j para simplificar la integración de LLM en aplicaciones Java]]></title>
    <description><![CDATA[LangChain4j (LangChain para Java) es un conjunto de herramientas poderosa para construir tu aplicación RAG en Java puro.]]></description>
    <content:encoded><![CDATA[<p>El <a href="https://docs.langchain4j.dev/">marco LangChain4j</a> se creó en 2023 con <a href="https://github.com/langchain4j/langchain4j/blob/main/README.md#introduction">este objetivo</a>:</p>El objetivo de LangChain4j es simplificar la integración de LLMs en aplicaciones Java.<p>LangChain4j está proporcionando una forma estándar de:</p><ul><li><p>crear incrustaciones (vectores) a partir de un contenido dado, por ejemplo un texto</p></li><li><p>Almacenar incrustaciones en un almacén de incrustaciones</p></li><li><p>Busca vectores similares en la tienda de incrustación</p></li><li><p>discute con los LLMs</p></li><li><p>usar una memoria de chat para recordar el contexto de una conversación con un LLM</p></li></ul><p>Esta lista no es exhaustiva y la comunidad de LangChain4j siempre está implementando nuevas funcionalidades.</p><p>Esta entrada cubrirá las primeras partes principales del marco.</p><h2>Agregando LangChain4j OpenAI a nuestro proyecto</h2><p>Como en todos los proyectos Java, es solo cuestión de dependencias. Aquí usaremos Maven, pero lo mismo podría lograr con cualquier otro gestor de dependencias.</p><p>Como primer paso para el proyecto que queremos construir aquí, usaremos OpenAI, así que solo necesitamos agregar el <code>langchain4j-open-ai</code> artefacto:</p>&lt;properties&gt;
  &lt;langchain4j.version&gt;0.34.0&lt;/langchain4j.version&gt;
&lt;/properties&gt;

&lt;dependencies&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;dev.langchain4j&lt;/groupId&gt;
    &lt;artifactId&gt;langchain4j-open-ai&lt;/artifactId&gt;
    &lt;version&gt;${langchain4j.version}&lt;/version&gt;
  &lt;/dependency&gt;
&lt;/dependencies&gt;
<p>Para el resto del código usaremos nuestra propia clave API, que puedes obtener registrándote en <a href="https://platform.openai.com/signup/">OpenAI</a>, o la que proporciona el proyecto LangChain4j solo para demostraciones:</p>static String getOpenAiApiKey() {
  String apiKey = System.getenv(API_KEY_ENV_NAME);
  if (apiKey == null || apiKey.isEmpty()) {
    Logger.warn("Please provide your own key instead using [{}] env variable", API_KEY_ENV_NAME);
    return "demo";
  }
  return apiKey;
}
<p>Ahora podemos crear una instancia de nuestro ChatLanguageModel:</p>ChatLanguageModel model = OpenAiChatModel.withApiKey(getOpenAiApiKey());
<p>Y finalmente podemos hacer una pregunta sencilla y obtener la respuesta:</p>String answer = model.generate("Who is Thomas Pesquet?");
Logger.info("Answer is: {}", answer);
<p>La respuesta dada podría ser algo así:</p>Thomas Pesquet is a French aerospace engineer, pilot, and European Space Agency astronaut.
He was selected as a member of the European Astronaut Corps in 2009 and has since completed 
two space missions to the International Space Station, including serving as a flight engineer 
for Expedition 50/51 in 2016-2017. Pesquet is known for his contributions to scientific 
research and outreach activities during his time in space.
<p>Si quieres ejecutar este código, por favor echa un vistazo a la <a href="https://github.com/dadoonet/langchain4j-demo/blob/main/src/test/java/fr/pilato/demo/Step1AiChatTest.java">clase Step1AiChatTest.java</a> .</p><h2>Aportando más contexto con langchain4j</h2><p>Vamos a agregar el artefacto <code>langchain4j</code> :</p>&lt;dependency&gt;
  &lt;groupId&gt;dev.langchain4j&lt;/groupId&gt;
  &lt;artifactId&gt;langchain4j&lt;/artifactId&gt;
  &lt;version&gt;${langchain4j.version}&lt;/version&gt;
&lt;/dependency&gt;
<p>Este está proporcionando un conjunto de herramientas que puede ayudarnos a construir una integración LLM más avanzada para construir nuestro asistente. Aquí simplemente crearemos una interfaz <code>Assistant</code> que proporcione el método <code>chat</code> que llamará automáticamente a la <code>ChatLanguageModel</code> que definimos antes:</p>interface Assistant {
  String chat(String userMessage);
}
<p>Solo tenemos que pedirle a LangChain4j <code>AiServices</code> clase que construya una instancia para nosotros:</p>Assistant assistant = AiServices.create(Assistant.class, model);
<p>Y luego llama al método <code>chat(String)</code> :</p>String answer = assistant.chat("Who is Thomas Pesquet?");
Logger.info("Answer is: {}", answer);
<p>Esto es tener el mismo comportamiento que antes. ¿Entonces por qué cambiamos el código? En primer lugar, es más elegante, pero más que eso, ahora puedes dar algunas instrucciones al LLM usando anotaciones sencillas:</p>interface Assistant {
  @SystemMessage("Please answer in a funny way.")
  String chat(String userMessage);
}
<p>Esto ahora es dar:</p>Ah, Thomas Pesquet is actually a super secret spy disguised as an astronaut! 
He's out there in space fighting aliens and saving the world one spacewalk at a time. 
Or maybe he's just a really cool French astronaut who has been to the International 
Space Station. But my spy theory is much more exciting, don't you think?
<p>Si quieres ejecutar este código, por favor echa un vistazo a la <a href="https://github.com/dadoonet/langchain4j-demo/blob/main/src/test/java/fr/pilato/demo/Step2AssistantTest.java">clase Step2AssistantTest.java</a> .</p><h2>Cambiar a otro LLM: langchain4j-ollama</h2><p>Podemos aprovechar el <a href="https://ollama.com/">gran proyecto Ollama</a>. Ayuda tener un LLM localmente en tu máquina.</p><p>Vamos a agregar el artefacto <code>langchain4j-ollama</code> :</p>&lt;dependency&gt;
  &lt;groupId&gt;dev.langchain4j&lt;/groupId&gt;
  &lt;artifactId&gt;langchain4j-ollama&lt;/artifactId&gt;
  &lt;version&gt;${langchain4j.version}&lt;/version&gt;
&lt;/dependency&gt;
<p>Como ejecutamos el código de ejemplo usando pruebas, vamos a agregar <a href="https://java.testcontainers.org/">Testcontainers</a> a nuestro proyecto:</p>&lt;dependency&gt;
  &lt;groupId&gt;org.testcontainers&lt;/groupId&gt;
  &lt;artifactId&gt;ollama&lt;/artifactId&gt;
  &lt;version&gt;1.20.1&lt;/version&gt;
  &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;
<p>Ahora podemos iniciar/detener contenedores Docker:</p>static String MODEL_NAME = "mistral";
static String DOCKER_IMAGE_NAME = "langchain4j/ollama-" + MODEL_NAME + ":latest";

static OllamaContainer ollama = new OllamaContainer(
  DockerImageName.parse(DOCKER_IMAGE_NAME).asCompatibleSubstituteFor("ollama/ollama"));

@BeforeAll
public static void setup() {
  ollama.start();
}

@AfterAll
public static void teardown() {
  ollama.stop();
}
<p>Simplemente tenemos que cambiar el objeto <code>model</code> para que se convierta en un <code>OllamaChatModel</code> en lugar del <code>OpenAiChatModel</code> que usamos antes:</p>OllamaChatModel model = OllamaChatModel.builder()
  .baseUrl(ollama.getEndpoint())
  .modelName(MODEL_NAME)
  .build();
<p>Ten en cuenta que puede tardar un tiempo en extraer la imagen con su modelo, pero luego de un rato, podrías obtener la respuesta:</p>Oh, Thomas Pesquet, the man who single-handedly keeps the French space program running 
while sipping on his crisp rosé and munching on a baguette! He's our beloved astronaut 
with an irresistible accent that makes us all want to learn French just so we can 
understand him better. When he's not floating in space, he's probably practicing his 
best "je ne sais quoi" face for the next family photo. Vive le Thomas Pesquet! 
🚀🌍🇫🇷 #FrenchSpaceHero
<h2>Mejor con la memoria</h2><p>Si hacemos varias preguntas, por defecto el sistema no recordará las preguntas frecuentes anteriores. Así que si preguntamos luego de la primera pregunta "¿Cuándo nació?", Nuestra solicitud responderá:</p>Oh, you're asking about this legendary figure from history, huh? Well, let me tell 
you a hilarious tale! He was actually born on Leap Year's Day, but only every 400 
years! So, do the math... if we count backwards from 2020 (which is also a leap year), 
then he was born in... *drumroll please* ...1600! Isn't that a hoot? But remember 
folks, this is just a joke, and historical records may vary.
<p>Lo cual es una tontería. En su lugar, deberíamos usar <a href="https://docs.langchain4j.dev/tutorials/chat-memory">Chat Memory</a>:</p>ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
Assistant assistant = AiServices.builder(Assistant.class)
  .chatLanguageModel(model)
  .chatMemory(chatMemory)
  .build();
<p>Hacer las mismas preguntas ahora da una respuesta significativa:</p>Oh, Thomas Pesquet, the man who was probably born before sliced bread but after dinosaurs! 
You know, around the time when people started putting wheels on suitcases and calling it 
a revolution. So, roughly speaking, he came into this world somewhere in the late 70s or 
early 80s, give or take a year or two - just enough time for him to grow up, become an 
astronaut, and make us all laugh with his space-aged antics! Isn't that a hoot? 
*laughs maniacally*
<h2>Conclusión</h2><p>En <a href="https://www.elastic.co/search-labs/blog/langchain4j-elasticsearch-embedding-store">la próxima publicación</a>, descubriremos cómo podemos hacer preguntas a nuestro conjunto de datos privado usando Elasticsearch como almacén de incrustaciones. Eso nos dará una forma de transformar nuestra búsqueda de aplicaciones al siguiente nivel.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/langchain4j-llm-integration-introduction</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/langchain4j-llm-integration-introduction</guid>
    <category><![CDATA[Java]]></category>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[David Pilato]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0435ed6d14579089/6a17e79ae8fbce7e433a192f/cf129b8b25fbe7204e2adca8fca5fec04207f096-720x720.png" length="0" type="image/png"/>
    <pubDate>Mon, 23 Sep 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>