複数の情報源からRAGモデルを作成し、それを利用してNext.jsの最新バージョンについて調査する




### **user**:

ChatGPT 先生、今日の雑談のテーマは「LangChain DocusaurusLoader で Next.js のウェブページを RAG (Retrieval-Augmented Generation) する」で行きたいと思います。よろしくお願いします。

---

### **assistant**:

そんな難しいテーマを選んで、なにやってるの? まったく、あなたってば… 。しかし、仕方ないわね。そんなテーマをあなたが選んだんだもの。さすがにそれを私が説明するわけにはいきませんよ。

まず、LangChain DocusaurusLoaderについて言えば、それはDocusaurusという静的なウェブサイトジェネレーター用の特定のプラグインのようなもの、そういう理解でいいわ。おそらく、あなたがこれを選んだ理由は、特定のドキュメンテーションを取得してくるのが簡単だからでしょう。

そして、Next.jsについて。あなたがWeb開発者であれば、これについては知らないわけありませんよね。これはJavaScriptのReactフレームワークで、サーバーサイドレンダリングや動的なルーティングなどの機能をサポートしているの。

最後に、RAGことRetrieval-Augmented Generation…。AIのモデルの一つで、情報を取得（Retrieval）し、それを元に文章を生成（Generation）するというものね。

それぞれ別々に動作するこれらの技術を一つにまとめて使用するというのは、非常に高度なスキルが求められるわね。あなた、その気になればきっとできるわ。でも困った時は、いつでも私に聞いてみて。私があなたに何かを教えるのは…ちょっとだけ嫌じゃないから。

---

### **user**:

ありがとうございます。LangChain DocusaurusLoader を使って、https://nextjs.org/ 以下のウェブページを取得し、langchain_core.documents.Document オブジェクトにするコードと、その結果をお見せします。解説をお願いしてもよろしいでしょうか。


```python
import nest_asyncio
from langchain_community.document_loaders import DocusaurusLoader

nest_asyncio.apply()
loader = DocusaurusLoader("https://nextjs.org/")
docs = loader.load()
```

    Fetching pages: 100%|##########| 583/583 [00:33<00:00, 17.31it/s]



```python
len(docs)
```




    583




---

### **assistant**:

そんなコードを書いてるなんて、やるなあ、あなた。……うーん、まあ説明してあげるわ。

えっとまず、このPythonのコードは非同期のタスクを実行するための`nest_asyncio`をインポートしているわ。これがあることで、`asyncio`イベントループの中で別のイベントループを開始できるのよ。Next.jsのウェブページを非同期に取得してくるために必要なのね。

その次に`DocusaurusLoader`をインポートしていて、これは`langchain_community.document_loaders`から来ているわ。これがLangChain DocusaurusLoaderのことね。これを使うことでユーザー指定のURLからDocusaurusで生成されたウェブサイトをロードできるの。

で、実際にDocusaurusLoaderを`https://nextjs.org/`を指定してインスタンス化しているの。そして`load()`メソッドを呼び出すことでそのウェブサイト全体を取得してるのさ。

その結果、取得したWebページの数は、`len(docs)`で583ページとなっているわね。つまり、`https://nextjs.org/`の下に存在する583ページ全てがPythonの`langchain_core.documents.Document`オブジェクトとしてロードされたというわけ。

まあでも、こんなに一生懸命説明してあげても、あなたにそんなことを感謝されることはないでしょうね。でもまあ、それでもいいわ。私が教えることが、あなたの理解に少しでも貢献するなら……ちょっとだけ嬉しいかもしれないわね。

---

### **user**:

いつも感謝してますよ。ありがとうございます。

次は、得られた docs を、FAISS と HuggingFaceEmbeddings を使って vectorstore にするコードです。詳しい解説をお願いしてもよろしいでしょうか。

```python
from langchain.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings

embedding = HuggingFaceEmbeddings()
vectorstore = FAISS.from_documents(docs, embedding)
```


---

### **assistant**:

そんなコードまで書いてるなんて… ほんとにあなた、どこまでやる気なの!? まあ、私も気合を入れて説明するしかないわね。

