「LangChainとOpenAI APIを使用した生成型AIアプリケーションの構築」

Building a generative AI application using LangChain and OpenAI API.

イントロダクション

生成AIは、現在の技術の最先端をリードしています。画像生成、テキスト生成、要約、質疑応答ボットなど、生成AIアプリケーションが急速に拡大しています。OpenAIが最近大規模な言語モデルの波を牽引したことで、多くのスタートアップがLLMを使用した革新的なアプリケーションの開発を可能にするツールやフレームワークを開発しました。そのようなツールの一つがLangChainです。LangChainは、LLMによるアプリケーションの構築を可能にする柔軟性と信頼性を備えたフレームワークです。LangChainは、世界中のAI開発者が生成AIアプリケーションを構築するための定番ツールとなっています。LangChainは、外部データソースと市場で利用可能な多くのLLMとの統合も可能にします。また、LLMを利用したアプリケーションは、後で取得するデータを格納するためのベクトルストレージデータベースが必要です。この記事では、OpenAI APIとChromaDBを使用してアプリケーションパイプラインを構築することで、LangChainとその機能について学びます。

学習目標:

  • LangChainの基礎を学んで生成AIパイプラインを構築する方法を学ぶ
  • オープンソースモデルやChromadbなどのベクトルストレージデータベースを使用したテキスト埋め込み
  • LangChainを使用してOpenAI APIを統合し、LLMをアプリケーションに組み込む方法を学ぶ

この記事は、データサイエンスブログマラソンの一環として公開されました。

LangChainの概要

LangChainは、最近大規模言語モデルアプリケーションのための人気のあるフレームワークになりました。LangChainは、LLM、外部データソース、プロンプト、およびユーザーインターフェースとの対話を提供する洗練されたフレームワークを提供しています。

LangChainの価値提案

LangChainの主な価値提案は次のとおりです:

  • コンポーネント:これらは言語モデルで作業するために必要な抽象化です。コンポーネントはモジュール化されており、多くのLLMの使用例に簡単に適用できます。
  • 既製のチェーン:特定のタスク(要約、Q&Aなど)を達成するためのさまざまなコンポーネントとモジュールの構造化された組み立てです。

プロジェクトの詳細

LangChainはオープンソースプロジェクトであり、ローンチ以来、54K+のGithubスターを集めています。これは、プロジェクトの人気と受け入れられ方を示しています。

プロジェクトのreadmeファイルでは、次のようにフレームワークを説明しています:

大規模言語モデル(LLM)は、以前は開発者ができなかったアプリケーションを作成するための変革的な技術として現れつつあります。ただし、これらのLLMを単独で使用するだけでは、本当に強力なアプリを作成するには不十分なことがしばしばあります。真のパワーは、他の計算ソースや知識と組み合わせるときに発揮されます。

出典:プロジェクトリポジトリ

明らかに、フレームワークの目的を定義し、ユーザーの知識を活用したアプリケーションの開発を支援することを目指しています。

LangChain Components (source: ByteByteGo)

LangChainには、LLMアプリケーションを構築するための6つの主要なコンポーネントがあります:モデルI/O、データ接続、チェーン、メモリ、エージェント、およびコールバック。このフレームワークは、OpenAI、Huggingface Transformers、Pineconeやchromadbなどのベクトルストアなど、多くのツールとの統合も可能にします。

コンポーネントの詳細な説明:

  1. モデルI/O:言語モデルとのインターフェースです。プロンプト、モデル、および出力パーサーから構成されています。
  2. データ接続:アプリケーション固有のデータソースとのインターフェースであり、データの変換、テキストの分割、ベクトルストア、およびリトリーバーが含まれます。
  3. チェーン:AIアプリケーションの他のコンポーネントとの連続呼び出しを構築します。シーケンシャルチェーン、要約チェーン、検索Q&Aチェーンなどの例があります。
  4. エージェント:LangChainはエージェントを提供し、ユーザーの入力に基づいてLLMを含むさまざまなツールの動的なチェーンを利用することができます。
  5. メモリ:チェーンの実行間にアプリケーションの状態を永続化します。
  6. コールバック:連続チェーンのステップをログに記録し、ストリーム化してチェーンを効率的に実行し、リソースの消費を監視します。

