OpenAIのGPT-4oモデルとObjectBoxベクターデータベースを使用したRAGアプリケーションの構築

こんにちは。今回はKrishakさんの動画を参考に、OpenAIの最新モデルであるGPT-4oと、オープンソースのベクターデータベースであるObjectBoxを使用して、エンドツーエンドのRAG（リトリーバル・オーグメンテッド・ジェネレーション）アプリケーションを構築する方法を紹介します。

<iframe width="560" height="315" src="https://www.youtube.com/embed/TcvI-Nnebow?si=xH6ma4V-KCYV1IG5" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 概要
このチュートリアルでは、以下のステップに従ってRAGアプリケーションを構築します。
Google Colaboで試してみました。
1. 環境変数の設定
2. ドキュメントのロードとチャンクへの分割
3. テキストをベクターに変換し、ベクターデータベースに保存
4. クエリと応答生成のためのRAGパイプラインの構築

## 1. 環境変数の設定
OpenAI APIキーなどの環境変数をロードします。

```python
import os
from google.colab import userdata
# 環境変数にAPIキーを設定
os.environ["OPENAI_API_KEY"] =  userdata.get('OPENAI_API_KEY')
```
ご自身の環境にあわせてAPI_KEYを設定する実装にしてください。

必要なモジュールをインストールします。
```python
!pip install langchain_community
!pip install langchain_objectbox
!pip install langchainhub
!pip install langchain_openai
```

## 2. ドキュメントのロードとチャンクへの分割
次に、Webサイトのコンテンツを読み込み、ドキュメントローダーを使用してドキュメントを取得します。その後、ドキュメントをチャンクに分割します。

```python
from langchain_community.document_loaders import WebBaseLoader

loader = WebBaseLoader("https://docs.smith.langchain.com/user_guide")
data = loader.load()
data
```

## 3. テキストをベクターに変換し、ベクターデータベースに保存
取得したドキュメントをOpenAIの埋め込みを使用してベクターに変換し、ObjectBoxベクターデータベースに保存します。

```python
from langchain_objectbox.vectorstores import ObjectBox
from langchain_openai import OpenAIEmbeddings

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(data)

from langchain_openai import OpenAIEmbeddings
vector = ObjectBox.from_documents(documents, OpenAIEmbeddings(), embedding_dimensions=768)
vector

from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import RetrievalQA
from langchain import hub

llm = ChatOpenAI(model="gpt-4o") ## Calling Gpt-4o
prompt = hub.pull("./rlm/rag-prompt")
prompt
```

## 4. クエリと応答生成のためのRAGパイプラインの構築
最後に、RAGパイプラインを構築し、クエリに対する応答を生成します。

```python
qa_chain = RetrievalQA.from_chain_type(
        llm,
        retriever=vector.as_retriever(),
        chain_type_kwargs={"prompt": prompt}
    )

question = "Explain what is langsmith"
result = qa_chain({"query": question })
result
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ed5d61e8-5476-b507-f0ea-91cb56a0b044.png)

## 結論
Krishakさんの動画を参考に、OpenAIのGPT-4oモデルとローカルのObjectBoxベクターデータベースを使用して、RAGアプリケーションを構築する方法を紹介しました。これにより、データセットを効率的に扱いながら、高度な質問応答システムを実現できます。

## 注意事項
2024年5月18日時点ではこのコードで動作を確認していますが、ライブラリのバージョン更新などで動作しなくなる可能性があります。それについては、ご了承ください。

<details>
<summary>pythonのライブラリのバージョン</summary>

```python
langchain                        0.2.0
langchain-community              0.2.0
langchain-core                   0.1.52
langchain-objectbox              0.1.0a4
langchain-openai                 0.1.7
langchain-text-splitters         0.2.0
langchainhub                     0.1.15
```
</details>