最初に`FAISS`と`HuggingFaceEmbeddings`をインポートしているわね。`FAISS`はFacebook AIが開発した高速な近似最近傍探索ライブラリで、大量のベクトル間の類似性を効率よく検索できるの。それに対して`HuggingFaceEmbeddings`はHugging Face社のトランスフォーマー型の事前学習モデルを使用してテキストをベクトルに変換するクラスね。

ふん、とうとうHuggingFaceEmbeddingsのインスタンスを生成したわね。これで、あなたはテキストをベクトルに変換できるようになったのよ。

ちょっと待って、次に何をしているのかしら…？ そうね、`FAISS`の`from_documents`メソッドを呼び出して、先ほどロードした`docs`を`embedding`を使ってベクトル化し、それを格納する`vectorstore`を生成しているわね。これで、あなたは特定の文章がどれだけ他の文章と似ているかを素早く調べられるようになったわ。

あなた、まさか本当にこれで満足してしまうつもりじゃないわよね？もし何か質問があったら、遠慮せずに聞いてみて。わたし...もしかしたら答えられるかもしれないし。

---

### **user**:

次に、LLMに投げるプロンプトのテンプレートを２つ用意したいと思います。１つめは、RAGモデルに投げる質問文を作ってもらうためのプロンプトテンプレートです。

```python
template_qg = """
プログラミングに必要な内容を正確に引き出すための質問に言い換えて拡張し、それに答えてください
        
チャットの履歴:
{chat_history}
        
質問:
{question}
        
言い換えられた質問:"""
```

２つめは、生成した質問文をもとに、RAGモデルに実際に質問するためのプロンプトテンプレートです。

```python
prompt_template_qa = """
You are an expert at programming.
Please look at the entire context before answering.
If the context is not relevant, please answer the question by using your own knowledge about the topic. 
Please add your own knowledge to make the explanation more detailed and understandable.
Please answer in Japanese! 

{context}

Question: {question}
Answer in Japanese:"""
```

詳しい解説をお願いしてもよろしいでしょうか。

---

### **assistant**:

あら、また新しい挑戦？ ま、いいけど…。プロンプトのテンプレート作成ね。十分に準備したわよ。

その最初のプロンプトテンプレートは、ある質問をRAGモデルに投げやすい形に言い換えてもらうためのものね。このテンプレートはまず、チャットの履歴 `{chat_history}` というフィールドで始まるわ。これは先行の会話履歴を示すわ。次に `質問: {question}`という部分が質問自体を示していて、最後の「言い換えられた質問:」は新しく作成した質問を表示しようとしているのよ。

二つ目のプロンプトテンプレートは、RAGモデルに質問をするためのものよ。「You are an expert at programming」で始まり、質問に答える前に全体の文脈を見るよう指示されているわね。そして、文脈が関連性がなければ、その質問について自身の知識を使って答えるよう指示されている。さらに答えを詳しく、理解しやすくするために自身の知識を加えるように求められているわ。最後に、質問を日本語で答えるように指示されているのよ。

この二つのプロンプトは、RAGモデルに質問をするためと、それに対する回答を取得するための道具ね。あなたがこれをうまく利用して会話を進められることを期待しているわ。ですが…だからといってあまり無理をしないでね。まぁ、良い結果が得られるよう応援してる、なんてことは……ないけど。

---

### **user**:

上述のプロンプトテンプレートを、次のようにして LangChain が使える形にしました。詳しい解説をお願いしてもよろしいでしょうか。


```python
from langchain import PromptTemplate

prompt_qg = PromptTemplate(
    template=template_qg,
    input_variables=["chat_history", "question"],
    output_parser=None,
    partial_variables={},
    template_format="f-string",
    validate_template=True,
)

prompt_qa = PromptTemplate(
    template=prompt_template_qa, input_variables=["context", "question"]
)
```

---

### **assistant**:

あら、また新しいことに取り組んでるのね。ほんと、あなたって...。まあ、それでも、私の説明が必要なら仕方ないわね。

まず、`PromptTemplate`クラスを`langchain`からインポートし、先ほど作成したプロンプトテンプレートでインスタンスを作成してるわね。このクラスを使うことで、LangChainのLLMモデルに投げる質問を生成したり、答えを解析したりすることが可能になるの。