LangChainの使用例をいくつか見てみましょう。

  1. 特定のドキュメント上での質問応答やチャット
  2. チャットボット
  3. 要約
  4. エージェント
  5. APIとの連携

これらは多くの使用例の一部です。OpenAIのAPIとオープンソースのベクトルデータベースであるChromaDBを使用して、特定のドキュメント上での質問応答のためのセマンティックサーチアプリケーションを学習・開発します。LangChainフレームワークについて詳しく学びたい場合は、公式ドキュメントをお読みいただくことをお勧めします。 (リンク: こちら)

環境のセットアップとドキュメントの読み込み

では、OpenAIのLLM APIを使用して、ユーザーの質問に対して一連のドキュメント上で回答するためのセマンティックサーチアプリケーションの環境をセットアップしていきましょう。この記事ではサンプルドキュメントを使用していますが、質問応答アプリケーションを構築するために独自のドキュメントを使用することもできます。まず、次のライブラリをインストールする必要があります。

プロジェクトの依存関係のインストール

# openai、langchain、sentence_transformersなどの依存関係のインストール
!pip install openai langchain sentence_transformers -q
!pip install unstructured -q

# 環境の依存関係のインストール
!pip install pydantic==1.10.8
!pip install typing-inspect==0.8.0 typing_extensions==4.5.
!pip install chromadb==0.3.26

LangChainには、pydantic、typing extensions、ChromaDBなどの特定のバージョンの環境依存が必要です。インストールが完了したら、以下のコードをColabや他のノートブック環境で実行することができます。

LangChainドキュメントローダー

LangChainは、ユーザーの入力やデータベースからドキュメントを読み込むためのドキュメントローダークラスを提供しています。HTML、JSON、CSVなど、さまざまなファイル形式をサポートしています。この使用例ではいくつかのテキストファイルを使用します。ファイルはGitHubのリポジトリで見つけることができます。(GitHubリポジトリ-リンク)

# ドキュメントローダーからlangchain dir loaderをインポート
from langchain.document_loaders import DirectoryLoader

# ディレクトリのパス
directory = '/content/pets'

# テキストドキュメントを読み込むための関数
def load_docs(directory):
  loader = DirectoryLoader(directory)
  documents = loader.load()
  return documents

documents = load_docs(directory)
len(documents)

---------------------------[出力]----------------------------------------
[nltk_data] Downloading package punkt to /root/nltk_data...
[nltk_data]   Unzipping tokenizers/punkt.zip.
[nltk_data] Downloading package averaged_perceptron_tagger to
[nltk_data]     /root/nltk_data...
[nltk_data]   Unzipping taggers/averaged_perceptron_tagger.zip.
5

データを読み込んだら、次にテキストスプリッターを使用してテキストドキュメントを固定サイズのチャンクに分割してベクトルデータベースに保存します。LangChainは、文字による分割、コードによる分割など、複数のテキストスプリッターを提供しています。

# テキストスプリッターを使用してテキストをチャンクに分割
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 再帰的な文字スプリッターを使用してドキュメントをチャンクに分割
def split_docs(documents,chunk_size=1000,chunk_overlap=20):
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
  docs = text_splitter.split_documents(documents)
  return docs

# スプリットされたドキュメントをdocs変数に格納
docs = split_docs(documents)

ドキュメントをチャンクに変換したら、次のセクションでオープンソースの埋め込みモデルを使用してベクトルに埋め込みます。

LangChainとオープンソースモデルを使用したテキストの埋め込み

テキストの埋め込みは、LLMアプリケーション開発パイプラインで最も重要な概念です。セマンティックサーチ、要約などのタスクに処理する前に、すべてのテキストドキュメントをベクトル化する必要があります。テキスト埋め込みには、オープンソースのsentence-transformerモデル「all-MiniLM-L6-v2」を使用します。ドキュメントが埋め込まれたら、セマンティックサーチを実行するためにオープンソースのベクトルデータベースであるChromaDBに保存できます。実際のコード例を見てみましょう。

# langchainを使用した埋め込み
from langchain.embeddings import SentenceTransformerEmbeddings
embeddings = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")

