nakaoka3の技術ブログ

2023年中に52本なにか書きます

週末にLangChainを使って遊んでみた / DocumentLoader / Jupyter code cells

週末にLangChainを使って遊んでみた。LangChainはLLMを便利に使うためのPythonライブラリだ。先日動画で使い方を学んだので、それを参考にLLMが外部のデータを参照して質問に答えるのを試した。

nakaoka3.hatenablog.com

DocumentLoader

LanChainにはLoaderというものがあって、テキストファイルやCSVやPDFなどのファイルをロードすることができる。VectorstoreIndexCreatorというクラスを使ってLoaderを渡してインデックスを作ることができる。VectorstoreIndexCreatorはデータのインデックスを作りLLMがそれを利用できるようにするためのもののようだ。

走れメロス』の全文のテキストをロードしてインデックスを作り、小説の内容について質問したところ、以下のように小説の内容を参照しているような答えが返ってきた。一見それらしい返答だが、国語のテストだったら満点は取れなさそうだ。

走れメロス』について質問した

メロスは走ったのは、友人のセリヌンティウスが死刑になるという情報を聞き、彼を助けるために刑場に間に合おうとしたからです

死刑になったのメロスだよね。

python.langchain.com

ファイル以外にも、サードパーティのLoaderを使うことで、WikipeidaやNotionのDBなどをロードできる。WikipediaLoaderを試してみた。

from langchain.document_loaders import WikipediaLoader
from langchain.indexes import VectorstoreIndexCreator
from IPython.display import display, Markdown
from langchain.vectorstores import DocArrayInMemorySearch
from langchain.chat_models import ChatOpenAI
# Wikipedia Loader
# see https://python.langchain.com/docs/integrations/document_loaders/wikipedia
loader = WikipediaLoader(query="HUNTER X HUNTER", load_max_docs=2, lang="ja")
llm = ChatOpenAI(temperature=0.0)
index = VectorstoreIndexCreator(
    vectorstore_cls=DocArrayInMemorySearch
).from_loaders([loader])
# %%
display(Markdown(index.query("ハンターハンターの主人公の目的は何?", llm=llm)))
# %%
display(Markdown(index.query("アニメの放送開始日はいつ?", llm=llm)))
# %%
display(Markdown(index.query("最初にアニメ化されたアニメ作品が放送開始されたのはいつ?", llm=llm)))

Wikipediaの情報を元にした答えを返すことが確認できた。

WikipediaLoaderを使って参照した情報をもとに質問に答えている様子

Document loaders | 🦜️🔗 Langchain Wikipedia | 🦜️🔗 Langchain

VSCodeのJupyter code cells

ちなみに、上記のスクリーンショットのように VSCodePythonのコードに # %% というコメントで区切りを入れると、Jupyter Notebookのセル単位で実行するように# %%で区切られたブロックごとに実行できる。週末に知ったのだが、これが便利だった。Jupyter NotebookよりもVSCodeのほうがエディタとして使いやすいし、コードの管理もしやすくなる。

これは Jupyter code cells という名前の機能のようだった。おすすめです。

code.visualstudio.com

LangChainの機能はまだまだこんなものじゃないので、もうちょっと頑張ってLLMを使った気の利いたアプリケーションを自分向けにつくって遊んでみたい。