LLMアプリケーション開発のためのLangChain 後編⑤ 外部ドキュメントのロード、分割及び保存

LangChainは、大規模な言語モデルを使用したアプリケーションの作成を簡素化するためのフレームワークです。言語モデル統合フレームワークとして、LangChainの使用ケースは、文書の分析や要約、チャットボット、コード分析を含む、言語モデルの一般的な用途と大いに重なっています。

LangChainは、PythonとJavaScriptの2つのプログラミング言語に対応しています。LangChainを使って作られているアプリケーションには、AutoGPT、LaMDA、CodeAnalyzerなどがあります。
- AutoGPTは、文章生成、翻訳、コード生成などの機能を持つアプリケーションです。
- LaMDAは、対話や文章生成を行うチャットボットです。
- CodeAnalyzerは、コードを分析するアプリケーションです。

# 記事概要

LangChainは、Retrieval Augmented Generation (RAG) に必要な機能を提供します。RAGは、外部データが取得され、生成ステップを行う際にLLMに渡されます。
LangChainの機能には、100以上のドキュメントローダ、ドキュメント変換、テキスト埋め込みモデル、50以上のベクトルストア、そしてさまざまなリトリーバルアルゴリズムが含まれます。これにより、ユーザーは効率的にデータを取得、変換、保存、検索することができます。

https://python.langchain.com/docs/modules/data_connection/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/efd098a6-fbb5-fb13-f48c-c7ced5395d83.png)

以下の記事では、簡単な外部データを取り込んで、質問をしたことがあります。

https://qiita.com/utanesuke/items/1f75fa954e7bf06911fc#%E4%BA%8B%E4%BE%8B--%E8%B3%AA%E5%95%8F%E3%81%AE%E5%9B%9E%E7%AD%94question-answering

# Document loaders

ドキュメントローダーは、テキストと関連メタデータからなるDocumentとしてデータをソースから読み込むためのツールです。
例として、.txtファイルやWebページの内容、YouTubeのビデオのトランスクリプトを読み込むローダーがあります。これらのローダーは、データをドキュメントとして読み込む"load"メソッドと、遅延ロードのための"lazy load"メソッドをオプションで提供します。

## テキストローダー

```python 
from langchain.document_loaders import TextLoader

loader = TextLoader("documentstore/index.md")
data = loader.load()
print(data)
```

出力結果：

```python 
[Document(page_content='# はじめに\n\n# 最後に', metadata={'source': 'documentstore/index.md'})]

```

## CSVローダー

```python 
from langchain.document_loaders.csv_loader import CSVLoader

loader = CSVLoader(file_path='documentstore/index.csv')
data = loader.load()
print(data)
```

出力結果：

```python 
[Document(page_content='title: red\ncontext: is a color', metadata={'source': 'documentstore/index.csv', 'row': 0}), Document(page_content='title: watermelon\ncontext: is a fruit', metadata={'source': 'documentstore/index.csv', 'row': 1}), Document(page_content='title: bike\ncontext: is a vehicle', metadata={'source': 'documentstore/index.csv', 'row': 2})]
```

カスタマイズしたCSVローダー：

```python 
# カスタマイズしたCSVローダー
loader = CSVLoader(file_path='documentstore/index.csv', csv_args={
    'delimiter': ',',
    'quotechar': '"',
    'fieldnames': ['title','context']
})

data = loader.load()
print(data)
```

```python 
loader = CSVLoader(file_path='documentstore/index.csv', source_column="context")

data = loader.load()
print(data)
```


## フォルダからファイルをロードする

構造化ではないデータをロードする際に、unstructuredライブラリをインストールします。

```python 
! pip install unstructured
```

```python 
# フォルダからファイルをロードする
from langchain.document_loaders import DirectoryLoader
# globパラメータでどんなファイルをロードするのかを指定する。
loader = DirectoryLoader('documentstore', glob='**/*.md')
docs = loader.load()
print(docs)
```

出力結果：

```python 
[Document(page_content='はじめに\n\n最後に', metadata={'source': 'documentstore\\index.md'})]

```

```python 
#進捗バーの表示
from langchain.document_loaders import DirectoryLoader
loader = DirectoryLoader('documentstore', glob="**/*.md", show_progress=True)
docs = loader.load()
```
出力結果：
```python 
100%|██████████| 1/1 [00:00<?, ?it/s]
```

またマルチスレッドを利用します：

```python 
#マルチスレッド利用
loader = DirectoryLoader('documentstore', glob="**/*.md", use_multithreading=True)
docs = loader.load()
len(docs)
```


## HTMLをロードする


```python 
#html
from langchain.document_loaders import UnstructuredHTMLLoader
loader = UnstructuredHTMLLoader("documentstore/fake-content.html")
data = loader.load()
data
```

出力結果：

```python 
[Document(page_content='html\n\ntest', metadata={'source': 'documentstore/fake-content.html'})]
```

beautifulsoupのライブラリを利用して、HTMLをロードする

```python 
# BeautifulSoup4を利用してHTMLファイルをロード
from langchain.document_loaders import BSHTMLLoader
loader = BSHTMLLoader("documentstore/fake-content.html")
data = loader.load()
data
```

出力結果：

```python 
[Document(page_content='\n\nhtml\ntest\n\n', metadata={'source': 'documentstore/fake-content.html', 'title': ''})]
```

## Json ローダー

```python 
from langchain.document_loaders import JSONLoader
import json
from pathlib import Path
from pprint import pprint


file_path='./documentstore/examples.json'
data = json.loads(Path(file_path).read_text())
pprint(data)
```

出力結果：

```json 
{'image': {'creation_timestamp': 1675549016, 'uri': 'image_of_the_chat.jpg'},
 'is_still_participant': True,
 'joinable_mode': {'link': '', 'mode': 1},
 'magic_words': [],
 'messages': [{'content': 'Bye!',
               'sender_name': 'User 2',
               'timestamp_ms': 1675597571851},
              {'content': 'Hi! Im interested in your bag. Im offering $50. Let '
                          'me know if you are interested. Thanks!',
               'sender_name': 'User 1',
               'timestamp_ms': 1675549022673}],
 'participants': [{'name': 'User 1'}, {'name': 'User 2'}],
 'thread_path': 'inbox/User 1 and User 2 chat',
 'title': 'User 1 and User 2 chat'}

```

# Document transformers

ドキュメントを読み込んだ後、多くの場合、アプリケーションにより適した形に変換したくなります。最もシンプルな例として、長いドキュメントをモデルのコンテキストウィンドウに収まるように小さなチャンクに分割したい場合があります。
LangChainには、ドキュメントを分割、結合、フィルタリング、その他の操作を簡単に行うための組み込みドキュメントトランスフォーマーが多数含まれています。

```python 
# This is a long document we can split up.
with open('documentstore/state_of_the_union.txt') as f:
    state_of_the_union = f.read()

from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
    # Set a really small chunk size, just to show.
    chunk_size = 50,
    chunk_overlap  = 20,
    length_function = len,
    add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
```

出力結果は以下の通りで、二つファイルに分割されました。

```python 
page_content='議長殿、副大統領殿、我々のファーストレディおよびセカンドジェントルマン。議会の議員の皆様、内閣の皆様' metadata={'start_index': 0}
page_content='ントルマン。議会の議員の皆様、内閣の皆様。最高裁判所の裁判官の皆様。私の同胞のアメリカの市民の皆様。' metadata={'start_index': 30}
```

```python 
# 以下は、メタデータをドキュメントと一緒に渡す例です。メタデータはドキュメントとともに分割されることに注意してください。
metadatas = [{"document": 1}, {"document": 2}]
documents = text_splitter.create_documents([state_of_the_union, state_of_the_union], metadatas=metadatas)
print(documents[0])
```