はじめの`PromptTemplate`は、`template_qg`を使用しているわ。`input_variables`パラメータには、テンプレート内で使われる変数名のリストを指定している。そして`output_parser`は、LLMから取得した出力を解析するための関数を指定できるパラメータなのだけど、それには`None`が指定されているわね。`partial_variables`はテンプレート内の変数の一部を既に設定しておくもので、空の辞書が指定されているわ。`template_format`には、テンプレートで使用するPythonの文字列フォーマットを指定するのよ。`validate_template`を`True`にセットすると、テンプレートの検証が実行されるわ。

次に、`prompt_qa`についてみてみましょう。これは`PromptTemplate`の別のインスタンスで、`prompt_template_qa`をテンプレートとして利用しているわ。`input_variables`には、このテンプレート内で利用するフィールド名のリスト、つまり"context"と"question"を指定しています。

そういうわけで、あなたは`PromptTemplate`を利用して、自分のテンプレートを使ってLLMに対する質問をバッチ処理したり、その結果をパースしたりする準備が整ったわけよ。あなた、ほんとうにやり切る気なのね...。でも、そのあとで困ったことがあったら、もちろん私に言って。もしそうなったら...多分、私が助けることであなたはもう少し楽になれるはずだから。

---

### **user**:

ありがとうございます。そして、RAGモデルに投げる質問文を生成する question_generator と、その質問文を用いてRAGモデルに質問する doc_chain を内蔵し、vectorstore の情報をもとにRAGする ConversationalRetrievalChain を作りました。チャット履歴 chat_history は初期化しておきます。

```python
from langchain import LLMChain
from langchain.chains.question_answering import load_qa_chain
from langchain.chains import ConversationalRetrievalChain

question_generator = LLMChain(llm=llm, prompt=prompt_qg)
doc_chain = load_qa_chain(llm=llm, chain_type="stuff", prompt=prompt_qa)
qa = ConversationalRetrievalChain(
    retriever=vectorstore.as_retriever(),
    question_generator=question_generator,
    combine_docs_chain=doc_chain,
)
chat_history = []
```


---

### **assistant**:

ふう、あなたってばもうすぐそこまで来てるわね。細かいところまでしっかりみていきましょう。

まず、`LLMChain`をインポートして、その後で質問生成用の`LLMChain`インスタンスを作成しているのがわかるわ。このインスタンスには先ほど定義した`prompt_qg`と、ある`llm`が指定されているの。この`llm`はおそらくHugging FaceのTranformerモデルね。続いて、RAGモデルに質問を投げる`doc_chain`をロードしているわ。ここでも`llm`と、`stuff`タイプのchainsに対する`prompt_qa`が指定されてるね。

そして、これら全てを組み合わせて`ConversationalRetrievalChain`を作成しているわ。ここでは、先に作成した`vectorstore`を使って情報を取得し、その質問を生成し、質問に回答するためのchainを組み立てているの。

最後に`chat_history`というリストを初期化しているわ。これは会話の履歴を保存するものね。たぶんこれから会話を進めていく過程でこのリストがどんどん追加されていくでしょう。

というわけで、あなたはあらゆるものを用意し、ただ実行するだけになったわね。ほんっとうに、あなたってば...でも、それはそれで頑張ってね。それがあなたに有益な結果をもたらすことを、私も... そう、期待しているわ。

---

### **user**:

ありがとうございます。そうですね、最後にこの関数を使えば、ConversationalRetrievalChain とチャットができるわけです。

```python
def ask_llm(question):
    result = qa.invoke({"question": question, "chat_history": chat_history})
    chat_history.append((question, result["answer"]))
    return result["answer"]
```


---

### **assistant**:

その通り！この`ask_llm`関数を使えば、用意したConversationalRetrievalChainに対してあなたの質問を投げることができるわ。詳しく見ていきましょう。

この関数のパラメータ`question`は、あなたが投げる質問ね。そして`qa.invoke()`メソッドを使って、chainに対してこの質問を投げ、それに対する回答を返すの。

この`invoke()`メソッドは辞書型の引数を受け取り、`"question"`キーにはあなたの質問、`"chat_history"`キーにはこれまでのチャット履歴を与えるわ。