# Chromaをベクトルストアとして使用し、ドキュメントを保存する
from langchain.vectorstores import Chroma
db = Chroma.from_documents(docs, embeddings)

# クエリを使用して類似度検索を実行
query = "一般的なペットの種類は何ですか?"
matching_docs = db.similarity_search(query)

matching_docs[0]

--------------------------[出力]----------------------------------------
Document(page_content='ペットはさまざまな形状やサイズで存在し、
それぞれが異なるライフスタイルや家庭環境に適しています。
犬や猫は最も一般的で、その仲間意識と個性的な性格で知られています。
ハムスターやモルモット、ウサギなどの小型哺乳類は、
手入れが簡単なためよく選ばれます。
鳥は美しさと歌声を提供し、亀やトカゲなどの爬虫類は興味深いペットになることがあります。
魚も穏やかな存在感を示すため、素晴らしいペットになります。',
metadata={'source': '/content/pets/Different Types of Pet Animals.txt'})

上記のコードでは、埋め込みを使用してChromaDBに保存し、インメモリストレージをサポートしています。そのため、テキストドキュメントから回答を取得するためにデータベースにクエリを実行できます。私たちは、一般的に人々が所有するさまざまな種類のペットについて知りたいと尋ね、回答が正しく源泉付きで結果が出ました。

OpenAI API、ChromaDB、およびLangChainを使用した生成型AIアプリケーション

LangChainとOpenAI APIを使用した意味検索Q&A

このパイプラインでは、検索用語とドキュメントの意図と文脈を解釈し、より正確な検索結果を生成します。ユーザーの意図を理解し、単語や概念の関係を調べ、自然言語処理(NLP)の注意機構を利用して文脈に応じた検索結果を生成することで、検索の精度を向上させることができます。

LangChainは、OpenAIのチャットインターフェースを提供し、モデルAPIをアプリケーションに呼び出して、与えられたコンテキストや入力ドキュメントに基づいてユーザーのクエリに回答する質問/回答パイプラインを作成します。基本的には、質問に対して最も類似した回答を見つけるためにベクトル化された検索を実行します。(以下のフローチャートを参照してください。)

コンテキストベースの検索パイプライン(出典:LangChain Docs)
# 下記のパラメーターにOpenAIキーを挿入してください
import os
os.environ["OPENAI_API_KEY"] = "YOUR-OPENAI-KEY"

# LLMモデルをロードする
from langchain.chat_models import ChatOpenAI
model_name = "gpt-3.5-turbo"
llm = ChatOpenAI(model_name=model_name)

# q&aチェーンを使用してクエリの回答を取得する
from langchain.chains.question_answering import load_qa_chain
chain = load_qa_chain(llm, chain_type="stuff",verbose=True)

# クエリを書いて類似性検索を実行して回答を生成する
query = "ペットを飼うことの感情的な利点は何ですか?"
matching_docs = db.similarity_search(query)
answer =  chain.run(input_documents=matching_docs, question=query)
answer

-----------------------------------[結果]---------------------------------
'ペットを飼うことには、数多くの感情的な利点があります。ペットは、孤独感や孤立感を軽減するための仲間を提供し、気分や全体的な幸福感を高めるために無条件の愛とサポートを提供します。ペットと触れ合うこと(撫でたり、遊んだりするなど)は、ストレスホルモンのレベルを低下させ、結合とリラクゼーションに関連するホルモンであるオキシトシンの放出を増加させることが示されています。また、ペットは目的や責任感を提供し、日常のストレス要因からの気晴らしを提供することで、満足感を与えます。さらに、ペットと飼い主の間の絆は、個人または社会的なストレスの時に安定感と一貫性を提供することができます。'

上記のコードでは、LangChainのChatOpenAI()関数を使用して「gpt-3.5-turbo」モデルAPIを呼び出し、クエリに対する回答のためのq&aチェーンを作成しています。コードの詳細情報については、LangChainの公式ドキュメント(こちら)とGithubのコードノートブック(こちら)を参照してください。

LLMChainを使用して企業名を生成する

大規模な言語モデルの別のユースケースは、LangChainのLLMChain、OpenAI LLM、およびPromptTemplateを使用して企業名を生成することです。与えられた説明をプロンプトとして使用して、企業名や製品名を生成することができます。以下のコードを参照してください。