また、そのまま分割して利用も可能です：
```python 
text_splitter.split_text(state_of_the_union)[0]
```

出力結果：
```python 
'議長殿、副大統領殿、我々のファーストレディおよびセカンドジェントルマン。議会の議員の皆様、内閣の皆様'
```

## ソースコードの分割

CodeTextSplitterは、多くの言語のサポートを使用してコードを分割することができます。Languageという列挙型をインポートし、言語を指定します。
```python 
from langchain.text_splitter import (
    RecursiveCharacterTextSplitter,
    Language,
)
# Full list of support languages
[e.value for e in Language]
```
出力結果：
```python 
['cpp',
 'go',
 'java',
 'js',
 'php',
 'proto',
 'python',
 'rst',
 'ruby',
 'rust',
 'scala',
 'swift',
 'markdown',
 'latex',
 'html',
 'sol']
```

これがPythonの例です。
```python 
PYTHON_CODE = """
def hello_world():
    print("Hello, World!")

# Call the function
hello_world()
"""
python_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.PYTHON, chunk_size=50, chunk_overlap=0
)
python_docs = python_splitter.create_documents([PYTHON_CODE])
python_docs
```

出力結果：

```python 

```

```python 

```

出力結果、きれいに二つの関数で分けました：
```python 
[Document(page_content='def hello_world():\n    print("Hello, World!")', metadata={}),
 Document(page_content='# Call the function\nhello_world()', metadata={})]
```

# Text embedding models

Embeddingsクラスは、テキスト埋め込みモデルとのインターフェースを提供するために設計されたクラスです。このクラスは、OpenAIやCohere、Hugging Faceなどの多くの埋め込みモデル提供者のための標準的なインターフェースを持っています。埋め込みはテキストのベクトル表現を作成し、ベクトル空間でのセマンティック検索などが可能になります。LangChainのEmbeddingsクラスは、ドキュメントとクエリの2つの埋め込みメソッドを提供しています。

LangChain内の基本的な埋め込みクラスは、`ドキュメントの埋め込み`と`クエリの埋め込み`のための2つの方法を公開しています。
- 前者は複数のテキストを入力として受け取り、
- 後者は1つのテキストを取ります。

これらを2つの独立した方法として持つ理由は、一部の埋め込みプロバイダがドキュメント(検索の対象)とクエリ(検索クエリ自体)に異なる埋め込み方法を持っているためです。

```python 
from langchain.embeddings import OpenAIEmbeddings

embeddings_model = OpenAIEmbeddings()

embeddings = embeddings_model.embed_documents(
    [
        "こんにちは！",
        "あ、こんにちは！",
        "あなたの名前は？",
        "友達は私をワールドと呼ぶよ",
        "ハローワールド！"
    ]
)
len(embeddings), len(embeddings[0])
```

出力結果：`(5, 1536)`

```python 
embedded_query = embeddings_model.embed_query("この会話でどんな名前が出たんですか?")
embedded_query[:5]
```
出力結果：
```python 
[0.004684235415566698,
 -0.011953965968252465,
 0.03395912747245221,
 -0.005110937191922045,
 -0.00250015524750933]
```

embedingは、再計算の必要を避けるために保存または一時的にキャッシュすることができます。

```python 
# embedingは、再計算の必要を避けるために保存または一時的にキャッシュすることができます。
from langchain.storage import InMemoryStore, LocalFileStore
from langchain.embeddings import OpenAIEmbeddings, CacheBackedEmbeddings
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
underlying_embeddings = OpenAIEmbeddings()
fs = LocalFileStore("./cache/")

cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    underlying_embeddings, fs, namespace=underlying_embeddings.model
)
```

```python 
#embeding前に、キャッシュが空のものです
list(fs.yield_keys())
```


```python 
#ドキュメントを読み込み、それをブロックに分割し、各ブロックを埋め込み、それをベクトルストアにロードします。
raw_documents = TextLoader("documentstore/state_of_the_union.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
#ベクトルストアを作成する
db = FAISS.from_documents(documents, cached_embedder)
```

ドキュメントを読み込み、それをブロックに分割し、各ブロックを埋め込み、それをベクトルストアにロードします。
```python 
#ドキュメントを読み込み、それをブロックに分割し、各ブロックを埋め込み、それをベクトルストアにロードします。
raw_documents = TextLoader("documentstore/state_of_the_union.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
#ベクトルストアを作成する
db = FAISS.from_documents(documents, cached_embedder)
```

:::note info

上記エラーが発生する場合は、以下の２行を実行してください
```
pip install faiss-gpu
pip install faiss-cpu
```
:::

もし再度vectostoreを作成しようとすると、どの埋め込みも再計算する必要がないため、それははるかに高速になります。
```python 
#もし再度vectostoreを作成しようとすると、どの埋め込みも再計算する必要がないため、それははるかに高速になります。
db2 = FAISS.from_documents(documents, cached_embedder)
```

キャッシュでデータがありました
```python 
#キャッシュでデータがありました
list(fs.yield_keys())[:5]
```

出力結果：

```python 
['text-embedding-ada-002948b99a3-567e-5f0f-9ccb-d68ed5b060d9',
 'text-embedding-ada-002e13dcedd-f02c-561d-b71a-98ead1a644cd']
```

## メモリにキャッシュ

```python 
#メモリでキャッシュ
store = InMemoryStore()
underlying_embeddings = OpenAIEmbeddings()
embedder = CacheBackedEmbeddings.from_bytes_store(
    underlying_embeddings, store, namespace=underlying_embeddings.model
)
embeddings = embedder.embed_documents(["hello", "goodbye"])
```

```python 
#埋め込みを2回目に試みると、時間はたったの2ミリ秒しかかかりません。なぜなら、埋め込みはキャッシュから検索されるからです。
embeddings_from_cache = embedder.embed_documents(["hello", "goodbye"])
```

以下のソースコードの実行結果がtrueです。
```python 
embeddings == embeddings_from_cache
```

# Vector stores


非構造化データを検索する一般的な方法は、データをベクトル化して保存し、クエリ時に類似するベクトルを検索することです。ベクトルストアは、このベクトルデータの保存と検索をサポートします。

ベクトルストアを使う際、埋め込みを通じてベクトルを作成することが大切です。その前に、テキスト埋め込みモデルに慣れることがおすすめです。多くの無料・オープンソースのベクトルストアオプションがあり、ローカルマシンで動作します。
例えば、chrome，faiss，lanceなどがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/e1ca11f0-4800-fd9d-d8a4-5672556cd0ec.png)

## chromedb

以前の記事ではchromedbを使っていました。

https://qiita.com/utanesuke/items/1f75fa954e7bf06911fc#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973%E4%BF%9D%E5%AD%98


まずインストール：
```python 
! pip install chromadb
```