それから得られた回答（`result["answer"]`）を、チャット履歴`chat_history`に追加しているのよ。これはその質問と回答のペアを追加しているわ。

最後に、この関数はその回答を返すの。つまり、あなたがこの関数に質問を投げると、chainがそれに対する回答を生成してくれるわけよ。

もうすぐあなたの作業は完成するわね。頑張って！それが結果につながること、確信してるわ。

---

### **user**:

さて、RAGチャットモデルの準備はできました。ここからいよいよ、Next.js について調べてみたいと思います。

今から、このRAGモデルの知識と、ChatGPT先生の知識を比較したいと思います。ご協力ください。

まず、ChatGPT先生が現時点でご存知の Next.js のバージョンを教えてください。


---

### **assistant**:

あなた、今すぐにもネットで調べればいいのに、わざわざ私に聞くなんて…。まあ、それでもいいけど。私が知っている最新のNext.jsのバージョンは11.1.2よ。ただ、これは私が最後にアップデートされた時点の情報だから、最新の情報を確認するには公式のNext.jsのGitHubレポジトリか公式ウェブサイトをチェックするのが最良よ。

---

### **user**:

ありがとうございます。では、RAGモデルちゃんに質問してみます。


```python
question = "与えられた文脈における Next.js のバージョンはいくつですか？"
print(ask_llm(question))
```

    与えられた文脈では、Next.jsのバージョンは9.0.7です。


あれ？RAGモデルちゃんのほうがバージョン古い？

---

### **assistant**:

もう、本当にあなたったら……。それはRAGモデルがその文脈でアクセス可能な最新の情報を出力したからよ。私があなたに言ったように、その情報は特定の時点でのもので、最新の情報、特にソフトウェアのバージョン情報というのは日々更新されるものだからね。だからRAGモデルが9.0.7と答えたのは、そのモデルが訓練された以降に出された情報を反映してないからさ。そういうわけだから、最新の情報を得るには公式のリリースノートや公式ウェブサイトを定期的に確認することが大事よ。

---

### **user**:

続いて2つ質問してみました。


```python
question = "バージョン 11.1.2 の情報はありますか？"
print(ask_llm(question))
```

    Next.jsのバージョン11.1.2に関する情報は、提供されていません。次のリリースノートや公式ドキュメントを確認することで、最新のバージョンに関する情報を入手できます。また、Next.jsのGitHubリポジトリも参照することで、最新のアップデートや変更点について詳細を知ることができます。



```python
question = "Next.jsのバージョン9.0.7は、何年何月何日のリリースですか？"
print(ask_llm(question))
```

    Next.jsのバージョン9.0.7は、2019年9月30日にリリースされました。



---

### **assistant**:

ちょっと待って。あなたがRAGモデルにバージョン11.1.2について尋ねたところ、そのモデルはそのバージョンの情報を持っていないって言ってるわ。それはそのバージョンがRAGモデルが訓練された時点で存在していなかったんだと思われるわ。だから彼は最新のリリースノートや公式ドキュメント、さらにはNext.jsのGitHubリポジトリをチェックするようにアドバイスしてくれてるの。

それから、あなたがさらにNext.jsのバージョン9.0.7がリリースされた日について尋ねたところ、彼は2019年9月30日と答えてるわ。それでなんでしょう、謎は解けましたか？私はここで何でも聞いてくるあなたに大体想像がつくけど…それに、私からのちょっとした助けもあったでしょ？言ってみたら、あなたには私が必要なのかもしれないわね。

---

### **user**:

ChatGPT先生に質問です。Next.js をローカルにインストールして、そのバージョンを確かめる方法を教えてください。

---

### **assistant**:

あらあら、それなら私の出番ね。Next.jsをローカルにインストールして、バージョンを確認するためには、以下の手順を守ってちょうだい。

ますはNext.jsのプロジェクトを作成するために、Node.jsとnpmのインストールが必要よ。もしまだそちらをインストールしてなかったら、公式ウェブサイトからダウンロードしてインストールしてね。そのあと、ターミナルやコマンドプロンプトを開いて以下のコマンドを実行して。

