RAGの錬成術～入門編～

# RAGの錬成術 ~入門編~
## はじめに
 - この記事は「とにかくRAGを作りたい！」という人を読者として想定しています。
     - サービスをデプロイしたり、機密情報を扱ったりすることは特に想定していないのであしからず。
     - もちろん使用は自己責任でお願いします。
     - コードは安全な環境で実行してください。
 - APIでサクッとRAGの作り方は3つある
     - OPENAIのASSISTANTS APIを使う方法
     - langchainで実装する方法
     - 自分でベクトルDBを作る方法
     - （他にもDifyやAzure-OpenAI等を使う方法もあるが、割愛）
 - 上が簡単で、下に行くほど実装が難しくなるが、カスタマイズができるようになる。
## RAGとは
 - RAGとはRetrieval Augmented Generationの略で、ChatGPTをはじめとする生成AIに文書から抽出した文献を与えることで、その機能を拡張する概念である。
 - 様々な方法があり、一般的なベクトル検索から、検索キーワードをChatGPTにこたえさせたり、答えが見つかるまで有限ノックさせる方法もある。
 - 文献は下記参照
     - https://arxiv.org/abs/2312.10997
     - https://arxiv.org/abs/2402.19473

## OPENAIのASSISTANTS APIを使う方法
 - OpenAIのFunction Callingの一つ(?)である、File Searchを使う。

### WEBで触るところ（APIでも触ることはできるが、今回は割愛。）
1. まずは、https://platform.openai.com/ にアクセスする。必要に応じてログインし、「Storege」をクリックする。
1. 「Vector Stores」をクリックして、「Create」をクリックする![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324271/c56a52d1-91c7-cb95-5484-17f31a94f21d.png)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324271/d5ca666d-d578-1c27-1ee5-520c57d755fe.png)
1. 「Vector Store」を作成出来たら、「Add files」をクリック![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324271/ce26e64a-7b20-2280-3189-e291451bfaec.png)
1. RAGしたいファイルをアップロードして、Attachをクリックする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324271/64ba61e3-65fd-adc5-7af8-9b87c7208cc3.png)
1. 出来たら、右下の「Create Assistant」を一回クリックして、「Assistants」タブに移動する![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324271/679fb7b6-4c76-7182-e378-e8320ea8a3ea.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324271/e1be0b3c-8572-501f-d021-1ab4ada35df9.png)
1. そうするとAssistants APIができているので、必要に応じて、System InstructionやModelを適当に調整する。また、File SearchがONになっていることを確認する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324271/06d2bf39-cb3e-819d-5e8e-aa7d13a3bc78.png)
1. その後、PlayGroundに行って動作を確認する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324271/d7e7b7b2-380d-b738-fb2e-a46230422d47.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324271/9af67c86-15db-48de-d621-c825629aef39.png)
1. Assistants IDを保管しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324271/a9770414-80d7-8ba9-c447-98701740d57a.png)

### Pythonで触るところ
 - 参考:https://platform.openai.com/docs/assistants/quickstart?context=without-streaming
 - 準備できたら、Pythonで以下のコードを実行する。
   

```python
import getpass
import os

# API KEYをコードにベタ打ちしないように、getpassで取得する。
# このコードを実行すると、入力画面になるので、そこで入力する。
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API key: ") 
```

```python
from openai import OpenAI

prompt = "ここに聞きたいプロンプトを書く"
assistants_id = "先ほど保存したASSISTANTS IDをここに書く"
client = OpenAI()

thread = self.client.beta.threads.create() # Threadを作成

message = self.client.beta.threads.messages.create(
    thread_id=thread.id, # 先ほど作成したthreadを利用
    role="user", # roleはuser
    content=prompt, # 先ほど定義したプロンプトを入力。
)
run = self.client.beta.threads.runs.create_and_poll(
    thread_id=thread.id, 
    assistant_id=assistant.id
)

if run.status == 'completed':
  messages = client.beta.threads.messages.list(
    thread_id=thread.id
  )
  print(messages)
else:
  print(run.status)
```

きちんと出力出来たらOK


## Langchainを使う方法
後日追記

## ベクトルDBを使う方法