<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>「Embedding」タグの記事一覧Python Tech</title>
	<atom:link href="https://tech.nkhn37.net/tag/embedding/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Sun, 02 Nov 2025 21:24:33 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>「Embedding」タグの記事一覧Python Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Python】LangChain: RAGでLLMと外部データを連携する方法</title>
		<link>https://tech.nkhn37.net/python-langchain-rag-basics/</link>
					<comments>https://tech.nkhn37.net/python-langchain-rag-basics/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Mon, 19 Aug 2024 20:00:00 +0000</pubDate>
				<category><![CDATA[LangChain]]></category>
		<category><![CDATA[Embedding]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[Loader]]></category>
		<category><![CDATA[RAG]]></category>
		<category><![CDATA[Retrieval-Augmented Generation]]></category>
		<category><![CDATA[Retriever]]></category>
		<category><![CDATA[Splitter]]></category>
		<category><![CDATA[Vector Store]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=11061</guid>

					<description><![CDATA[LangChain を用いた RAG（Retrieval-Augmented Generation）で LLM と外部データを連携する方法を解説します。 LangChain による RAG（Retrieval-Augme [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><span class="marker"><strong>LangChain を用いた RAG（Retrieval-Augmented Generation）で LLM と外部データを連携する方法</strong></span>を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">LangChain による RAG（Retrieval-Augmented Generation）</h2>



<p class="wp-block-paragraph"><span class="marker"><strong>LangChain</strong></span> は、大規模言語モデル（LLM: Large Language Model）の活用を容易にするオープンソースの Python ライブラリです。</p>



<p class="wp-block-paragraph">LangChain には、PromptTemplate や OutputParser、Chain などの様々な機能を提供し、LLM の操作を簡略化しますが、その中でも重要な機能が RAG（Retrieval-Augmented Generation）です。この RAG により、LLM と外部データを連携が可能になります。</p>



<p class="wp-block-paragraph">この記事では、LangChain を用いた RAG で LLM と外部データを連携する方法を紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">RAG（Retrieval-Augmented Generation）</h3>



<p class="wp-block-paragraph">まず、<span class="marker"><strong>RAG（Retrieval-Augmented Generation）</strong></span>の概要について説明します。</p>



<p class="wp-block-paragraph">RAG は、外部データから必要な情報を探索し、LLM の生成プロセスに組み込むことで回答の精度を向上させる技術です。Retrieval は「検索、取得」、Augmented は「拡張された、増強された」、Generation は「生成」という意味があります。</p>



<p class="wp-block-paragraph">ChatGPT が登場した初期の時期は、学習に含まれていない直近情報に関する回答はできませんでしたが、RAG により大幅に回答精度は向上しました。ただし、事実に基づかない情報生成（ハルシネーション）を完全に防ぐことはできないので注意が必要です。</p>



<h3 class="wp-block-heading jinr-heading d--bold">LangChain による RAG の流れ</h3>



<p class="wp-block-paragraph">RAG は、以下の流れで実現されます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img fetchpriority="high" decoding="async" width="1024" height="311" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-5-1024x311.png" alt="LangChain RAGの流れ" class="wp-image-11079" srcset="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-5-1024x311.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-5-300x91.png 300w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-5-768x233.png 768w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-5.png 1460w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ol class="wp-block-list jinr-list">
<li>Load：データソースからデータを取り込みます。</li>



<li>Transform：テキストを前処理して文や単語などに分割するなど、データをインデックス化しやすいように変換します。</li>



<li>Embedding：データをベクトル情報に変換し、これを用いて意味的な類似性を計算できるようにします。</li>



<li>Vector Store：テキストとベクトル情報を検索しやすいように保存します。</li>



<li>Retrievers：Vector Store からユーザーの問い合わせに関連する情報を検索し、LLMと連携します。</li>
</ol>



<p class="wp-block-paragraph">上記の流れにより、質問に最も関連性のある情報を迅速に見つけ出し、LLM と連携して正確な回答を生成します。</p>



<p class="wp-block-paragraph">例として、社員が部門の残業状況を調べるケースを想定して、回答までの流れを見てみましょう。上記で紹介した流れで A 社の VectorStore が用意されているとします。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="1024" height="508" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-6-1024x508.png" alt="LangChain Retrieversの動作概要" class="wp-image-11082" style="width:654px;height:auto" srcset="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-6-1024x508.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-6-300x149.png 300w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-6-768x381.png 768w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-6.png 1135w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">このケースで、A 社や XX 部門の情報は個別企業の情報のため、ChatGPT 等の一般的な LLM には情報を含みません。</p>



<p class="wp-block-paragraph">そこで、A 社の社員から質問があった際に、Retrievers が関連する情報を Vector Store から検索し、質問内容に付与して LLM に問い合わせます。これにより、LLM の回答精度の向上が期待できます。</p>



<p class="wp-block-paragraph">上記が、RAG を実現するまでの流れでした。以降で、LangChain による RAG 実装の例を紹介していきます。</p>



<h2 class="wp-block-heading jinr-heading d--bold">LangChain における RAG 関連機能と実装</h2>



<p class="wp-block-paragraph">LangChain には、RAG を実現するための各種機能が提供されています。以降では、それぞれの基本的な使い方について説明し、RAG 実装の流れを紹介していきます。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--simple-box1  "><div class="c--simple-box-inner">
<p class="wp-block-paragraph">本記事で使用したバージョンは以下の通りです。バージョンが異なる場合は動作しないことがあります。</p>



<ul class="wp-block-list jinr-list">
<li>Python: 3.11.5</li>



<li>langchain: 0.2.11</li>



<li>langchain-core: 0.2.26</li>



<li>langchain-community: 0.2.10</li>



<li>langchain-text-splitters: 0.2.2</li>



<li>langchain-openai: 0.1.16</li>



<li>langchain-chroma 0.1.2</li>



<li>pypdf: 4.3.1</li>



<li>beautifulsoup4: 4.12.3</li>



<li>wikipedia: 1.4.0</li>
</ul>
</div></div></section>



<h3 class="wp-block-heading jinr-heading d--bold">Document Loader</h3>



<p class="wp-block-paragraph"><span class="marker"><strong>Document Loader</strong></span> は、外部のドキュメントやデータソースからデータを取得するための機能群です。</p>



<p class="wp-block-paragraph">色々な種類の Loader がありますが、基本的な Loader の使い方を紹介します。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="311" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-8-1024x311.png" alt="LangChain Document Loader" class="wp-image-11107" srcset="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-8-1024x311.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-8-300x91.png 300w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-8-768x233.png 768w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-8.png 1460w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<h4 class="wp-block-heading jinr-heading d--bold"><code>TextLoader</code>：テキストファイルを読み込む</h4>



<p class="wp-block-paragraph">テキストファイルを読み込む場合には、<span class="marker"><strong><code>TextLoader</code></strong></span> を使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from langchain_community.document_loaders import TextLoader

# TextLoaderを用意する
loader = TextLoader("../data/index.txt", encoding="utf-8")

# データを読み込む
document = loader.load()

print(document)
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
[Document(metadata={'source': '../data/index.txt'}, page_content='LangChainとは\nLangChainとは、大規模言語モデル(LLM: Large Language Model)を活用するためのオープンソースPythonライブラリです。公式サイトは、こちらを参照してください。\n\nLangChainは、LLMを用いた複雑なタスクを実行するア
...(途中省略)...
した。ただし、アップデート時には、これらのパッケージ間での依存関係や整合性を考慮し、各バージョンの互換性にも注意が必要です。各パッケージがどのように連携するかは公式ドキュメントを参照するなどして確認するようにしてください。')]
</pre>



<p class="wp-block-paragraph"><code>TextLoader</code> は、インスタンス化の際にテキストファイルのパスやエンコーディングを指定し、データの読み込みには <code>load</code> メソッドを使用します。</p>



<p class="wp-block-paragraph">返却値は、<code>Document</code> クラスのインスタンスで、メタデータは <code>metadata</code> に、テキスト内容は <code>page_content</code> に格納されます。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>DirectoryLoader</code>：ディレクトリ内のファイルを読み込む</h4>



<p class="wp-block-paragraph">ディレクトリ内のファイルをまとめて読み込みたい場合には <span class="marker"><strong><code>DirectoryLoader</code></strong></span> を使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from langchain_community.document_loaders import DirectoryLoader, TextLoader

# DirectoryLoaderを用意する
loader = DirectoryLoader(
    "../data",
    glob="*.txt",
    recursive=True,
    loader_cls=TextLoader,
    loader_kwargs={"encoding": "utf-8"},
)

# データを読み込む
documents = loader.load()

print(documents)
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
[Document(metadata={'source': '..\\data\\index.txt'}, page_content='LangChainとは\nLangChainとは、大規模言語モデル(LLM: Large Language Model)を活用するためのオープンソースPythonライブラリです。公式サイトは、こちらを参照してください。\n\nLangChainは、LLMを用いた複雑なタスクを実行する
...(途中省略)...
Document(metadata={'source': '..\\data\\index1.txt'}, page_content='LangChainの基本的な使い方\nここでは、LangChainの基本的な使い方を紹介したいと思います。\n\n本記事で紹介する環境は以下バージョンでの動作結果です。バージョン更新が速いため最新バージョンではうまく動作しない可能性があります
...(途中省略)...
LangChainにはさまざまな機能があります。これらの機能についても、今後の記事更新や新たな記事で詳しく解説したいと考えています。\n\n皆さんも、ぜひ色々と調べてLangChainを使ってみてください。')]</pre>



<p class="wp-block-paragraph"><code>DirectoryLoader</code> は、指定したディレクトリ内のファイルを一括で読み込みます。今回例では、<code>data</code> ディレクトリ内の <code>index.txt</code> と <code>index1.txt</code> を対象としています。</p>



<p class="wp-block-paragraph"><code>DirectoryLoader</code> の引数は以下のようなものがあります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>引数</th><th>概要説明</th></tr></thead><tbody><tr><td><code>glob</code></td><td>読み込むファイルのパターンを指定します。例えば「<code>*.txt</code>」とすることで、指定ディレクトリ内のすべてのテキストファイルが対象になります。</td></tr><tr><td><code>recursive</code></td><td>ディレクトリの検索を再帰的に行うかどうかを指定します。</td></tr><tr><td><code>loader_cls</code></td><td>各ファイルを読み込む際に使用する Document Loader クラスを指定します。</td></tr><tr><td><code>loader_kwargs</code></td><td><code>loader_cls</code> で指定した Document Loader クラスに渡す追加の引数を設定します。</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">読み込みは <code>load</code> メソッドで行い、結果は <code>Document</code> のリストとして返されます。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>PyPDFLoader</code>：PDFファイルを読み込む</h4>



<p class="wp-block-paragraph">PDF ファイルを読み込む場合には <span class="marker"><strong><code>PyPDFLoader</code></strong></span> を使用します。事前に <code>pypdf</code> パッケージをインストールしてください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pip install pypdf</pre>



<p class="wp-block-paragraph"><code>PyPDFLoader</code> は、以下のように使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from langchain_community.document_loaders import PyPDFLoader

# PDFLoaderを用意する
loader = PyPDFLoader("../data/sample.pdf")

# データを読み込む
document = loader.load()

print(document)
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
[Document(metadata={'source': './data/sample.pdf', 'page': 0}, page_content='LangChain とは  \nLangChain とは、大規模言語モデル (LLM: Large Language Model) を活用するためのオー\nプンソース Pythonライブラリです。公式サイトは、 こちらを参照してください。  \nLangChain は、 LLMを用いた複雑
...(途中省略)...
の研究チームによる「 Attention is All You Need 」という非常に有名な論文で紹介されまし\nた。  \n従来の再帰的ニューラルネットワーク (RNN)やLSTM(Long Short Term Memory) などで\n不得意であった長い依存関係の問題を解決し、その後の BERTやGPT等の現在の主流技\n術の登場に貢献しています。  \n ')]</pre>



<p class="wp-block-paragraph"><code>PyPDFLoader</code> の使い方は基本的に <code>TextLoader</code> と同様です。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>WebBaseLoader</code>：Webサイトの情報を取得する</h4>



<p class="wp-block-paragraph">Web サイトのデータを読み込む場合には <span class="marker"><strong><code>WebBaseLoader</code></strong></span> を使用します。Web スクレイピングには、Beautiful Soup が必要ですので、事前にインストールしてください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pip install beautifulsoup4</pre>



<p class="wp-block-paragraph"><code>WebBaseLoader</code> は、以下のように使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from langchain_community.document_loaders import WebBaseLoader

# WebBaseLoaderを用意する
loader = WebBaseLoader("https://tech.nkhn37.net/profile/")

# データを読み込む
document = loader.load()

print(document)
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
[Document(metadata={'source': 'https://tech.nkhn37.net/profile/', 'title': 'ホッシーの自己紹介｜Python Tech', 'description': 'ホッシーのプロフィール プロフィール ※キャラクターデザイン ゼイルン様 愛知県生まれの30代サラリーマンのホッシーとい', 'language': 'ja'}, page_content='\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nホッシーの自己紹介｜Python Tech\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPython Tech ~Python学習サイト~
...(途中省略)...
\nエキスパートPythonプログラミング\nPythonデータサイエンスハンドブック\nPythonによるディープラーニング\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\nHOME\n\n\n\n\n\n\n自己紹介\n\n \n\n\n \n\n\n\n\n\nプライバシーポリシー\n免責事項\n2021–2024\xa0\xa0Python Tech\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n')]</pre>



<p class="wp-block-paragraph"><code>WebBaseLoader</code> には、読み込み対象となる Web サイトの URL を指定します。今回は私のサイトのプロフィールページを指定してみました。データを取得手順は、<code>TextLoader</code> などの他の Document Loader と同様です。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>WikipediaLoader</code>：Wikipedia の情報を取得する</h4>



<p class="wp-block-paragraph">Wikipedia からデータを読み込むには <span class="marker"><strong><code>WikipediaLoader</code></strong></span> を使用します。事前に <code>wikipedia</code> パッケージをインストールしてください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pip install wikipedia</pre>



<p class="wp-block-paragraph"><code>WikipediaLoader</code> は、以下のように使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from langchain_community.document_loaders import WikipediaLoader

# WikipediaLoaderを用意する
loader = WikipediaLoader(query="langchain")

# データを読み込む
documents = loader.load()

# 結果を表示
print(len(documents))
print([d.page_content[:100] for d in documents])
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
5
['LangChain is a framework designed to simplify the creation of applications using large language mode', 'Retrieval augmented generation (RAG) is a type of information retrieval process. It modifies interac', 'In natural language processing, a sentence embedding refers to a numeric representation of a sentenc', 'DataStax, Inc. is a real-time data for AI company based in Santa Clara, California. Its product Astr', 'Prompt injection is a family of related computer security exploits carried out by getting a machine ']</pre>



<p class="wp-block-paragraph">今回は <code>"langchain"</code> に関連する Wikipedia の情報を取得してみました。<code>WikipediaLoader</code> は、検索クエリを <code>query</code> 引数に指定してデータを取得します。</p>



<p class="wp-block-paragraph">デフォルトでは英語の記事（<code>lang="en"</code>）が対象です。結果として 5 つの記事が取得されました。言語を日本語に変更するには、<code>lang="ja"</code> を指定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from langchain_community.document_loaders import WikipediaLoader

# WikipediaLoaderを用意する
loader = WikipediaLoader(query="langchain", lang="ja")

# データを読み込む
documents = loader.load()

# 結果を表示
print(len(documents))
print([d.page_content[:100] for d in documents])
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
1
['LangChain（ラングチェイン）は、大規模言語モデル（LLM）を使ったアプリケーションソフトウェアの作成を簡素化するように設計されたフレームワークである。言語モデル統合フレームワークとして、Lan']</pre>



<p class="wp-block-paragraph">例では、日本語 Wikipedia には <code>"langchain"</code> の関連ページが 1 つ見つかりました。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Text Splitter</h3>



<p class="wp-block-paragraph"><span class="marker"><strong>Text Splitter</strong></span>は、読み込んだドキュメントを分割し、Embedding で扱いやすく加工するツールです。これは、RAG における「Transform」に対応します。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="311" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-9-1024x311.png" alt="LangChain Text Splitters" class="wp-image-11108" srcset="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-9-1024x311.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-9-300x91.png 300w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-9-768x233.png 768w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-9.png 1460w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">LangChain には、基本クラスとして <span class="marker"><strong><code>TextSplitter</code></strong></span> があり、これを継承した様々なクラスが提供されています。以下で主要なクラスの使い方を紹介します。</p>



<p class="wp-block-paragraph"><strong>【プロパティ】</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>名称</th><th>説明</th></tr></thead><tbody><tr><td><code>chunk_size</code></td><td>チャンクの最大サイズ</td></tr><tr><td><code>chun_overlap</code></td><td>チャンク間の重複文字数</td></tr><tr><td><code>length_function</code></td><td>チャンクサイズを計測する関数（デフォルトは <code>len</code>）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>【メソッド】</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>名称</th><th>説明</th></tr></thead><tbody><tr><td><code>text_split</code></td><td>文字列を分割してリストを返す</td></tr><tr><td><code>split_documents</code></td><td>ドキュメントリストを分割してリストを返す</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><code>chunk_size</code> は分割する際の最大サイズで、<code>chunk_overlap</code> はチャンク間の重複部分のサイズです。<code>length_function</code> は、チャンクサイズの計測に使用する関数で、カスタム関数を渡すことも可能です。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>CharacterTextSplitter</code>：文字数で分割する</h4>



<p class="wp-block-paragraph"><span class="marker"><strong><code>CharacterTextSplitter</code></strong></span> は、文字数を基準にドキュメントを分割します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter

# TextLoaderを用意する
loader = TextLoader("../data/index.txt", encoding="utf-8")

# データを読み込む
document = loader.load()

# Character Text Splitterを用意する
text_splitter = CharacterTextSplitter(
    chunk_size=200,
    chunk_overlap=100,
    add_start_index=True,
    separator="。",
)

# 読み込んだデータを分割する
split_document = text_splitter.split_documents(document)

print(len(split_document))
print(split_document)
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
21
[Document(metadata={'source': '../data/index.txt', 'start_index': 0}, page_content='LangChainとは\nLangChainとは、大規模言語モデル(LLM: Large Language Model)を活用するためのオープンソースPythonライブラリです。公式サイトは、こちらを参照してください'), Document(metadata={'source': '../data/index.txt', 'start_index': 88}, page_content='公式サイトは、こちらを参照してください。\n\nLangChainは、LLMを用いた複雑なタスクを実行するアプリケーションを構築することを目的としており、様々なツールとの統合、タスク指向の設計、拡張性とカスタマイズ性といったことを特徴としています。\n\nまた、オープンソースプロジェクトとして、多くの開発者や研究者がコミュニティを通じて貢献し、ライブラリは常に改善されています'), 
...(途中省略)..
Document(metadata={'source': '../data/index.txt', 'start_index': 2232}, page_content='バージョン0.1.0以降では、上記のようにパッケージ分割されることで開発や保守がしやすく、ユーザーにとってもパッケージ選択をしやすく柔軟性が増しました。ただし、アップデート時には、これらのパッケージ間での依存関係や整合性を考慮し、各バージョンの互換性にも注意が必要です。各パッケージがどのように連携するかは公式ドキュメントを参照するなどして確認するようにしてください')]</pre>



<p class="wp-block-paragraph"><code>CharacterTextSplitter</code> の使用には、<code>chunk_size</code> や <code>chunk_overlap</code> を設定します。<code>add_start_index=True</code> により、分割時の開始インデックスがメタデータに含まれます。また、分割の基準となるセパレータを <code>separator</code> 引数を使って指定できます。</p>



<p class="wp-block-paragraph">今回の例では 21 個のチャンクに分割されました。今回は、<code>chunk_size=200</code>、<code>chunk_overlap=100</code> として半分ぐらい重複するように設定してみました。実際の結果を見ても一部重複部分が表れていることが分かります。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>RecursiveCharacterTextSplitter</code>：複数の区切り文字で分割する</h4>



<p class="wp-block-paragraph"><span class="marker"><strong><code>RecursiveCharacterTextSplitter</code></strong></span> は、複数のセパレータを指定して分割します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

# TextLoaderを用意する
loader = TextLoader("../data/index.txt", encoding="utf-8")

# データを読み込む
document = loader.load()

# Recursive Character Text Splitterを用意する
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=200,
    chunk_overlap=100,
    add_start_index=True,
    separators=[",", "、", "。"],
)

# 読み込んだデータを分割する
split_document = text_splitter.split_documents(document)

print(len(split_document))
print(split_document)
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
22
[Document(metadata={'source': '../data/index.txt', 'start_index': 0}, page_content='LangChainとは\nLangChainとは、大規模言語モデル(LLM: Large Language Model)を活用するためのオープンソースPythonライブラリです。公式サイトは、こちらを参照してください。\n\nLangChainは、LLMを用いた複雑なタスクを実行するアプリケーションを構築することを目的としており、様々なツールとの統合、タスク指向の設計'), Document(metadata={'source': '../data/index.txt', 'start_index': 94}, page_content='、こちらを参照してください。\n\nLangChainは、LLMを用いた複雑なタスクを実行するアプリケーションを構築することを目的としており、様々なツールとの統合、タスク指向の設計、拡張性とカスタマイズ性といったことを特徴としています。\n\nまた、オープンソースプロジェクトとして、多くの開発者や研究者がコミュニティを通じて貢献し、ライブラリは常に改善されています。LangChainを用いることで'), 
...(途中省略)...
Document(metadata={'source': '../data/index.txt', 'start_index': 2246}, page_content='、上記のようにパッケージ分割されることで開発や保守がしやすく、ユーザーにとってもパッケージ選択をしやすく柔軟性が増しました。ただし、アップデート時には、これらのパッケージ間での依存関係や整合性を考慮し、各バージョンの互換性にも注意が必要です。各パッケージがどのように連携するかは公式ドキュメントを参照するなどして確認するようにしてください。')]</pre>



<p class="wp-block-paragraph"><code>RecursiveCharacterTextSplitter</code> では、<code>separators</code> 引数で複数の区切り文字リストを指定します。複数のセパレータを指定することで、より柔軟な分割が可能です。今回の例では 22 個のチャンクに分割されました。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>TokenTextSplitter</code>：トークン数で分割する</h4>



<p class="wp-block-paragraph"><span class="marker"><strong><code>TokenTextSplitter</code></strong></span> は、トークン数を基準に分割します。トークン数は使用するモデルごとに決まります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import TokenTextSplitter

# TextLoaderを用意する
loader = TextLoader("../data/index.txt", encoding="utf-8")

# データを読み込む
document = loader.load()

# Token Text Splitterを用意する
text_splitter = TokenTextSplitter(
    chunk_size=200,
    chunk_overlap=100,
    add_start_index=True,
    encoding_name="cl100k_base",
)

# 読み込んだデータを分割する
split_document = text_splitter.split_documents(document)

print(len(split_document))
print(split_document)
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
19
[Document(metadata={'source': '../data/index.txt', 'start_index': 0}, page_content='LangChainとは\nLangChainとは、大規模言語モデル(LLM: Large Language Model)を活用するためのオープンソースPythonライブラリです。公式サイトは、こちらを参照してください。\n\nLangChainは、LLMを用いた複雑なタスクを実行するアプリケーションを構築することを目的としており、様々なツールとの統合、タスク指向の設計、拡張性とカスタマイズ性といったことを特徴としています。\n\nまた、オープンソースプロジェクトとして、多くの開発者や研究者'), Document(metadata={'source': '../data/index.txt', 'start_index': 148}, page_content='構築することを目的としており、様々なツールとの統合、タスク指向の設計、拡張性とカスタマイズ性といったことを特徴としています。\n\nまた、オープンソースプロジェクトとして、多くの開発者や研究者がコミュニティを通じて貢献し、ライブラリは常に改善されています。LangChainを用いることで、開発者はLLMを最大限に活用してアプリケーションを構築できます。\n\nLangChainの理解に必要な概念\nLangChainを扱っていく'), 
...(途中省略)...
Document(metadata={'source': '../data/index.txt', 'start_index': -1}, page_content='�では、上記のようにパッケージ分割されることで開発や保守がしやすく、ユーザーにとってもパッケージ選択をしやすく柔軟性が増しました。ただし、アップデート時には、これらのパッケージ間での依存関係や整合性を考慮し、各バージョンの互換性にも注意が必要です。各パッケージがどのように連携するかは公式ドキュメントを参照するなどして確認するようにしてください。')]</pre>



<p class="wp-block-paragraph"><code>TokenTextSplitter</code> は、<code>encoding_name</code> 引数でトークン分割方法を指定します。例えば、<code>"cl100k_base"</code> は OpenAI の GPT モデルのトークン化方法に対応しています。今回の例では 19 個のチャンクに分割されました。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Embedding</h3>



<p class="wp-block-paragraph"><span class="marker"><strong>Embedding</strong></span> は、テキストを数値ベクトルへ変換し、Vector Store に蓄積するための機能です。Document Loader で読み込んだデータを Text Splitter で分割した後にベクトル化します。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="311" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-10-1024x311.png" alt="LangChain Embedding" class="wp-image-11109" srcset="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-10-1024x311.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-10-300x91.png 300w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-10-768x233.png 768w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-10.png 1460w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">LangChain では、基本クラスとして <span class="marker"><strong><code>Embedding</code></strong></span> クラスがあり、これを継承した様々なクラスが提供されています。</p>



<p class="wp-block-paragraph"><strong>【メソッド】</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>名称</th><th>説明</th></tr></thead><tbody><tr><td><code>embed_query</code></td><td>単一の文字列を対象にベクトル化する</td></tr><tr><td><code>embed_documents</code></td><td>複数の文字列を対象にベクトル化する</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><code>embed_query</code> は、単一のテキストを、<code>embed_documents</code> は、複数のテキストを対象にします。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>OpenAIEmbeddings</code>：OpenAI の埋め込みモデル</h4>



<p class="wp-block-paragraph">Embedding のモデルには様々ありますが、ここでは OpenAIの <span class="marker"><strong><code>OpenAIEmbeddings</code></strong></span> を使用します。使用には <code>langchain-openai</code>パッケージが必要です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pip install langchain-openai</pre>



<p class="wp-block-paragraph">OpenAI の API 使用にはキーが必要です。APIキーについては「<a href="https://tech.nkhn37.net/python-openai-api-basics/" target="_blank" rel="noreferrer noopener">OpenAI APIの使い方の基本</a>」や「<a href="https://tech.nkhn37.net/python-langchain-overview/" target="_blank" rel="noreferrer noopener">LangChainで大規模言語モデル（LLM）を活用する</a>」を参考にしてください。今回は、<code>config.ini</code> に設定して使用します。</p>



<p class="wp-block-paragraph"><code><strong>config.ini</strong></code></p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[OPENAI]
key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</pre>



<p class="wp-block-paragraph"><code>OpenAIEmbeddings</code> を使用した埋め込み（ベクトル化）は以下のようにします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import configparser

from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import TokenTextSplitter

# コンフィグファイルからキーを取得する
config = configparser.ConfigParser()
config.read("config.ini")

# TextLoaderを用意する
loader = TextLoader("../data/index.txt", encoding="utf-8")

# データを読み込む
document = loader.load()

# Token Text Splitterを用意する
text_splitter = TokenTextSplitter(
    chunk_size=200,
    chunk_overlap=100,
    add_start_index=True,
    encoding_name="cl100k_base",
)

# 読み込んだデータを分割する
split_documents = text_splitter.split_documents(document)

# 埋め込みモデルを用意する
embeddings_model = OpenAIEmbeddings(api_key=config["OPENAI"]["key"])

# 読み込んだデータをベクトル化する
embed = embeddings_model.embed_documents([d.page_content for d in split_documents])
print(len(embed))
print(embed)
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
19
[[-0.007674966007471085, -0.0046662986278533936, -0.011643846519291401, -0.0388936847448349, 0.013503627851605415, 0.004646083805710077, -0.012209867127239704, 0.03091549128293991, 0.007937761023640633, 
...(途中省略)...
-0.02785574644804001, -0.01018467452377081, 0.012009980157017708, -0.010409531183540821, -0.01772397942841053, -0.010144994594156742, -0.012261290103197098]]</pre>



<p class="wp-block-paragraph"><code>OpenAIEmbeddings</code> は、API キーを渡してモデルを作成し、<code>embed_documents</code> メソッドで分割したドキュメントをベクトル化します。結果として、各ドキュメントがベクトル化されていることが確認できます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Vector Stores（Chroma）</h3>



<p class="wp-block-paragraph">ベクトル化したデータを蓄積する <span class="marker"><strong>Vector Store</strong></span> としては、Chroma、Pinecone、FAISS、Lance などがあります。ここでは、手軽で汎用性の高い Chroma を使用したベクトルデータの蓄積方法を紹介します。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="311" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-11-1024x311.png" alt="LangChain Vector Store" class="wp-image-11110" srcset="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-11-1024x311.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-11-300x91.png 300w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-11-768x233.png 768w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-11.png 1460w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<h4 class="wp-block-heading jinr-heading d--bold">Chromaにベクトル情報を保存する（InMemory）</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>Chroma</strong></span> は、ベクトル（高次元の数値配列）を効率的に保存・検索するためのベクトルデータベースです。コサイン類似度やドット積を使用してベクトル間の類似性を計算することができます。</p>



<p class="wp-block-paragraph">Chroma の使用にはインストールが必要です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pip install langchain-chroma</pre>



<p class="wp-block-paragraph">以下は、Embedding で生成したベクトル情報を Chroma に蓄積する例です。InMemory（メモリ上）に Vector Store を構築しています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import configparser

from langchain_chroma import Chroma
from langchain_community.document_loaders import TextLoader
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain_text_splitters import TokenTextSplitter

# コンフィグファイルからキーを取得する
config = configparser.ConfigParser()
config.read("config.ini")

# TextLoaderを用意する
loader = TextLoader("../data/index1.txt", encoding="utf-8")
# データを読み込む
document = loader.load()

# Token Text Splitterを用意する
text_splitter = TokenTextSplitter(
    chunk_size=200,
    chunk_overlap=100,
    add_start_index=True,
    encoding_name="cl100k_base",
)

# 読み込んだデータを分割する
split_documents = text_splitter.split_documents(document)

# 埋め込みモデルを用意する
embeddings_model = OpenAIEmbeddings(api_key=config["OPENAI"]["key"])

# ChromaにInMemoryで格納する
db = Chroma.from_documents(split_documents, embedding=embeddings_model)

# Chromaを検索する
query = "LangChainとは何ですか？"
docs = db.similarity_search(query)

print(len(docs))
print(docs)
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
4
[Document(metadata={'source': '../data/index1.txt', 'start_index': -1}, page_content='デルの簡単な使い方について紹介しました。LangChainにはさまざまな機能があります。これらの機能についても、今後の記事更新や新たな記事で詳しく解説したいと考えています。\n\n皆さんも、ぜひ色々と調べてLangChainを使ってみてください。'), Document(metadata={'source': '../data/index1.txt', 'start_index': 5241}, page_content='することで、APIコールが省略され、コスト節約とレスポンス向上が期待できます。\n\nLangChainの様々な機能\nLangChainには他にも様々な機能があります。以下のページも必要に応じて参考にしてください。\n\nMemoryで情報を保存・管理する\nPromptTemplateで柔軟にプロンプトを定義する\nOutputParserで出力形式を制御する\nChainを使用してワークフローを実行する\n\nまとめ\nPythonで大規模言語モデルを活用する際に使用できるLangChainの概要について解説しました。\n\nLangChainは、Model（モデル'), Document(metadata={'source': '../data/index1.txt', 'start_index': 0}, page_content='LangChainの基本的な使い方\nここでは、LangChainの基本的な使い方を紹介したいと思います。\n\n本記事で紹介する環境は以下バージョンでの動作結果です。バージョン更新が速いため最新バージョンではうまく動作しない可能性がありますがご了承ください。\n\nPython: 3.11.5\nlangchain: 0.2.11\nlangchain-core: 0.2.26\nlangchain-community: 0.2.10\nlangchain-openai: 0.1.16\nLangChainのインストール\nLangChainは、pipを使用してインストールすることができます。以下のpip installでライブラリをインストールしてください。\n\npip install langchain lang'), Document(metadata={'source': '../data/index1.txt', 'start_index': 5517}, page_content='）、Prompt（プロンプト）、Memory（メモリー）、Index（インデックス）、Chain（チェイン）、Agent（エージェント）といった構成要素で成り立っており、LLMを用いた複雑なタスクを開発することを便利にしてくれます。\n\nこの記事では、概要とOpenAIのモデルの簡単な使い方について紹介しました。LangChainにはさまざまな機能があります。これらの機能についても、今後の記事更新や新たな記事で詳しく解説したいと考えています。\n\n皆さんも、ぜひ色々と調べてLangChainを使ってみ')]</pre>



<p class="wp-block-paragraph">Chroma では、<code>from_documents</code> メソッドに分割したベクトル化対象のドキュメントと、埋め込みモデルを指定します。これにより、対象ドキュメントをモデルでベクトル化しつつ蓄積できます。</p>



<p class="wp-block-paragraph">検索時には、<code>similarity_search</code> に検索対象の文字列を指定します。今回の例では、指定した「<code>"LangChainとは何ですか？"</code>」に類維持するドキュメントとして 4 件ヒットしました。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ベクトル情報をファイル出力して利用する（<code>persist_directory</code>）</h4>



<p class="wp-block-paragraph">InMemory の Vector Store はプログラム終了時に消えてしまいます。永続的に保存するには、<code>persist_directory</code> を使用して保存先を指定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Chromaにファイルに格納する
db = Chroma.from_documents(
    split_documents,
    embedding=embeddings_model,
    persist_directory="./chroma_db",
)</pre>



<p class="wp-block-paragraph"><code>persist_directory</code> に保存先を指定すると、<code>chroma_db</code> ディレクトリが生成され、<code>sqlite</code> のデータやバイナリファイルが生成されます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="324" height="139" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-7.png" alt="chroma_dbの結果" class="wp-image-11100" srcset="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-7.png 324w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-7-300x129.png 300w" sizes="(max-width: 324px) 100vw, 324px" /></figure>
</div>


<p class="wp-block-paragraph">保存したデータを再利用する際は以下のように読み込みます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import configparser

from langchain_chroma import Chroma
from langchain_openai.embeddings import OpenAIEmbeddings

# コンフィグファイルからキーを取得する
config = configparser.ConfigParser()
config.read("config.ini")

# Chromaを読み込む
db = Chroma(
    persist_directory="./chroma_db",
    embedding_function=OpenAIEmbeddings(openai_api_key=config["OPENAI"]["key"]),
)

# Chromaを検索する
query = "LangChainとは何ですか？"
docs = db.similarity_search(query)

print(len(docs))
print(docs)
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
4
[Document(metadata={'source': '../data/index1.txt', 'start_index': -1}, page_content='デルの簡単な使い方について紹介しました。LangChainにはさまざまな機能があります。これらの機能についても、今後の記事更新や新たな記事で詳しく解説したいと考えています。\n\n皆さんも、ぜひ色々と調べてLangChainを使ってみてください。'), Document(metadata={'source': '../data/index1.txt', 'start_index': 5241}, page_content='することで、APIコールが省略され、コスト節約とレスポンス向上が期待できます。\n\nLangChainの様々な機能\nLangChainには他にも様々な機能があります。以下のページも必要に応じて参考にしてください。\n\nMemoryで情報を保存・管理する\nPromptTemplateで柔軟にプロンプトを定義する\nOutputParserで出力形式を制御する\nChainを使用してワークフローを実行する\n\nまとめ\nPythonで大規模言語モデルを活用する際に使用できるLangChainの概要について解説しました。\n\nLangChainは、Model（モデル'), Document(metadata={'source': '../data/index1.txt', 'start_index': 0}, page_content='LangChainの基本的な使い方\nここでは、LangChainの基本的な使い方を紹介したいと思います。\n\n本記事で紹介する環境は以下バージョンでの動作結果です。バージョン更新が速いため最新バージョンではうまく動作しない可能性がありますがご了承ください。\n\nPython: 3.11.5\nlangchain: 0.2.11\nlangchain-core: 0.2.26\nlangchain-community: 0.2.10\nlangchain-openai: 0.1.16\nLangChainのインストール\nLangChainは、pipを使用してインストールすることができます。以下のpip installでライブラリをインストールしてください。\n\npip install langchain lang'), Document(metadata={'source': '../data/index1.txt', 'start_index': 5517}, page_content='）、Prompt（プロンプト）、Memory（メモリー）、Index（インデックス）、Chain（チェイン）、Agent（エージェント）といった構成要素で成り立っており、LLMを用いた複雑なタスクを開発することを便利にしてくれます。\n\nこの記事では、概要とOpenAIのモデルの簡単な使い方について紹介しました。LangChainにはさまざまな機能があります。これらの機能についても、今後の記事更新や新たな記事で詳しく解説したいと考えています。\n\n皆さんも、ぜひ色々と調べてLangChainを使ってみ')]</pre>



<h4 class="wp-block-heading jinr-heading d--bold">Collection を使用して効率的にデータを扱う</h4>



<p class="wp-block-paragraph">Chroma では、データを整理するために Collection を使用します。Collection 名を <code>collection_name</code> 引数に指定してデータを管理することで、効率的にデータを検索できます。なお、デフォルトでは <code>collection_name="langchain"</code> となっています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Chromaにファイルに格納する
db = Chroma.from_documents(
    split_documents,
    embedding=embeddings_model,
    collection_name="collection_1",
    persist_directory="./chroma_db",
)</pre>



<p class="wp-block-paragraph">検索時では、<code>collection_name</code>を指定することで対象 Collection を検索可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Chromaを読み込む
db = Chroma(
    persist_directory="./chroma_db",
    collection_name="collection_1",
    embedding_function=OpenAIEmbeddings(openai_api_key=config["OPENAI"]["key"]),
)</pre>



<p class="wp-block-paragraph">このように <code>collection_name</code> を指定することで、複数のデータセットを整理して管理できます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Retriever</h3>



<p class="wp-block-paragraph">これまで外部データを取得し、Vector Store を蓄積する方法を紹介しました。ここからは、RAG の中心となる <span class="marker"><strong>Retriever</strong></span> の使い方について説明します。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="311" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-12-1024x311.png" alt="LangChain Retrievers" class="wp-image-11111" srcset="https://tech.nkhn37.net/wp-content/uploads/2024/08/image-12-1024x311.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-12-300x91.png 300w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-12-768x233.png 768w, https://tech.nkhn37.net/wp-content/uploads/2024/08/image-12.png 1460w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">今回は、架空の会社「あいうえおカンパニー」の社長プロフィールを使用して Vector Store を構築し、LLM がその情報を使って質問に答えられるかを確認します。</p>



<h4 class="wp-block-heading jinr-heading d--bold">外部データの準備</h4>



<p class="wp-block-paragraph">以下は、架空の会社「あいうえおカンパニー」の社長プロフィールデータです。このデータも ChatGPT を使用して生成しています。</p>



<p class="wp-block-paragraph"><strong><code>profile.md</code></strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 社長プロフィール

## 名前
**山田 太郎 (Yamada Taro)**

## 役職
**代表取締役社長**

## 会社名
**あいうえおカンパニー**

## 生年月日
**1978年5月10日**

## 出身地
**東京都渋谷区**

## 学歴
- **2000年** 東京大学 経済学部 卒業
- **2005年** ハーバードビジネススクール MBA 取得

## 経歴
- **2000年:** 大手商社に入社し、営業部門でキャリアをスタート。国内外のビジネス展開をリードし、業績を大幅に向上させる。
- **2005年:** MBA取得後、外資系コンサルティング会社に転職し、戦略コンサルタントとして活躍。複数の業界において企業変革を支援。
- **2010年:** あいうえおカンパニーに参画し、マーケティング部門の統括に任命される。革新的なプロモーション戦略を展開し、ブランドの認知度を大幅に向上させる。
- **2015年:** 取締役に昇進し、経営戦略全般を担当。新規事業の立ち上げやM&amp;Aに積極的に取り組む。
- **2020年:** 代表取締役社長に就任。デジタルトランスフォーメーションとグローバル展開を推進し、会社の成長を加速させる。

## 専門分野
- 経営戦略
- グローバルマーケティング
- デジタルトランスフォーメーション
- M&amp;A

## 趣味
- 読書（ビジネス書、歴史書）
- ゴルフ
- 旅行（特にヨーロッパと東南アジア）

## 座右の銘
**「挑戦なくして成長なし」**

山田太郎氏は、革新的なリーダーシップとグローバルな視野を持ち、あいうえおカンパニーを次の成長ステージへと導く原動力となっています。
</pre>



<p class="wp-block-paragraph">以下のコードで Chroma の Vector Store を構築します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import configparser

from langchain_chroma import Chroma
from langchain_community.document_loaders import TextLoader
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain_text_splitters import TokenTextSplitter

# コンフィグファイルからOpenAI用のキーを取得する
config = configparser.ConfigParser()
config.read("config.ini")

# TextLoaderを用意する
loader = TextLoader("./profile.md", encoding="utf-8")

# データを読み込む
document = loader.load()

# Token Text Splitterを用意する
text_splitter = TokenTextSplitter(
    chunk_size=100,
    chunk_overlap=20,
    add_start_index=True,
    encoding_name="cl100k_base",
)
# 読み込んだデータを分割する
split_documents = text_splitter.split_documents(document)

# 埋め込みモデルを用意する
embeddings_model = OpenAIEmbeddings(api_key=config["OPENAI"]["key"])

# Chromaにファイルに格納する
db = Chroma.from_documents(
    split_documents,
    collection_name="AIUEO_Company",
    embedding=embeddings_model,
    persist_directory="./chroma_db",
)
</pre>



<p class="wp-block-paragraph">上記までで外部データから構築した Vector Store の準備が整いました。</p>



<h4 class="wp-block-heading jinr-heading d--bold">Retriever を使用した RAG の実装</h4>



<p class="wp-block-paragraph">Retriever を使用して RAG を実装する方法を以下に示します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import configparser

from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains.retrieval import create_retrieval_chain
from langchain_chroma import Chroma
from langchain_core.prompts import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    SystemMessagePromptTemplate,
)
from langchain_openai import ChatOpenAI
from langchain_openai.embeddings import OpenAIEmbeddings

# コンフィグファイルからOpenAI用のキーを取得する
config = configparser.ConfigParser()
config.read("config.ini")

# llmの設定
llm = ChatOpenAI(openai_api_key=config["OPENAI"]["key"])

# Chromaを読み込む
db = Chroma(
    persist_directory="./chroma_db",
    collection_name="AIUEO_Company",
    embedding_function=OpenAIEmbeddings(openai_api_key=config["OPENAI"]["key"]),
)

# Retrieverの設定
retriever = db.as_retriever()

# プロンプトテンプレートを作成する（システムプロンプトにRetrieverを質疑応答に組み込む）
prompt_template = ChatPromptTemplate.from_messages(
    [
        SystemMessagePromptTemplate.from_template(
            "あなたは質疑応答タスクのアシスタントです。"
            "以下のコンテキストを使用して質問に答えてください。"
            "\n\n"
            "{context}"
        ),
        HumanMessagePromptTemplate.from_template("{input}"),
    ]
)

# Chain作成
question_answer_chain = create_stuff_documents_chain(llm=llm, prompt=prompt_template)
rag_chain = create_retrieval_chain(
    retriever=retriever, combine_docs_chain=question_answer_chain
)

# 問い合わせの実行
result = rag_chain.invoke(
    {"input": "あいうえおカンパニーの社長の名前を教えてください。"}
)
print(result)
print(result["answer"])

print("=====")
result = rag_chain.invoke(
    {"input": "山田太郎氏の経歴と専門分野、座右の銘を教えてください。"}
)
print(result)
print(result["answer"])

print("=====")
result = rag_chain.invoke({"input": "山田太郎氏の趣味について教えてください。"})
print(result)
print(result["answer"])
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
あいうえおカンパニーの社長の名前は山田太郎（Yamada Taro）です。
====================
山田太郎氏は、東京都渋谷区出身で、2000年に東京大学経済学部を卒業後、大手商社に入社し営業部に配属されました。その後、2005年にハーバードビジネススクールでMBAを取得しました。

山田太郎氏の専門分野はM&amp;A（合併・買収）であり、その分野での豊富な経験を持っています。

また、山田太郎氏の座右の銘は「挑戦なくして成長なし」という言葉です。この言葉からも、彼の革新的なリーダーシップや成長志向がうかがえます。
====================
山田太郎氏の趣味は、読書（ビジネス書、歴史書）、ゴルフ、旅行（特にヨーロッパと東南アジア）です。</pre>



<p class="wp-block-paragraph">上記実行結果を確認してみると、外部ドキュメントとして渡した情報をもとに LLM が回答を生成できていることが分かります。</p>



<p class="wp-block-paragraph">RAG のための Chainは、<code>create_retrieval_chain</code> で Retriever と LLM を接続し、質問に対する回答を行っています。なお、Retriever は上記で作成した Chromaの <code>as_retriever</code> メソッドを使用して取得しています。</p>



<p class="wp-block-paragraph">PromptTemplate の SystemMessage として、以下のように Retriever の文脈 <code>{context}</code> を参照するように指定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># プロンプトテンプレートを作成する（システムプロンプトにRetrieverを質疑応答に組み込む）
prompt_template = ChatPromptTemplate.from_messages(
    [
        SystemMessagePromptTemplate.from_template(
            "あなたは質疑応答タスクのアシスタントです。"
            "以下のコンテキストを使用して質問に答えてください。"
            "\n\n"
            "{context}"
        ),
        HumanMessagePromptTemplate.from_template("{input}"),
    ]
)</pre>



<p class="wp-block-paragraph"><code>create_retrieval_chain</code> の内部では、Retriever を使って質問に関連する情報をVector Store から検索し、<code>{context}</code> 部分に埋め込んで LLM へ渡されます。これにより、外部ドキュメントに関連する回答が得られるわけです。</p>



<p class="wp-block-paragraph">実際の実行時には、<code>invoke</code> メソッドで <code>{input}</code> に設定する質問を渡し、結果は <code>result["answer"]</code> で取得します。</p>



<p class="wp-block-paragraph">以上が、LangChain を用いた RAG 実装の基本的な流れです。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph"><span class="marker"><strong>LangChain を 用いたRAG（Retrieval-Augmented Generation）でLLM と外部データを連携する方法</strong></span>を解説しました。</p>



<p class="wp-block-paragraph">RAG は、外部データから必要な情報を検索し、それを質問に組み込むことで回答の精度を向上させる技術です。これにより、一般の LLM で対応できない特定の情報に関する AI を実装できます。</p>



<p class="wp-block-paragraph">RAG を実現するには、外部データから Vector Store を作成し、Retriever で質問に関連する情報を検索して LLM と連携します。この記事では、その一連の手順を追って説明しました。</p>



<p class="wp-block-paragraph">企業や個人のデータを LLM と連携させ、固有の回答を生成できる RAGは、今後様々な場面で重要となる技術です。生成 AI の技術は急速に進化していますので RAG の基礎を理解しておいてもらいたいと思います。</p>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>

]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-langchain-rag-basics/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-06-16 19:16:44 by W3 Total Cache
-->