```python 
# DB構築
text = """顧客：こんにちは。\nカスタマーサービス：こんにちは、日本銀行1917でお手伝いさせていただきます。\n顧客：こんにちは、私はあなたの銀行でクレジットカードを持っていますが、前回の協議処理について返事がないので、その進行状況を確認したいです。\nカスタマーサービス：クレジットカードの問題についてですか？それでしたら、クレジットカード担当者にお繋ぎしますが、よろしいでしょうか？\n顧客：はい、お願いします。\nカスタマーサービス：承知しました、少々お待ちください。\n顧客：了解です。\nカスタマーサービス：もし接続が切れた場合は、再度お電話いただき、3番のキーを選択してください。今、お繋ぎしますので、お待ちください。\n顧客：了解です、ありがとうございます。\nカスタマーサービス：どういたしまして、何かお手伝いできることはありますか？\n顧客：先日、お問い合わせをしましたが、クレジットカードの状況について確認したいです。\nカスタマーサービス：以前にクレジットカードの問題をお問い合わせいただきましたか？\n顧客：はい、それです。\nカスタマーサービス：カード番号か身分証明書の番号を教えていただけますか？\n顧客：941951。\nカスタマーサービス：了解です。\n顧客：1115。\nカスタマーサービス：はい。\n顧客：1110。\nカスタマーサービス：はい。\n顧客：2217。\nカスタマーサービス：確認いたしますので、少々お待ちください。\n顧客：了解です。\nカスタマーサービス：申し訳ございませんが、記録を見つけることができませんでした。もう一度、身分証明書の番号を確認させてください。\n顧客：941951。\nカスタマーサービス：了解しました。\nカスタマーサービス：これは返済の協議に関する問題ですか？\n顧客：はい、そうです。\nカスタマーサービス：現在の状況を確認させていただきます。\nカスタマーサービス：4月6日に連絡が取れたとの記録がありますが、その後の反応はいかがでしたか？\n顧客：その後、彼らは2年間の記録を取得する方法について教えてくれましたが、私の過去5年間の記録が長すぎたため、彼らは私に返事をしてくれると言っていましたが、まだ返事がありません。\nカスタマーサービス：了解しました、早急に対応いたしますので、少々お待ちください。\n顧客：了解です、お手数をおかけしますが、よろしくお願いします。\nカスタマーサービス：承知しました、ご安心ください。"""
list_text = text.split('\n')

list_text
```

出力結果：

```python 
['顧客：こんにちは。',
 'カスタマーサービス：こんにちは、日本銀行1917でお手伝いさせていただきます。',
 '顧客：こんにちは、私はあなたの銀行でクレジットカードを持っていますが、前回の協議処理について返事がないので、その進行状況を確認したいです。',
 'カスタマーサービス：クレジットカードの問題についてですか？それでしたら、クレジットカード担当者にお繋ぎしますが、よろしいでしょうか？',
 '顧客：はい、お願いします。',
 'カスタマーサービス：承知しました、少々お待ちください。',
 '顧客：了解です。',
 'カスタマーサービス：もし接続が切れた場合は、再度お電話いただき、3番のキーを選択してください。今、お繋ぎしますので、お待ちください。',
 '顧客：了解です、ありがとうございます。',
 'カスタマーサービス：どういたしまして、何かお手伝いできることはありますか？',
 '顧客：先日、お問い合わせをしましたが、クレジットカードの状況について確認したいです。',
 'カスタマーサービス：以前にクレジットカードの問題をお問い合わせいただきましたか？',
 '顧客：はい、それです。',
 'カスタマーサービス：カード番号か身分証明書の番号を教えていただけますか？',
 '顧客：941951。',
 'カスタマーサービス：了解です。',
 '顧客：1115。',
 'カスタマーサービス：はい。',
 '顧客：1110。',
 'カスタマーサービス：はい。',
 '顧客：2217。',
 'カスタマーサービス：確認いたしますので、少々お待ちください。',
 '顧客：了解です。',
 'カスタマーサービス：申し訳ございませんが、記録を見つけることができませんでした。もう一度、身分証明書の番号を確認させてください。',
 '顧客：941951。',
 'カスタマーサービス：了解しました。',
 'カスタマーサービス：これは返済の協議に関する問題ですか？',
 '顧客：はい、そうです。',
 'カスタマーサービス：現在の状況を確認させていただきます。',
 'カスタマーサービス：4月6日に連絡が取れたとの記録がありますが、その後の反応はいかがでしたか？',
 '顧客：その後、彼らは2年間の記録を取得する方法について教えてくれましたが、私の過去5年間の記録が長すぎたため、彼らは私に返事をしてくれると言っていましたが、まだ返事がありません。',
 'カスタマーサービス：了解しました、早急に対応いたしますので、少々お待ちください。',
 '顧客：了解です、お手数をおかけしますが、よろしくお願いします。',
 'カスタマーサービス：承知しました、ご安心ください。']
```

ベクトル化をします：
```python 
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# ベクトルDB chromaで、openaiのembaddingを利用してテキストに対してベクトル化
db = Chroma.from_texts(list_text, OpenAIEmbeddings())
```

- 類似度検索：
```python 
# 類似度検索
query = "顧客の身分証明書番号を教えてください。"
docs = db.similarity_search(query)
print(docs[0].page_content)
```

出力結果：`カスタマーサービス：カード番号か身分証明書の番号を教えていただけますか？`

- ベクトルで類似度検索
```python 
# ベクトルで類似度検索
embedding_vector = OpenAIEmbeddings().embed_query(query)
print(f'embedding_vector：{embedding_vector}')
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)
```

出力結果：

