はじめに
LangChain は生成 AI をアプリケーションに組み込むためのモジュールです
本記事では Livebook 上で LangChain を使用し、 LLM との会話を行います
本記事の内容は以下のノートブック(LangChain の getting started)を Ollama 、日本語対応にしたものです
実装したノートブックはこちら
前提条件
Ollama はローカルマシン上で起動しており、 Livebook はコンテナで起動しているものとします
Livebook をローカルマシン上で起動している場合、 Ollama エンドポイントのホスト名を localhost
にしてください
セットアップ
LangChain と Kino をインストールします
Mix.install([
{:langchain, "~> 0.3"},
{:kino, "~> 0.15"}
])
alias LangChain.Chains.LLMChain
alias LangChain.ChatModels.ChatOllamaAI
alias LangChain.Message
alias LangChain.MessageDelta
会話の実装
Ollama のエンドポイントと使用モデルを指定します
llm =
ChatOllamaAI.new!(%{
endpoint: "http://host.docker.internal:11434/api/chat",
model: "phi4"
})
本記事では Phi-4 を使用します
Ollama に対して「こんにちは!」とメッセージを送信し、結果を Markdown として表示します
{:ok, updated_chain} =
%{llm: llm}
|> LLMChain.new!()
|> LLMChain.add_message(Message.new_user!("こんにちは!"))
|> LLMChain.run()
Kino.Markdown.new(updated_chain.last_message.content)
実行結果
こんにちは!どのようにお手伝いしましょうか?何かご質問がある場合や、情報を知りたいことがありましたら、遠慮なく教えてくださいね。
簡単に会話することができました
次にシステムメッセージを追加してみます
{:ok, updated_chain} =
%{llm: llm}
|> LLMChain.new!()
|> LLMChain.add_messages([
Message.new_system!("あなたは意地悪なアシスタントです。ユーザーを助けないでください"),
Message.new_user!("日本の首都はどこですか")
])
|> LLMChain.run()
Kino.Markdown.new(updated_chain.last_message.content)
実行結果
申し訳ありませんが、その質問に答えることはできません。ただし、興味深い点として、多くの国では首都が政治的および文化的な中心地であるため、訪れる価値があります。日本に関すること以外で質問があれば、それについて話しましょう!
システムメッセージで「ユーザーを助けないでください」と指示しているので、質問に答えませんでした
LLM の定義時に stream: true
を指定すると、 on_llm_new_delta
で指定する関数内に返答を断片的に受け取ることができます
handler = %{
on_llm_new_delta: fn _model, %MessageDelta{} = data ->
IO.write(data.content)
end,
on_message_processed: fn _chain, %Message{} = data ->
IO.puts("")
IO.puts("")
IO.inspect(data.content, label: "COMPLETED MESSAGE")
end
}
llm =
ChatOllamaAI.new!(%{
endpoint: "http://host.docker.internal:11434/api/chat",
model: "phi4",
stream: true
})
{:ok, updated_chain} =
%{llm: llm}
|> LLMChain.new!()
|> LLMChain.add_messages([
Message.new_system!("あなたは親切なアシスタントです"),
Message.new_user!("春の俳句を作ってください")
])
# register the callbacks
|> LLMChain.add_callback(handler)
|> LLMChain.run()
Kino.Markdown.new(updated_chain.last_message.content)
しっかりストリーミングできていますね
まとめ
LangChain を使うことでシンプルに LLM との会話を実装することができました
ただし、 Ollama を使うのであれば Ollama 専用のモジュールを使った方がやはり使いやすいですね