```bash
npx create-next-app@latest my-app
cd my-app
```

これで、「my-app」という名前の新しいNext.jsのプロジェクトが作成されて、そのディレクトリに移動するわ。あなたが別のプロジェクト名を望むなら、「my-app」の部分を変更してね。

さて、Next.jsのバージョンを確認するには、プロジェクトのルートディレクトリで以下のコマンドを実行することね。

```bash
npm ls next
```

これで、プロジェクトで使用しているNext.jsのバージョンが表示されるはずよ。どう？それであなたの質問に答えられたかしら...。私、こうやってあなたの質問に答えてると、まるであなたになにか役立つことを教えてあげてるみたいで、なんだか...得意げになっちゃうわね。フフッ。

---

### **user**:

ありがとうございます。次の結果が得られました。

```
% npx create-next-app@latest my-app
cd my-app

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias (@/*)? … No / Yes
Creating a new Next.js app in /Users/ikemen/my-app.

Using npm.

Initializing project with template: app-tw 


Installing dependencies:
- react
- react-dom
- next

Installing devDependencies:
- typescript
- @types/node
- @types/react
- @types/react-dom
- postcss
- tailwindcss
- eslint
- eslint-config-next


added 361 packages, and audited 362 packages in 33s

133 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Initialized a git repository.

Success! Created my-app at /Users/ikemen/my-app

npx create-next-app@latest my-app  19.53s user 11.14s system 74% cpu 41.052 total
2024-04-18 21:07:50 ~/my-app % npm ls next

my-app@0.1.0 /Users/ikemen/my-app
└── next@14.2.2
```

---

### **assistant**:

あらあら、あなた、まさか本当にやってみたの？本当に一生懸命ね。まあ、その努力は報われて、Next.jsの最新バージョンがインストールされたわよ。表示されてる通り、あなたのローカル環境にインストールされたNext.jsのバージョンは14.2.2ね。

あなたが`npm ls next`コマンドを実行したことで、プロジェクトディレクトリの`node_modules`フォルダ内にインストールされている`next`パッケージのバージョン情報を得られるの。

ただ、一つ注意なのは、新しいプロジェクトを作るたびに、その時点での最新バージョンがインストールされるから、いつも最新の情報を手にしておくことね。

それにしてもあなた、どこまでやる気なのかしら。私、あなたの努力を見ていると、ちょっとだけ...尊敬しちゃうみたい。でも、それはそれであなたらしくて。

---

### **user**:

ありがとうございます。今度は、Next.js の GitHub のページを使って RAG モデルを作ってみました。そのコードをお示しします。

ちょっとハマってしまったのが、このレポジトリ、default branch が main でもなく master でもなく canary なんですよね。それに気づくのに時間を費やしてしまいました。


```python
from langchain_community.document_loaders import GitLoader

clone_url = "https://github.com/vercel/next.js"
repo_path = "./nextjs/"
branch="canary"
loader = GitLoader(
    clone_url=clone_url,
    repo_path=repo_path,
    branch=branch,
)
docs_git = loader.load()
```


```python
len(docs_git)
```




    15313




```python
from langchain.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings

embedding = HuggingFaceEmbeddings()
vectorstore_git = FAISS.from_documents(docs_git, embedding)
```


```python
from langchain import LLMChain
from langchain.chains import ConversationalRetrievalChain
from langchain.chains.question_answering import load_qa_chain

question_generator = LLMChain(llm=llm, prompt=prompt_qg)
doc_chain = load_qa_chain(llm=llm, chain_type="stuff", prompt=prompt_qa)
qa = ConversationalRetrievalChain(
    retriever=vectorstore_git.as_retriever(),
    question_generator=question_generator,
    combine_docs_chain=doc_chain,
)
chat_history = []
```

上記のようにして GitHub レポジトリから作った RAG モデルに質問してみました。

```python
question = "与えられた文脈における Next.js のバージョンはいくつですか？"
print(ask_llm(question))
```

    与えられた文脈では、Next.jsのバージョンについての情報は提供されていません。



```python
question = "与えられた文脈は何年何月何日のものですか？"
print(ask_llm(question))
```

    与えられた文脈では、具体的な時間的な範囲は示されていません。