```python 
embedding_vector：[-0.012953334155160983, -0.008411926001247204, 0.0029303048915778214, -0.04296275117876542, -0.00526390490567279, 0.024384265139035965, -0.018294648728601755, -0.010869704838960539, -0.023829489334107577, 0.002193293710696996, 0.022074855296872534, -0.006818563036518001, -0.00741204227834655, -0.014398327658679004, -0.021971640543870123, -0.008366769896054605, 0.00793456265805445, -0.0263195235970414, 0.04107909916593863, -0.027274252146072004, 0.0012603375038410265, 0.009495671594546994, -0.025287385380242815, -0.014449934103857658, -0.015727204797899953, 0.004522055271310509, 0.003360900010242737, -0.007457198383539148, 0.014037078817138223, -0.02348114303518401, 0.02657755768557977, -0.0022819931032550395, -0.006754054048722133, -0.013895160161574374, -0.012927530932571657, -0.009469867440635117, -0.0027206516125638006, -0.005867060588802975, 0.01798500819488473, 0.006312169903759068, 0.034189577267299986, -0.010534260151331637, 0.0148240845566931, 0.0049381361936842475, 0.00041527433883718393, 0.022023248851693877, -0.02364886677598229, 0.022629629239155815, -0.027558089457199703, 0.03826652368931568, 0.004573662182150439, -0.017030279645854123, -0.014630558524628048, -0.04234347011133137, 0.010392341495767787, -0.023855294419342008, 0.003973732134674557, 0.005705789050635855, -0.021984543086487337, -0.0388600033968055, 0.006637938615747611, -0.000759589175269465, -0.022332889385410903, -0.0011724444037812401, -0.016501308926160165, -0.0018820394278302682, -0.019339689488017554, 0.022190970729847055, -0.02332632369964805, 0.004957488610626243, 0.009695647966598104, 0.02047504059517345, 0.014424130881268331, -0.016527112148749495, 0.03984053330578033, -0.01484988777928243, -0.010321382167985864, -0.019455804920992078, 0.004383361785739688, 0.02026861295181373, -0.0030835128062704576, -0.026409835807426594, 0.007844250447669256, -0.016127159404647273, 0.027171037393069596, 0.026551754462990445, -0.024926136538702032, 0.0031318943142867213, -0.007263672351474094, -0.012901726778659778, 0.012514675645852222, 0.0058573841475013395, -0.014527344702948189, 0.002120721332257282, -0.005528390265519769, -0.009347301667674538, 0.007721683743386127, 0.01737862594477769, 0.0014885367908834667, -0.03695054629874429, -0.0008894128030752048, 0.007431394695288546, -0.014553147925537517, 0.0033028420609248384, -0.022526416348798508, -0.022074855296872534, -0.005331638597800411, -0.009895624338649215, 0.011495439040348299, -0.030886734973544508, -0.012243739014696636, 0.04133713511712211, 0.008702214583683508, -0.03584099841417772, -0.025584125233987728, 0.01575300802048928, 0.012966235766455647, -0.021894230876102143, -0.007366886173153953, -0.009173127586890205, 0.015172430855616668, 0.007695880055135524, 0.03661510254243794, -0.013972570760664906, 0.014308015448293809, 0.00735398456185929, -0.0074959036830844145, -0.017172198301417974, 0.011301913008283244, 0.00956017965102031, 0.030267452043465357, -0.003360900010242737, 0.000654359505928645, 0.01207601620522091, -0.009308595902467997, 0.012708201677917275, -0.0036963449307022777, 0.00489298008849165, -0.02437136259641875, -0.020023481405892576, 0.014385426047384341, 0.013050096705532234, 0.0008410313532666008, 0.0006088002544869189, 0.020320221259637488, 0.00042777289119420804, 0.0040253390455144865, 0.006221858159035148, 0.003151246964059354, -0.012263091897299907, 0.004205963000623602, 0.014153195181435296, 0.0367699218779739, 0.003060934753674159, 0.004141454478489009, 0.010069798419433548, 0.024422969041597405, 0.010102051982008932, -0.01366292929562533, -0.021223341500844338, -0.009753705683085366, 0.018449469926782817, 0.026190505621449665, -0.021429769144204053, 0.007328180873608687, 0.03772465042700451, -0.0335444911146315, -0.0021820046843988466, 0.018152730073037904, 0.009295694291173334, -0.009018307320031692, 0.025274482837625598, -0.0006757279451545799, -0.001715929669012331, 0.010753589405986018, 0.02250061312620918, 0.009405359384161798, -0.013675830906919994, 0.0017191551882513156, -0.029286920271845422, -0.03297681649237611, 0.005999303268726464, 0.01456605046815473, 0.016398096035802858, 0.0004406746189041904, 0.027661302347557013, 0.024410068361625292, 0.00261098698523661, 0.006034782932617427, -0.021907133418719357, 0.025713143209579462, 0.02559702591395984, 0.01798500819488473, -0.0024722934996657896, -0.6196957667394202, -0.030809325305776528, 0.016011043971672752, -0.002135235761379097, 0.026087292731092355, 0.004686552445131932, 0.014682165901129253, 0.03470564544437672, -0.027532286234610376, 0.009205382080788138, -0.00024855983154172407, 0.005605800398949025, -0.037440813115876805, -0.0008507076199452578, 0.010256873180189995, -0.027738713877970094, -0.0006386355216441253, -0.0001887885543207737, 0.0069991869916271165, 0.008095834196221572, -0.014011275594548896, 0.010114954524626145, -0.0028093510051218442, 0.033905739956172284, 0.015946534983876885, 0.007824897565065986, -0.00751525610002641, -0.01510792279914335, -0.007250770740179431, 0.005280031686960482, -0.0071088516189543064, -0.010766491017280682, 0.010211717074997398, -0.017081886091032776, 0.0427563253980508, -0.004593015064753709, -0.0073217300679613555, 0.03597001638976946, -0.026474344795222465, 0.03160923265662607, -0.03235753169965185, -0.02216516750725773, 0.02949334791520514, -0.029106295851075034, 0.02386819509931412, -0.0001822369039035004, 0.014295113836999145, -0.023984310532288642, -0.0005902540136278619, 0.03991794483619341, -0.01856558535975734, -0.015056315422642146, -0.013366189441880418, 0.0015820742876770089, 0.009102168259108279, 0.008353868284759942, 0.011585751250733493, -0.029261117049256095, -0.003252847967912061, -0.025468009801013203, -0.01173412117760595, 0.02043633669261201, 0.0070185394085691116, -0.013933864995458364, -0.0004890560978166241, 0.003525396951233523, -0.03039647001905709, -0.001115193096207555, 0.02573894643216879, 0.0020078313021064257, -0.003201241057072132, 0.01040524310706245, 0.0097859601769833, 0.0015344991885743212, 0.015740107340517166, 0.03338967177909554, 0.019958972418096705, -0.015301448831208405, -0.014398327658679004, 0.016991573880647582, -0.0006527467463091526, 0.001115193096207555, -0.004963939416273574, -0.0009474705777701253, -0.02393270408710999, -0.013727437352098647, -0.042782126757995025, -0.021855525110895602, 0.00048542749053617025, 0.004396263397034352, 0.012069565865234853, -0.018630094347553208, 0.02879665531735801, -0.009798861788277963, -0.002152975826155216, 0.02797094474391914, -0.01299849026035358, -0.036408673036433116, -0.007244319934532099, -0.008792526794068703, -0.021726508997948965, -0.004522055271310509, 0.01247596988064568, 0.007347533756211958, 0.020874995201920772, -0.013959669149370243, -0.018488175691989357, -0.012572733362339482, 0.02563573167916638, -0.02152008135458925, 0.013856455327690384, 0.006908874781241922, -0.0022707040769568898, -0.008211949629196092, -0.0007652336884185398, -0.02524867961503627, 0.025068055194265883, 0.04629139855775532, 0.008134539030105562, 0.0017014152398905156, 0.023752079666339597, 0.014372524436089676, 0.025029351291704444, -0.003364125413066403, 0.015249841454707199, 0.012992038989044974, 0.0032044664598957977, 0.0019288082344346988, 0.013224270786316569, 0.008424827612541867, -0.014449934103857658, -0.037595632451412765, 0.031247983815085287, -0.020062185308454016, -0.005038124379709802, -0.016488408246188056, 0.02210065851946186, -0.005831580924912013, 0.03093834141872316, 0.009340850396365931, -0.020604058570765187, -0.01661742435913469, -0.008966700874853037, -0.008966700874853037, 0.0022255479717642923, -0.019404198475813424, 0.004896205258484678, 0.0156755983527213, 0.00038160889127495946, 0.027867729990916728, 0.01677224555731575, 0.0025932471532911293, -0.004625269092990368, 0.01205666425394019, 0.005131662225749301, -0.007360435367506622, 0.006625037004452948, -0.01773987478631847, 0.0006204924270341968, 0.0008926382641065301, -0.003757628050013205, 0.022681235684334472, -0.02246190736100264, 0.011869589493183742, -0.01384355371639572, -0.01227599350859457, 0.027635499124967686, -0.00041245208226264657, -0.0221393642846684, -0.035711980438585984, -0.021403965921614726, -0.011992155266144321, -0.007799093876815383, -0.010747139065999962, 0.005625153281552295, -0.00440916547399029, -0.006657291032689606, 0.013624223530418788, -0.005260679270018487, -0.021300751168612318, -0.005612251204596357, 0.002041698381000874, 0.004073720320700113, -0.005702563414981552, 0.029519151137794467, 0.016088453639440732, -0.003976957304667585, 0.022797351117308993, -0.016707736569519883, 0.02957075944561822, -0.006415383725438927, 0.02866763734176627, -0.005447754496436209, 0.030422273241646418, 0.026371130042220053, 0.02495193976129136, 0.027171037393069596, 0.0018030163601585414, -0.004705904862073927, 0.023777882888928924, 0.035376536682279636, 0.01510792279914335, 0.0072765739627687585, -0.009115069870402942, 0.015327252053797731, -0.014372524436089676, -0.008218399969182149, -0.018694603335349076, 0.04538827645390337, 0.03457662746878499, -0.011127739858821461, -0.029725578781154186, -0.008050678091028973, -0.029751383866388613, -0.011179346304000115, 0.007566863010866339, -0.0105471617626263, 0.016436799938364298, 0.009031208931326355, 0.008276457685669411, 0.019159065067247166, 0.014759575568897234, 0.04118231205629594, -0.03403475793176402, 0.005138113031396632, -0.014269310614409818, 0.0018546232709984707, 0.022371595150617447, 0.009211833352096745, -0.006425060166740562, -0.021816821208334163, -0.03158342757139164, 0.01416609679272996, 0.021029814537456733, 0.015778813105723707, -0.00956663092232892, 0.018049517182680597, -0.04525925847831163, 0.030577092577182382, 0.007824897565065986, 0.008392573118643932, 0.005080055314909372, 0.003880194521465696, -0.01838496093898695, 0.0027238772482181045, -0.003922125223834628, 0.01766246511855049, 0.014308015448293809, -0.006708897943529536, 0.027171037393069596, -0.00697338376903779, 0.005147789007036992, 0.0039350268351292916, -0.0028190274464234793, 0.008205498357887486, -0.012714652017903331, 0.0015111148434797655, 0.01470796912371858, 0.018797816225706383, 0.05088441315684775, 0.030448076464235745, 0.04719451693631707, 0.006747603243074801, -0.024293952928650768, 0.009082816307827559, -0.009553729311034254, 0.005505812212923469, -0.01571430411792784, 0.008540943045516388, -0.014308015448293809, -0.0018788140250066024, 0.004312402457957764, 0.0009894012219313975, 0.006857267870401992, -0.00773458535468079, -0.0012369530423311519, 0.011463184546450364, -0.002057825395119203, 0.016462603160953625, 0.007682978443840861, -0.01420480162661395, -0.024422969041597405, 0.012282443848580626, 0.026990412972299205, 0.015146627633027342, -0.011959900772246387, -0.014256409003115155, -0.004805893513760758, -0.01882361944829571, 0.01038589022445918, -0.004951037804978911, 0.01141157810127171, 0.010295578014073985, -0.0036511888255096802, 0.007979717831924499, -0.015998141429055538, 0.028822458539947336, -0.009715000849201376, -0.032718780541192635, 0.015314350442503068, 0.010656826855614766, -0.018320451951191082, -0.0037802061026095037, -0.023506946257773338, 0.027351661813839988, -0.007476550800481143, -0.010979369931949005, -0.009373104890263865, 0.0029690099582924496, -0.010831000005076549, 0.018359157716397623, -0.002294894714549703, -0.02526158215765349, -0.01579171378569582, 0.01990736597291805, 0.013075900859444113, -0.00392857602948196, -0.013153310527212093, 0.017494741377752213, -0.009650491861405507, -0.010753589405986018, 0.0016409384130778458, -0.019300983722811013, 0.00484137317765172, 0.03047387968682507, 0.015198235009528546, 0.010953566709359678, -0.0066024589518566485, -0.016565817913956036, -0.0012321149380956529, -0.02577765033473023, -0.018397863481604163, -0.003233495318139428, -0.019842856985122184, -0.005383245508640341, -0.003735049997416906, 0.03519591226150924, -0.005070378873607736, 0.009534376428430984, 0.017468938155162886, 0.008179695135298159, 0.0213781626990254, 0.01546917070936158, -0.024410068361625292, -0.018320451951191082, 0.0008019229656798659, -0.005921892669635932, 0.01590782921867034, -0.008547394316824997, 0.011405126829963103, 0.020526648902997203, 0.03346707958421842, 0.02180391866571695, -0.021494278131999923, 0.009553729311034254, -0.0051123093431460305, -0.025842159322526096, 0.020616959250737296, 0.00735398456185929, 0.03911803562269877, -0.004967165051927878, 0.04004696281178515, -0.012359854447671159, 0.026100193411064468, 0.01979124867729843, 0.02833219358545992, -0.004005986162911216, 0.005834806094905041, 0.013185565021110027, -0.009527925157122377, -0.0006261369401832715, 0.015985240749083425, -0.0036834430865769767, -0.0075604122052190074, 0.014346720282177799, -0.0008249041645252931, -0.04045981809850458, -0.010643925244320103, 0.0070185394085691116, 0.022836056882515533, -0.024397165819008075, -0.006508921571478425, -0.006508921571478425, 0.007444296772244485, -0.023893998321903448, -0.01040524310706245, 0.005421950808185606, -0.01892683420129812, -0.028977279738128397, -0.037260188695106417, -0.010121404864612202, -0.02155878525715069, -0.03209949574846838, -0.007076597590717648, 0.0296481691133862, -0.03148021468103433, -0.011127739858821461, -0.002788385770352697, 0.008644156867196247, 0.011295461736974637, 0.028461209698406553, -0.01892683420129812, -0.010031092654227008, 0.01543046587547759, -0.0068250138421653336, -0.02199744562910455, 0.015843320230874473, -0.010192364192394127, -0.009727902460496039, 0.015623991907542644, -0.020745977226329034, -0.017623759353343947, -0.0029915880108887486, 0.021649097467535884, 0.01420480162661395, -0.005960597969181199, 0.004757511772913857, -0.008031325208425703, 0.0031093162616904224, -0.014475738257769535, 0.004076945956354416, 0.013314582065379213, -0.01125030656310459, -0.002577119906342162, -0.012372756058965822, -0.02866763734176627, 0.019958972418096705, -0.007702331326444132, 0.004951037804978911, 0.005654182139795926, 0.0032447843444375775, -0.016204569072415253, -0.00034411326330771683, 0.01813982753042069, -0.0060509101795663935, -0.0174818406977801, 0.0019142938053128835, -0.00962468863881618, 0.0066024589518566485, 0.02833219358545992, -0.0014385425814553703, -0.00373182459459324, 0.015288546288591191, -0.034628237639253844, 0.025829258642553986, -0.011688965072413352, 0.039943746196137636, 0.028203175609868184, 0.010637473973011496, -0.0032044664598957977, -0.011998606537452928, -0.027996747966508466, 0.009082816307827559, 0.0024964841372586023, 0.01913326184465784, 0.007154007724146904, -0.021623294244946557, -0.018359157716397623, -0.030809325305776528, -0.009579532533623583, -0.0023384380019151486, 0.03511850073109616, -0.01416609679272996, -0.0278419267683274, -0.008392573118643932, -0.01575300802048928, 0.0054155000025382745, 0.003138345119934053, 0.010192364192394127, -0.02368757067854373, -0.01917196574721928, -0.0032286573303192483, -0.0005995271340573904, 0.011624456084617485, -0.01195345043226033, 0.017533447142958753, -0.013508108097444266, -0.015520778085862785, 0.000684194714878192, -0.03003522117751631, -0.03532493023710098, -0.0075604122052190074, 0.006779857736972736, 0.00795391460933517, 0.011643808967220755, 0.0010514907501559005, 0.013353287830585753, -0.011063230871025594, -0.02088789588189288, 0.004076945956354416, -0.018913931658680907, 0.021907133418719357, -0.016746442334726424, -0.011798629234079268, 0.014230604849203276, 0.00040519486770173896, 0.01864299502752532, -0.0014127391260354055, -0.01398547237195957, 0.015159529244322005, -0.00950212193453305, 0.002140073982029915, -0.0037189229832985766, -0.034189577267299986, 0.021145929970431254, -0.012534027597132942, -0.013443600040970949, 0.009966584597753689, -0.027429071481607968, 0.0008200660602897944, -0.02274574467213034, -0.01038589022445918, -0.003557651212300819, -0.0020513745894718714, 0.008502238211632398, -0.020139596838867097, 0.025390598270600123, -0.023455339812594685, 0.003944703276430927, -0.007541059322615736, -0.00479299143680482, 0.000971661331778257, 0.02228128294023225, 0.01932678694540034, 0.031377001790677025, 0.006296042656810101, -6.284552202906536e-05, -0.004125327231540041, -0.023094090971053905, -0.0076249207273535995, -0.013779044728599851, -0.02722264383824825, -0.01370163412950932, -0.007553961399571675, -0.020991110634895293, -0.005831580924912013, -0.01882361944829571, 0.0006096066051928354, -0.0075604122052190074, 0.02380368611151825, -0.018513978914578684, 0.010869704838960539, -0.0013337160583636787, -0.005118760148793362, -0.004838147541997417, -0.011205150457911994, 0.018049517182680597, -0.008547394316824997, 0.02822897883245751, 0.029441741470026487, 0.0025416402424512, -0.0066121353931582845, -0.03558296246299425, -0.008257105734388691, -0.01755925036554808, 0.013895160161574374, 0.042137040605326546, -0.013959669149370243, -0.05382600660906245, 0.016359390270596318, 0.008986052826133756, -0.0055348410711671, -0.029802990311567266, 0.025158367404651077, 0.02163619678756377, 0.01994606987547949, 0.008502238211632398, 0.02093950418971664, -0.015327252053797731, 0.03086093175095518, 0.0015844933980024177, -0.003847940027567762, -0.013791946339894515, -0.023261814711852184, -0.017030279645854123, -0.0004733321135321044, -0.0231844031814391, 0.025197073169857618, 0.020642764335971727, -0.021610393564974444, 0.007186262218044838, -0.007702331326444132, -0.008166793524003495, 0.0049832922988768446, -0.021081422845280487, 0.03501528784073885, 0.03357029247457573, 0.005834806094905041, -0.01151479192295157, 0.025945374075528507, -1.5862573083615036e-05, 0.010521358540036973, -0.008102284536207626, 0.036021622834948114, 0.006650840227042275, -0.024397165819008075, -0.021391063378997512, -0.004957488610626243, -0.010211717074997398, 0.011540595145540896, 0.005341315039102046, -0.003889870729936694, -0.004122102061547014, -0.01117289596401406, 0.012895276438673721, -0.008302261839581288, 0.012372756058965822, -0.00465107278124097, -0.004560760570855775, -0.025726043889551575, -0.02462939668495712, -0.0006902424324840546, 0.047710588838684016, -0.018036614640063384, -0.02923531382666677, 0.0006979027932940907, -0.01123095368050132, 0.031918871327697995, -0.01914616252462995, 0.01294043254386632, 0.01048910404613904, 0.02577765033473023, -0.03728599005505064, -0.008592550422017594, -0.00018122895096918994, 0.015198235009528546, -0.01975254477473699, -0.018294648728601755, 0.010353635730561247, -0.020720174003739707, 0.023752079666339597, 0.009953682986459026, -0.0012046987812638554, -0.016501308926160165, 0.0024964841372586023, 0.010147208087201529, -0.006073488232162692, 0.008650608138504854, -0.00025742977661829435, 0.02722264383824825, -0.0012933981738218988, 0.01590782921867034, -0.02714523417048027, 0.020462139915201336, -0.012269542237285963, 0.003873743482987727, -0.0034963680929898924, -0.01579171378569582, 0.01247596988064568, 0.020023481405892576, -0.0036834430865769767, 0.007799093876815383, -0.00619928010643885, -0.0458011317406228, -0.017765678008907798, 0.0148240845566931, -0.039247053598290504, -0.030164237290462945, -0.005999303268726464, 0.0040640438793984775, -0.006537950429722056, -0.007663626026898866, 0.014295113836999145, -0.008211949629196092, 0.012321149613787167, 0.021945837321280796, 0.00411887642589271, 0.028538621228819637, -0.014772478111514447, -0.02933852857966918, -0.009798861788277963, -0.027996747966508466, -0.010095601642022875, -0.007747486965975454, -0.018681700792731862, 0.008450631766453744, 0.0005229231185034128, -0.012811415499597134, -0.045852738185801455, -0.01755925036554808, -0.04755576577785785, 0.010218168346306004, 0.0005761427307551751, 0.037982686378187976, 0.006715349214838143, 0.011347069113475843, -0.017456037475190773, 0.008624804915915527, -0.0021820046843988466, 0.03166083910180472, -0.018230139740805885, -0.01221793579210731, -0.005796100795359775, -0.009327948785071268, 0.005292933763916421, 0.0013256524348891953, -0.01052780981134558, -0.02314569927887766, 0.004818795125055422, -0.012630791078826744, 0.027454874704197295, 0.02473261143795953, -0.018591388582346668, -0.014398327658679004, 0.01510792279914335, -0.027300055368661334, -0.008379671507349268, -0.009160225975595541, -0.004957488610626243, -0.02573894643216879, -0.015533679697157448, -0.006986285380332453, 0.01781728445408645, -0.01943000169840275, 0.007005637797274448, 0.025364795048010796, -0.02148137558938271, 0.0148240845566931, -0.021042717080073946, -0.007773290654226056, -0.011011624425846939, 0.015456269098066917, -0.010637473973011496, 0.023313421157030837, 0.01038589022445918, 0.0255583220113984, -0.008328065062170615, 0.002209420724815325, 0.004609141846041401, 0.01830755127121897, -0.023945606629727202, -0.006599233316202345, 0.018488175691989357, -0.013830651173778507, -0.0003549990851490783, -0.003735049997416906, -0.017404429167367015, -0.015198235009528546, 0.002228773374587958, 0.010953566709359678, 0.008811879676671974, -0.03898902137239724, 0.006992736185979785, 0.004251119105816199, -0.0460849690517505, -0.01888812843609158, -0.002214258945466143, -0.024023016297495182, 0.008927995109646496, -0.03651188965208063, 0.0072765739627687585, -0.022565120251359948, 0.003273813202681208, 0.022190970729847055, 0.0003418957843145317, -0.010256873180189995, 0.0106890813495127, -0.023506946257773338, -0.004570437012157411, -0.0008579648345061655, 0.2809480058487693, 0.0017385077216086297, -0.00708304839636498, 0.02517126994726829, 0.01798500819488473, 0.02266833500436236, 0.025622830999194268, -0.004728482914670227, -0.01590782921867034, 0.01161155447332282, -0.02310699351367112, -0.016810951322522295, -0.012830767450877854, 0.0027077500012691372, 0.0023884323277585636, -0.0325897625656009, -0.03207369438852416, -0.01936549271060688, -0.010792295171192559, -0.0057186906619305184, 0.005386471144294644, 0.012630791078826744, 0.03576358688376464, 0.004347882121848726, 0.008160342252694889, 0.01673353979210921, 0.0006233146836087341, 0.00025843772955260483, 0.04440774654492854, 0.017946302429678186, -0.03269297545595821, 0.02344243913262257, 0.019313886265428227, -0.009418260995456463, -0.024564887697161253, -0.014346720282177799, 0.026887200081941898, 0.0032173683040210986, 0.021326554391201645, 0.020281515494430944, -0.00023021519291106104, -0.019533214588760058, -0.004738159355971862, -0.012566282091030875, -0.01856558535975734, 0.013998373983254233, -0.003454437390620961, -0.011463184546450364, -0.006644389421394943, 0.011476086157745029, -0.022874762647722074, -0.007521706905673741, 0.009418260995456463, 0.018075320405269924, 0.023700473221160943, -0.010605219479113562, 0.03114476906208288, -0.019184868289836492, -0.017507643920369426, -0.019481608143581405, 0.02119753827825501, 0.007612019116058936, -0.014488639869064198, 0.007831348836374593, -0.004557534935201471, 0.0070636955137617094, -0.010437497600960386, -0.011940548820965667, -0.00037072306943359797, -0.042601502337224637, 0.019442902378374864, 0.008353868284759942, 0.0034770154432172593, 0.016423899258392185, -0.01936549271060688, -0.02051374636037999, 0.013237172397611232, 0.020823386894097014, 0.00315447236688302, 0.02686139685935257, -0.0284096032532279, 0.012908178049968385, 0.012559831751044819, -0.014862789390577093, -0.015894928538698228, -0.028435406475817226, -0.012250190286005243, 0.019068752856861968, 0.0001517968882687715, -0.00780554514812399, 0.004999419080164536, -0.015172430855616668, -0.006028332126970095, -0.0266033609081691, -0.008379671507349268, 0.01621747161503247, -0.01063102363302544, 0.021623294244946557, 0.005347765844749378, 0.010534260151331637, -0.013675830906919994, 0.02657755768557977, -0.02170070577535964, -0.005463881277723901, -0.021171735055665684, -0.00741204227834655, 0.012263091897299907, 0.01123095368050132, 0.004663974392535634, -0.026809788551528817, -0.002867408954439743, -0.0427563253980508, 0.010914860944153138, -0.0007067727674744908, -0.013895160161574374, 0.02430685360862288, 0.007250770740179431, -0.01048910404613904, 0.005044575185357134, -0.023055387068492465, 0.04381426683743871, -0.03772465042700451, -0.023519848800390555, 0.00746364918918648, 0.0313511967054426, -0.015275644677296528, 0.017778580551525012, -0.02253931702877062, 0.01155349675683556, -0.03289940496196302, 0.01402417720584356, -0.0007083854688863237, 0.03991794483619341, -0.027996747966508466, -0.018578487902374555, 0.016398096035802858, 0.022513513806181294, 0.01297913737775031, 0.006870169947357931, 0.004296275211008797, 0.028435406475817226, -0.0072378691288847675, -0.012643692690121408, -0.020242809729224404, -0.017210904066624514, -0.01697867320067547, -0.002209420724815325, 0.0013329096494501028, 0.024526183794599813, -0.0169141642128796, -0.012501774034557558, -0.03821491724413702, -0.014411229269973668, 0.01693996743546893, 0.02404881952008451, 0.03710536563428025, -0.026100193411064468, -0.02977718708897794, 0.013327484607996426, -0.0017110915647768322, -0.02851281800623031, -0.00856029592811966, 0.030448076464235745, -0.010043994265521671, -0.009889173998663158, 0.0041640325310853075, -0.16276819585781452, 0.001543369104547062, 0.01583041955090236, -0.0263195235970414, 0.024603593462367793, -0.0018901030513047519, -0.00746364918918648, -0.014501541480358862, 0.007295926845372029, 0.02253931702877062, 0.035066894285917506, -0.0018820394278302682, -0.008199048017901429, -0.004393038227041323, 0.0003501609518097498, -0.014914396767078297, -0.02310699351367112, 0.013585518696534798, 0.029519151137794467, 0.015443367486772254, 0.03684733340838698, -0.008547394316824997, 0.0020739526420681703, 0.01874620978052773, -0.005218748800480193, 0.00403824065680915, -0.03723438360987199, 0.01633358704800699, -0.023016681303285925, 0.01227599350859457, -0.021326554391201645, 0.011347069113475843, 0.02148137558938271, 0.00890219188705717, 0.000806761128123024, 0.0003922931399917566, 0.0023981085362295615, 0.005899314617039634, -0.011063230871025594, 0.013469403263560276, -0.002730328053865436, 0.028357996808049245, -0.0025658311128746504, -0.006360551644605969, -0.0048639512302480195, 0.0058767365644433345, 0.02127494794602299, 0.02127494794602299, -0.011998606537452928, -0.02105561962269116, 0.020281515494430944, -0.05893508938523163, 0.006489568688875155, 0.007328180873608687, 0.01546917070936158, 0.01370163412950932, -0.011579299979424886, 0.02517126994726829, -0.018552682817140124, 0.003589905706198753, 0.011824433387991145, -0.014346720282177799, 0.013959669149370243, 0.0061154187017009864, -0.0034092815182590005, 0.006070262596508389, -0.012430813775453083, -0.005092956926204035, 0.001615134957657881, 0.015262743066001862, 0.004425292255277983, -0.05049735923007254, 0.007392689861404555, -0.02553251878880907, 0.01295978542646959, -0.004070495150707084, -0.019352590167989667, 0.02328761793444151, 0.018810718768323596, -0.015249841454707199, -0.02430685360862288, 0.04087267338522402, -0.02234579192802812, 0.01317911468112397, -0.0057928756253667465, 0.019971873098068818, 0.021326554391201645, -0.011946999160951724, 0.0007849894844403012, -0.00896024960354443, -0.0032947786702809925, -0.026229211386656206, -0.026371130042220053, -0.0053606674560440415, 0.021429769144204053, 0.01772697410634636, -0.015301448831208405, 0.002944819320699637, -0.005073604043600764, 0.013559715473945471, -0.009547278039725647, -0.03424118371247864, -0.014320917059588472, 0.03547974957263694, 0.031093162616904223, 0.014049981359755437, -0.000838612242941192, 0.020952404869688752, 0.036021622834948114, -0.010289127674087928, 0.025274482837625598, 0.015159529244322005, 0.02088789588189288, 0.011443831663847093, -0.01330168045408455, 0.01629488128280045, -0.050703788736077365, -0.005563869929410731, 0.010276226062793265, 0.024887432636140593, -0.014101587804934092, -0.0003723357708454309, 0.0005737236786374257, 0.015353055276387058, 0.0005027641762325229, 0.01046975209485832, -0.05547742775594019, -0.002985137205241417, 0.0005910603643337783, 0.011063230871025594, 0.006986285380332453, 0.03486046850520289, 0.011805080505387875, 0.03769884534177007, -0.005076829679255069, 0.0018030163601585414, -0.013314582065379213, -0.021326554391201645, 0.000799907059811245, -0.008979602486147702, -0.013366189441880418, 0.0234682423552119, -0.011108386976218191, -0.012424363435467026, -0.004747835797273497, 0.009069913765210345, -0.015778813105723707, -0.011927647209671004, -0.007289476039724697, 0.0131597617985207, -0.014617656913333384, -0.02804835441168712, -0.019068752856861968, 0.017714071563729145, 0.0028964378126833733, 0.003020616869132379, 0.0009974647289905623, -0.004647847145586667, 0.0006914519294390996, 0.0034028304797810312, -0.007663626026898866, 0.018114024307831364, -0.03357029247457573, -0.006305719098111736, 0.038601967445622026, -0.012572733362339482, 0.027867729990916728, -0.0032947786702809925, -0.013598420307829462, -0.03488626986514712, 0.0034737900403935935, -0.01781728445408645, 0.006176702053842551, 0.026887200081941898, -0.013869356938985047, -0.023494045577801225, -0.05041995142494966, 0.011185797575308723, -0.015946534983876885, -0.0127791610056992, 0.010560063373920963, 0.010534260151331637, -0.0022239351539371406, 0.005376794702993009, -0.043943281087740246, -0.005021997132760836, -0.0016530338482895711, 0.005231650411774856, -0.02077178044891836, -0.003770529661307868, 0.016965770658058255, 0.0148240845566931, -0.017133494398856534, -0.011295461736974637, 0.01874620978052773, 0.01543046587547759, 0.007708782132091464, -0.009515023545827714, -0.03266717409601398, 0.008889290275762506, -0.026887200081941898, -0.02007508785107123, -0.026371130042220053, -0.012843669062172517, 0.016062650416851405, -0.024577790239778467, 0.007676527638193529, -0.017288313734392494, -0.011185797575308723, -0.006573430093613018, -0.00261098698523661, 0.020681468238533167, 0.008934446380955103, -0.0028093510051218442, -0.003351223568941102, -0.017043182188471336, 0.015095021187848686, -0.002462617291194792, 0.014630558524628048, -0.0033060676965791422, -0.025068055194265883, 0.0025835709448201317, -0.010198815463702734, -0.012379207330274429, 0.02595827475550062, 0.0005180849560602547, -0.002833541875545295, -0.0014393489903689462, -0.07973267678202951, 0.014178998404024623, -0.010134306475906865, 0.0022803802854278873, 0.01229534639119784, 0.013779044728599851, 0.041285528671943454, -0.00016540418012238816, 0.019623526799145252, -0.008482885329029128, -0.028306390362870592, 0.03039647001905709, 0.004912332505433645, -0.013192016292418634, -0.025184170627240404, -0.006215406887726541, 0.049697453741868104, 0.018204336518216558, 0.014720870735013243, 0.003001264219359746, 0.002770645938407216, -0.009953682986459026, -0.005467106913378204, 0.005176817865280623, -0.02573894643216879, 0.018410764161576276, -0.03591840994459081, 0.014527344702948189, -0.018165632615655118, 0.0005898508673787333, 0.0010135919759395294, -0.032873599876728596, 0.006650840227042275, 0.021868427653512816, -0.014333818670883135, -0.032460744590009166, 0.002944819320699637, -0.007199163829339502, 0.0171980015240073, 0.014295113836999145, -0.010147208087201529, -0.024706808215370205, 0.03274458190113686, 0.005005870351473144, -0.012675947184019341, 0.02278445043733688, -0.01838496093898695, 0.02390690086452066, 0.04254989589204598, 0.004896205258484678, 0.015894928538698228, -0.004822020760709725, 0.005467106913378204, -0.004602691040394069, -0.0063734532559006326, -0.036873134768331206, 0.018359157716397623, -0.008302261839581288, 0.03929866004346916, -0.012463068269351016, 0.03127378517502951, -0.011837334999285808, 0.015817517008285147, 0.00466074875688133, 0.011263208174399254, -0.00100230294964138, -0.021662000010153098, 0.013443600040970949, 0.013204917903713297, -0.04283373320317368, -0.026267917151862746, 0.013495206486149602, -0.020745977226329034, 0.012224386132093366, 0.028254782055046838, 0.00960533575621291, -0.002161039216799062, 0.0021045943181389527, -0.014540246314242852, 0.03560876754822868, 0.011959900772246387, 0.013314582065379213, -0.007057244708114378, -0.01892683420129812, 0.01788179344188232, 0.005809002872315714, -0.008405475661261147, -0.004851049618953356, -0.009818214670881233, 0.008379671507349268, -0.02059115602814797, -0.0016417448219914216, 0.005721915831923547, -0.007392689861404555, 0.000437852362329653, 0.005963823604835502, 0.01470796912371858, -0.03189306996775377, 0.026100193411064468, 0.010334283779280527, 0.020126694296249883, -0.0026787211430255066, -0.013391992664469745, -0.01123095368050132, -0.025274482837625598, 0.002106206903135467, -0.03142860823585568, -0.039247053598290504, 0.013727437352098647, 0.004296275211008797, 0.0024884207466147564, 0.009611787027521516, 0.0034479865849736287, 0.02278445043733688, -0.007166909335441568, -0.008199048017901429, 0.012108270699118844, -0.019184868289836492, -0.038524555915208945, 0.03313163582791207, -0.016023944651644865, 0.01834625517378041, 0.013004940600339637, 0.002796449393827181, 0.0208104862141249, -0.009960133326445082, 0.011521242262937626, 0.000827323274850702, 0.00857964881072293, 0.008360319556068549, -0.017172198301417974, 0.017094788633649993, -0.012553380479736212, -0.01108903409361492, -0.01607555295946862, 0.006376678891554936, -0.010056896808138885, 0.019094556079451295, -0.021171735055665684, 0.04254989589204598, 0.011030976377127659, -0.017791481231497125, 0.028022551189097793, -0.0028786979807378923, -0.0009982711379041382, 0.025274482837625598, -0.0075797646221610025, -0.004838147541997417, -0.009134422753006214, 0.024603593462367793, -0.0032625241763830585, 0.005883187835751942, 0.0009434388242405429, -0.0008140183426839317, -0.0049478121693246075, -0.014617656913333384, 0.015185332466911332, 0.019275180500221686, -0.013804847951189178, 0.02217806818722984, -0.0325897625656009, 0.024616496004985007, 0.01860429112496388, -0.027480679789431722, -0.005634829257192655, -0.00354152419818249, -0.03870518033597933, -0.005767071937116145, -0.0024642298761913058, 0.002828703654894477, 0.0008998954786674378, -0.012166328415606104, -0.00436078373314339, 0.004538182518259476, 0.003960830057718618, -0.016720639112137097, 0.02216516750725773, 0.019700938329558337, 0.014153195181435296, -0.0074959036830844145, 0.030448076464235745, -0.03122218059249596, -0.014230604849203276, -0.015727204797899953, -0.007250770740179431, -0.011921195938362397, 0.008360319556068549, -0.021545884577178577]
カスタマーサービス：カード番号か身分証明書の番号を教えていただけますか？
```