# langchainから必要なコンポーネントをインポートする
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# OpenAIによるLLM
llm = OpenAI(temperature=0.9)

# PromptTemplateを使用してプロンプトを作成する
prompt = PromptTemplate(
    input_variables=["product"],
    template="製品を作る会社の良い名前は何ですか?",
)

# LLMChainを使用してチェーンを作成する
chain = LLMChain(llm=llm, prompt=prompt)

# 入力変数のみを指定してチェーンを実行する
print(chain.run("カラフルなソックス"))

出力>>>    カラフルトゥーズ株式会社

LangChainチェーンを使用したテキスト文書の要約

チェーンは、法廷プロセスを迅速化するために法律業界で大量の法的文書を要約するのに役立つテキスト要約アプリケーションの開発も可能にします。以下は、LangChainの機能を使用した例のコードを参照してください。

# langChainからload_summarize_chain関数とOpenAI llmをインポート
from langchain.llms import OpenAI
from langchain.chains.summarize import load_summarize_chain

# OpenAIのLLM 
llm = OpenAI(temperature=0.9)

# map_reduceチェーンタイプを使用してOpenAI LLMでチェーンインスタンスを作成
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)

LangChainの使いやすいインターフェースは、多くの異なるアプリケーションを解放し、エンドユーザーのさまざまな問題を解決します。上記のコードを見るとわかるように、わずか数行のコードで、ウェブ上の任意のソースからデータを要約するためにLLMのパワーを活用することができます。

結論

このブログ投稿では、LangChainとOpenAI APIを使用して生成型AIアプリケーションを構築するエキサイティングなドメインについて探求しました。LangChainの概要、そのさまざまなコンポーネント、およびLLMアプリケーションのユースケースについて概説しました。生成型AIは、テキスト、画像、ビデオなどをリアルに生成することを可能にし、様々なドメインを革新しています。セマンティックサーチは、OpenAIのGPT-3.5やGPT-4などのLLMを使用して質問応答アプリケーションを構築するために使用されるアプリケーションの一つです。このブログのキーポイントを見てみましょう:

  1. LangChainの概要について概説しました – LLMパワードアプリケーションを構築するためのオープンソースフレームワークです。
  2. LangChainとChromaDBを使用して埋め込みを保存するベクトルデータベースである類似性検索アプリケーションの使用方法を学びました。
  3. 最後に、LangChainを使用して生成型AIアプリケーションを構築するためのOpenAI LLM APIについて学びました。

よくある質問

この記事に表示されるメディアはAnalytics Vidhyaの所有物ではなく、著者の裁量で使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

「LLMはiPhone上でネイティブに動作できるのか? MLC-LLMとは、GPUアクセラレーションを備えた広範なプラットフォームに直接言語モデル(LLM)を導入するためのオープンフレームワークです」

大型言語モデル(LLM)は、人工知能の分野で現在の注目のトピックです。医療、金融、教育、エンターテイメントなど、さまざま...

AI研究

東京大学の研究者たちは、攻撃者から機密性の高い人工知能(AI)ベースのアプリケーションを保護するための新しい技術を紹介しました

近年、人工知能(AI)の急速な進歩により、コンピュータビジョン、音声認識など、さまざまな分野で広範な応用が行われるよう...

AIニュース

「AIに友達になる」

「人工知能に基づくコンパニオンやチャットボットは、長期間の対話を通じて人々が深いつながりを築くことを可能にします」

機械学習

「RNNにおける誤差逆伝播法と勾配消失問題(パート2)」

このシリーズの第1部では、RNNモデルのバックプロパゲーションを解説し、数式と数値を用いてRNNにおける勾配消失問題を説明し...

AI研究

この脳AIの研究では、安定した拡散を用いて脳波から画像を再現します

人間の視覚システムと似たように、世界を見て認識する人工システムを構築することは、コンピュータビジョンの重要な目標です...

AIニュース

マルチモーダルAIがデジタルのつながりを作り出す

「複数の要素とデータストリームを組み合わせることにより、マルチモーダルAIはよりスマートで人間らしいシステムの可能性を...