<?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/jp/search-labs/author/david-pilato</link>
    </image>
    <link>https://www.elastic.co/jp/search-labs/author/david-pilato</link>
    <atom:link href="https://www.elastic.co/jp/search-labs/rss/author/david-pilato.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[jp]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 10:20:44 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Elasticsearchを埋め込みストアとして使用したLangChain4j]]></title>
    <description><![CDATA[LangChain4j (LangChain for Java) には埋め込みストアとして Elasticsearch があります。これを使用して、プレーン Java で RAG アプリケーションを構築する方法を説明します。]]></description>
    <content:encoded><![CDATA[<p>
<a href="https://www.elastic.co/search-labs/blog/langchain4j-llm-integration-introduction">前回の投稿</a>では、LangChain4j とは何か、またどのように使用するかについて説明しました。</p><ul><li><p>LLMと<code>ChatLanguageModel</code>を実装して議論する <code>ChatMemory</code></p></li><li><p>チャット履歴をメモリに保持して、LLMとの以前の議論の文脈を思い出す</p></li></ul><p>このブログ投稿では、次の方法について説明します。</p><ul><li><p>テキスト例からベクトル埋め込みを作成する</p></li><li><p>ベクトル埋め込みをElasticsearch埋め込みストアに保存する </p></li><li><p>類似ベクトルを検索</p></li></ul><h2>埋め込みを作成する</h2><p>埋め込みを作成するには、使用する<code>EmbeddingModel</code>を定義する必要があります。たとえば、<a href="https://www.elastic.co/search-labs/blog/langchain4j-llm-integration-introduction">前回の投稿</a>で使用したのと同じミストラル モデルを使用できます。それは ollama で実行されていました:</p>EmbeddingModel model = OllamaEmbeddingModel.builder()
  .baseUrl(ollama.getEndpoint())
  .modelName(MODEL_NAME)
  .build();<p>モデルはテキストからベクトルを生成できます。ここで、モデルによって生成された次元の数を確認できます。</p>Logger.info("Embedding model has {} dimensions.", model.dimension());
// This gives: Embedding model has 4096 dimensions.<p>テキストからベクトルを生成するには、以下を使用します。</p>Response&lt;Embedding&gt; response = model.embed("A text here");<p>または、テキスト、価格、発売日などに基づいてフィルタリングできるようにメタデータも提供したい場合は、 <code>Metadata.from()</code>使用できます。たとえば、ここではゲーム名をメタデータ フィールドとして追加しています。</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>このコードを実行する場合は、 <a href="https://github.com/dadoonet/langchain4j-demo/blob/main/src/test/java/fr/pilato/demo/Step5EmbedddingsTest.java">Step5EmbedddingsTest.java</a>クラスをチェックアウトしてください。</p><h2>ベクトルを保存するためにElasticsearchを追加する</h2><p>LangChain4j はメモリ内の埋め込みストアを提供します。これは簡単なテストを実行するのに便利です:</p>EmbeddingStore&lt;TextSegment&gt; embeddingStore = new InMemoryEmbeddingStore&lt;&gt;();
embeddingStore.add(response1.content(), game1);
embeddingStore.add(response2.content(), game2);<p>しかし、明らかに、このデータストアはすべてをメモリに保存し、サーバーに無限のメモリがないため、これよりもはるかに大きなデータセットでは機能しません。そのため、代わりに、定義上「弾性」があり、データに合わせてスケールアップおよびスケールアウトできる Elasticsearch に埋め込みを保存することができます。そのためには、Elasticsearch をプロジェクトに追加しましょう。</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>お気づきのとおり、Elasticsearch TestContainers モジュールもプロジェクトに追加したので、テストから Elasticsearch インスタンスを起動できます。</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>Elasticsearch を埋め込みストアとして使用するには、LangChain4j のインメモリ データストアから Elasticsearch データストアに切り替えるだけです。</p>EmbeddingStore&lt;TextSegment&gt; embeddingStore =
  ElasticsearchEmbeddingStore.builder()
    .restClient(client)
    .build();
embeddingStore.add(response1.content(), game1);
embeddingStore.add(response2.content(), game2);<p>これにより、Elasticsearch の<code>default</code>インデックスにベクトルが保存されます。インデックス名をより意味のあるものに変更することもできます。</p>EmbeddingStore&lt;TextSegment&gt; embeddingStore =
  ElasticsearchEmbeddingStore.builder()
    .indexName("games")
    .restClient(client)
    .build();
embeddingStore.add(response1.content(), game1);
embeddingStore.add(response2.content(), game2);<p>このコードを実行する場合は、 <a href="https://github.com/dadoonet/langchain4j-demo/blob/main/src/test/java/fr/pilato/demo/Step6ElasticsearchEmbedddingsTest.java">Step6ElasticsearchEmbedddingsTest.java</a>クラスをチェックアウトしてください。</p><h2>類似ベクトルを検索</h2><p>類似のベクトルを検索するには、まず、以前使用したのと同じモデルを使用して、質問をベクトル表現に変換する必要があります。すでにそれを行ったので、もう一度これを行うのは難しくありません。この場合、メタデータは必要ないことに注意してください。</p>String question = "I want to pilot a car";
Embedding questionAsVector = model.embed(question).content();<p>質問をこのように表現して検索リクエストを作成し、埋め込みストアに最初の上位ベクトルを見つけるように依頼することができます。</p>EmbeddingSearchResult&lt;TextSegment&gt; result = embeddingStore.search(
  EmbeddingSearchRequest.builder()
    .queryEmbedding(questionAsVector)
    .build());<p>これで、結果を反復処理して、メタデータから取得したゲーム名やスコアなどの情報を出力できます。</p>result.matches().forEach(m -&gt; Logger.info("{} - score [{}]",
  m.embedded().metadata().getString("gameName"), m.score()));<p>予想どおり、最初のヒットは「Out Run」になります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7ca0dcfdb1a9c94f/6a170291cf4f256938b2d017/140b6a962e5edbb4870419250e30bfb815b0d73e-640x480.gif" alt="アウトラン" />Out Run - score [0.86672974]
The Secret of Monkey Island - score [0.85569763]<p>このコードを実行する場合は、 <a href="https://github.com/dadoonet/langchain4j-demo/blob/9ec4b1d4c7c69821f143ddf272bbfed273c67b14/src/test/java/fr/pilato/demo/Step7SearchForVectorsTest.java#L110-L129">Step7SearchForVectorsTest.java</a>クラスをチェックアウトしてください。 </p><h2>舞台裏</h2><p>Elasticsearch Embedding ストアのデフォルト構成では、バックグラウンドで<a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl-knn-query.html">近似 kNN クエリが</a>使用されます。</p>POST games/_search
{
  "query" : {
    "knn": {
      "field": "vector",
      "query_vector": [-0.019137882, /* ... */, -0.0148779955]
    }
  }
}<p>ただし、埋め込みストアにデフォルトの構成 ( <code>ElasticsearchConfigurationKnn</code> ) とは別の構成 ( <code>ElasticsearchConfigurationScript</code> ) を提供することでこれを変更できます。</p>EmbeddingStore&lt;TextSegment&gt; embeddingStore =
  ElasticsearchEmbeddingStore.builder()
    .configuration(ElasticsearchConfigurationScript.builder().build())
    .indexName("games")
    .restClient(client)
    .build();<p><code>ElasticsearchConfigurationScript</code>実装は、<a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl-script-score-query.html"><code>script_score</code></a><a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl-script-score-query.html"> </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><a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl-script-score-query.html#vector-functions-cosine">関数</a> を使用して、バックグラウンドで クエリ を実行します。</p><p>基本的に、電話をかけるときは:</p>EmbeddingSearchResult&lt;TextSegment&gt; result = embeddingStore.search(
  EmbeddingSearchRequest.builder()
    .queryEmbedding(questionAsVector)
    .build());<p>これにより、次のコードが呼び出されます。</p>POST games/_search
{
  "query": {
    "script_score": {
      "script": {
        "source": "(cosineSimilarity(params.query_vector, 'vector') + 1.0) / 2",
        "params": {
          "queryVector": [-0.019137882, /* ... */, -0.0148779955]
        }
      }
    }
  }
}<p>この場合、結果は「順序」の点では変化せず、スコアのみが調整されます。これは、 <code>cosineSimilarity</code>呼び出しでは近似値を使用せず、一致するベクトルごとにコサインを計算するためです。</p>Out Run - score [0.871952]
The Secret of Monkey Island - score [0.86380446]<p>このコードを実行する場合は、 <a href="https://github.com/dadoonet/langchain4j-demo/blob/9ec4b1d4c7c69821f143ddf272bbfed273c67b14/src/test/java/fr/pilato/demo/Step7SearchForVectorsTest.java#L132-L155">Step7SearchForVectorsTest.java</a>クラスをチェックアウトしてください。</p><h2>まとめ</h2><p>テキストから埋め込みを簡単に生成する方法と、2 つの異なるアプローチを使用して Elasticsearch で最も近い近傍を保存および検索する方法について説明しました。</p><ul><li><p>デフォルトの<code>ElasticsearchConfigurationKnn</code>オプションを使用して、近似高速<code>knn</code>クエリを使用する</p></li><li><p>正確だが遅い<code>script_score</code>クエリを<code>ElasticsearchConfigurationScript</code>オプションとともに使用する</p></li></ul><p>次のステップでは、ここで学んだことを基に、完全な RAG アプリケーションを構築します。</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[Vector Database]]></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[LangChain4j を導入して、LLM の Java アプリケーションへの統合を簡素化します。]]></title>
    <description><![CDATA[LangChain4j (LangChain for Java) は、プレーン Java で RAG アプリケーションを構築するための強力なツールセットです。]]></description>
    <content:encoded><![CDATA[<p><a href="https://docs.langchain4j.dev/">LangChain4j フレームワークは</a>、<a href="https://github.com/langchain4j/langchain4j/blob/main/README.md#introduction">次の目標</a>を掲げて 2023 年に作成されました。</p>LangChain4j の目標は、LLM を Java アプリケーションに簡単に統合することです。<p>LangChain4j は次の標準的な方法を提供します:</p><ul><li><p>与えられたコンテンツ（例えばテキスト）から埋め込み（ベクトル）を作成する</p></li><li><p>埋め込みを埋め込みストアに保存する</p></li><li><p>埋め込みストア内の類似ベクトルを検索する</p></li><li><p>LLMと議論する</p></li><li><p>チャットメモリを使用して、LLMとの議論の文脈を記憶する</p></li></ul><p>このリストは網羅的なものではなく、LangChain4j コミュニティは常に新しい機能を実装しています。</p><p>この投稿では、フレームワークの最初の主要部分について説明します。</p><h2>プロジェクトにLangChain4j OpenAIを追加する</h2><p>すべての Java プロジェクトと同様に、これは依存関係の問題にすぎません。ここでは Maven を使用しますが、他の依存関係マネージャーでも同じことを実現できます。</p><p>ここで構築するプロジェクトの最初のステップとして、OpenAI を使用するので、 <code>langchain4j-open-ai</code>アーティファクトを追加するだけです。</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>残りのコードでは、 <a href="https://platform.openai.com/signup/">OpenAI</a>にアカウントを登録することで取得できる独自の API キー、またはデモ目的でのみ LangChain4j プロジェクトによって提供される API キーを使用します。</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>これで ChatLanguageModel のインスタンスを作成できます。</p>ChatLanguageModel model = OpenAiChatModel.withApiKey(getOpenAiApiKey());
<p>そして最後に、簡単な質問をして答えを得ることができます。</p>String answer = model.generate("Who is Thomas Pesquet?");
Logger.info("Answer is: {}", answer);
<p>与えられた答えは次のようになります:</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>このコードを実行する場合は、 <a href="https://github.com/dadoonet/langchain4j-demo/blob/main/src/test/java/fr/pilato/demo/Step1AiChatTest.java">Step1AiChatTest.java</a>クラスを確認してください。</p><h2>langchain4jでより多くのコンテキストを提供する</h2><p><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>これは、アシスタントを構築するために、より高度な LLM 統合を構築するのに役立つツールセットを提供します。ここでは、先ほど定義した<code>ChatLanguageModel</code>を自動的に呼び出す<code>chat</code>メソッドを提供する<code>Assistant</code>インターフェイスを作成します。</p>interface Assistant {
  String chat(String userMessage);
}
<p>LangChain4j <code>AiServices</code>クラスにインスタンスを構築するよう依頼するだけです。</p>Assistant assistant = AiServices.create(Assistant.class, model);
<p>次に、 <code>chat(String)</code>メソッドを呼び出します。</p>String answer = assistant.chat("Who is Thomas Pesquet?");
Logger.info("Answer is: {}", answer);
<p>これは以前と同じ動作になります。では、なぜコードを変更したのでしょうか?まず第一に、よりエレガントですが、それ以上に、シンプルな注釈を使用して LLM にいくつかの指示を与えることができるようになりました。</p>interface Assistant {
  @SystemMessage("Please answer in a funny way.")
  String chat(String userMessage);
}
<p>これにより、次のようになります:</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>このコードを実行する場合は、 <a href="https://github.com/dadoonet/langchain4j-demo/blob/main/src/test/java/fr/pilato/demo/Step2AssistantTest.java">Step2AssistantTest.java</a>クラスを確認してください。</p><h2>別のLLMへの切り替え：langchain4j-ollama</h2><p>素晴らしい<a href="https://ollama.com/">Ollamaプロジェクト</a>を利用できます。LLM を自分のマシン上でローカルに実行するのに役立ちます。</p><p><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>テストを使用してサンプル コードを実行しているので、プロジェクトに<a href="https://java.testcontainers.org/">Testcontainers を</a>追加しましょう。</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>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>先ほど使用した<code>OpenAiChatModel</code>ではなく、 <code>model</code>オブジェクトを<code>OllamaChatModel</code>に変更するだけです。</p>OllamaChatModel model = OllamaChatModel.builder()
  .baseUrl(ollama.getEndpoint())
  .modelName(MODEL_NAME)
  .build();
<p>モデルを含むイメージを取得するのに多少時間がかかる場合がありますが、しばらくすると答えが得られることに注意してください。</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>メモリがあればさらに良くなる</h2><p>複数の質問をした場合、デフォルトではシステムは以前の質問と回答を記憶しません。最初の質問の後に「彼はいつ生まれたのですか？」と尋ねると、私たちのアプリケーションは次のように答えます:</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>それはナンセンスだ。代わりに、<a href="https://docs.langchain4j.dev/tutorials/chat-memory">チャットメモリを</a>使用する必要があります。</p>ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
Assistant assistant = AiServices.builder(Assistant.class)
  .chatLanguageModel(model)
  .chatMemory(chatMemory)
  .build();
<p>同じ質問を実行すると、意味のある答えが得られます。</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>まとめ</h2><p><a href="https://www.elastic.co/search-labs/blog/langchain4j-elasticsearch-embedding-store">次の投稿</a>では、Elasticsearch を埋め込みストアとして使用して、プライベート データセットに質問する方法を説明します。これにより、アプリケーション検索を次のレベルに引き上げる方法が得られます。</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>