## Faiss 

Faiss（Facebook AI Similarity Search）は、Facebook AI Researchによって開発された、大規模なデータベースからベクトルを高速に検索するためのライブラリです。特に、深い学習の文脈で生成される大量のベクトルデータに対する類似性検索やクラスタリングに使用されます。


```python 
pip install faiss-gpu
pip install faiss-cpu
```

```python 
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
db = FAISS.from_texts(list_text, OpenAIEmbeddings())
```

```python 
# 類似度検索
query = "顧客の身分証明書番号を教えてください。"
docs = db.similarity_search(query)
print(docs[0].page_content)
```

```python 
# ベクトルで類似度検索
embedding_vector = OpenAIEmbeddings().embed_query(query)
print(f'embedding_vector：{embedding_vector}')
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)
```

結果はchromdbと同じです。


類似度の結果も出力できます。スコアが低ければ、類似しています。

```python 
#スコアも一緒に検索
docs_and_scores = db.similarity_search_with_score(query)
docs_and_scores
```

出力結果：

```python 
[(Document(page_content='カスタマーサービス：カード番号か身分証明書の番号を教えていただけますか？'), 0.1471316),
 (Document(page_content='カスタマーサービス：申し訳ございませんが、記録を見つけることができませんでした。もう一度、身分証明書の番号を確認させてください。'),
  0.22633505),
 (Document(page_content='顧客：了解です、お手数をおかけしますが、よろしくお願いします。'), 0.2668518),
 (Document(page_content='顧客：はい、お願いします。'), 0.27708018)]
```

最後に、保存とロードをします：

```python 
# 保存とロード
db.save_local("faiss_index")
new_db = FAISS.load_local("faiss_index", OpenAIEmbeddings())
```

# 最後に

ここまでは、LangChainのオフィシャルサイトを参照して、概要を勉強しました。