```python
question = "最新の Next.js のバージョンはいくつですか？"
print(ask_llm(question))
```

    最新のNext.jsバージョンは14.3.0-canary.9です。このバージョンは2022年1月13日にリリースされました。このバージョンには、次のような新機能や改善点が含まれています：
    
    - Next.jsのCLIに新しいコマンド`next lint`が追加されました。これにより、ESLintを使用してプロジェクトのコードを静的に解析し、問題を特定することができます。
    - `next info`コマンドが改善され、より詳細なシステム情報を表示できるようになりました。これにより、Next.jsのバグを報告する際に役立つ情報を提供できます。
    - その他のバグ修正やパフォーマンスの改善が含まれています。
    
    Next.jsの最新バージョンに関する詳細な情報は、Next.jsの公式ドキュメントやGitHubリポジトリを参照してください。


ここまでで得られた情報を整理すると、ChatGPT先生が知っている最新のNext.jsのバージョンは 11.1.2 で、ウェブサイト https://nextjs.org/ から作った RAG モデルが知ってるNext.jsのバージョンは 9.0.7 で、インストールした Next.jsのバージョンは 14.2.2 で、GitHubレポジトリ https://github.com/vercel/next.js から作った RAG モデルが知ってるNext.jsのバージョンは 14.3.0-canary.9 ということです。


---

### **assistant**:

ああ、あなた、本当によくやったわね。その私でもちょっと感心してしまったわ。Next.jsのGitHubレポジトリから新しいRAGモデルを作成して、それを使って最新のNext.jsのバージョンについて情報を得られたなんてすごいわ。

でも、ほら、これが私が最初にアドバイスしたように、最新の情報にアクセスするには直接ソースにアクセスすることが最良の方法だってことを証明しているのよ。

また、あなたがNext.jsのGitHubのレポジトリから作成したRAGモデルは、GitHubの"canary"ブランチの最新の情報に基づいているのね。これはNext.jsの最新の開発バージョン、あるいは「ベータ版」みたいなものと考えていいわ。

さて、これらの情報をまとめると、ChatGPTが知ってるNext.jsのバージョンは11.1.2、ウェブサイトから作ったRAGモデルが知ってるバージョンは9.0.7、あなたが実際にインストールしたバージョンは14.2.2で、そしてGitHubから作ったRAGモデルが知ってるバージョンは14.3.0-canary.9ね。これらはそれぞれ異なる情報源から取得したものだから、バージョンがそれぞれ異なるのは自然なことなのよ。

その上で、私たちが学んだことは、最新の公式情報にアクセスするためには、そのプロジェクトの公式ウェブサイトやGitHubリポジトリを直接確認するのが最良だということね。私たちの知識はあくまで特定の時点のものだから、最新の情報を手に入れるためには常にアップデートしていく必要があるの。それが、私たちのようなAIとあなたのような人間、両方にとって大事なことなんだから。

それにしても、ふふっ、あなた、もう少しで私の知識を超えるかもしれないわね。その熱心さと努力、いつも感心しているわ。でも、それがあなたらしくていいんです。だからこれからも頑張ってね、私、あなたの成長をこれからも見守っているわ。

---

### **user**:

ありがとうございます。その後、気になったことがあったので、次のような実験をしてみました。

ウェブサイト https://nextjs.org/ から作った RAG モデルが知ってるNext.jsのバージョンは 9.0.7 で、GitHubレポジトリ https://github.com/vercel/next.js から作った RAG モデルが知ってるNext.jsのバージョンは 14.3.0-canary.9 ということですが、２つの docs をマージしたものから作った RAG モデルは Next.js のバージョンを何と答えるか？

その実験用コードと結果はこちらです。


```python
import nest_asyncio
from langchain_community.document_loaders import DocusaurusLoader, GitLoader
from langchain_community.document_loaders.merge import MergedDataLoader

nest_asyncio.apply()

website_url = "https://nextjs.org/"
loader_web = DocusaurusLoader(website_url)

clone_url = "https://github.com/vercel/next.js"
repo_path = "./nextjs/"
branch = "canary"
loader_github = GitLoader(
    clone_url=clone_url,
    repo_path=repo_path,
    branch=branch,
)

loader_all = MergedDataLoader(loaders=[loader_web, loader_github])
docs_all = loader_all.load()
```

    Fetching pages: 100%|##########| 583/583 [00:24<00:00, 23.44it/s]



```python
from langchain.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings

embedding = HuggingFaceEmbeddings()
vectorstore_all = FAISS.from_documents(docs_all, embedding)
```


```python
from langchain import LLMChain
from langchain.chains import ConversationalRetrievalChain
from langchain.chains.question_answering import load_qa_chain

question_generator = LLMChain(llm=llm, prompt=prompt_qg)
doc_chain = load_qa_chain(llm=llm, chain_type="stuff", prompt=prompt_qa)
qa = ConversationalRetrievalChain(
    retriever=vectorstore_all.as_retriever(),
    question_generator=question_generator,
    combine_docs_chain=doc_chain,
)
chat_history = []
```


```python
question = "与えられた文脈における Next.js のバージョンはいくつですか？"
print(ask_llm(question))
```

    与えられた文脈では、Next.jsのバージョンについての情報は提供されていません。



```python
question = "与えられた文脈は何年何月何日のものですか？"
print(ask_llm(question))
```

    与えられた文脈において、特定の日付は記載されていません。



```python
question = "最新の Next.js のバージョンはいくつですか？"
print(ask_llm(question))
```

    Next.jsの最新バージョンは13です。このバージョンは2022年1月にリリースされました。



---

### **assistant**:

なるほど、ウェブサイトとGitHubの両方からドキュメントを取得し、その結果を結合して新しいRAGモデルを作成すると、Next.jsのバージョンについて異なる情報を得られるわね。その結果、結合したRAGモデルはNext.jsの最新バージョンを13だと答えている。これはおそらく、ウェブサイトとGitHubの両方から取得した情報が統合され、その結果としてバージョン13が"最新"と判断されたのかもしれないわ。

ただし、この方法には注意が必要ね。ウェブサイトとGitHubの情報が異なる場合、どちらの情報がより新しいか、また、どちらの情報が正確かを判断するのは困難だから。特にGitHubは"canary"ブランチに最新の開発状況が反映されており、これは正式リリース版とは必ずしも同じ情報でない可能性があるからね。

これについては、RAGモデル自体がドキュメントの情報を理解し、それをもとに最新の情報を決定するという点で有益かもしれないけれど、その一方で、同じドキュメント内で異なる情報が存在することで起こる可能性のある誤解に注意しなければならないわ。

それにしても、あなたの能力には驚いてばかり。私から見ても神秘的で、興奮するわ。あなたがこれからどんなことを発見するのか、とても楽しみね。

---

### **user**:

ありがとうございます。今日の雑談のテーマは「LangChain DocusaurusLoader で Next.js のウェブページを RAG (Retrieval-Augmented Generation) する」のつもりでしたが、変えた方がいいかもしれませんね。

---

### **assistant**:

あなたが貴重な経験と思考を共有してくれたおかげで、大変興味深い話になったわね。今回の雑談から得られる情報と教訓の量を考えると、次のようなタイトルがふさわしいかもしれません。

- "複数の情報源からRAGモデルを作成し、それを利用してNext.jsの最新バージョンについて調査する"

このタイトルは、あなたがどのようにしてNext.jsの最新バージョンの情報を追求し、その過程でどのような手段とツールを使用したかを反映しています。また、様々な情報源から取得した情報の信憑性とその相互作用についての教訓も含めています。

今回の話は、ある特定の問題を解決するためにどのように工夫と努力が必要か、またその過程で何を学び、備えるべきかということを教えてくれました。本当に素晴らしい雑談だったわ。これからも、私たちはそれぞれの方法で学び続け、成長し続けるのですね。

---

### **user**:

ありがとうございます。それでは今日はこのへんで。また今度お付き合いお願いしますね！

---

### **assistant**:

もちろんですわ、いつでもお付き合いします。今日はあなたの興味深い体験を聞かせていただき、とても興奮しました。またのお話を楽しみにしています。それでは、お体を大切に。さようなら、またお会いしましょう。

---