テックブログ

エルカミーの技術ブログです

🦜 LangChainとは?

はじめに


最近では、ChatGPTに大きな注目が集まっています。ChatGPTに聞けば、なんでも答えてくれてとても便利です!文章の要約や、文章の翻訳、プログラミングコードを生成してくれたりと、様々な活用方法があります。現在のままでも、とても便利ですが、LangChainというPythonライブラリと組み合わせることで、ChatGPTの機能をさらに拡張することができます。今回はそんなLangChainについて紹介していきます。

LangChainとは


LangChainは、ChatGPTなどの大規模言語モデル(LLM)を利用して、サービスの開発を行えるPythonライブラリです。LLM単独ではできないことを、外部リソースと組み合わせることで可能にすることができます。ChatGPTを例にどんなことができるか説明していきます!

例:ChatGPT

ChatGPTとても便利ですが弱点もあります。

最新の情報や、専門的な知識がない場合がある
image block

上記のように最新情報(2023年)の内容を反映できません。

誤った出力をする場合がある
image block

「のび太の新日本誕生」というタイトルではなく、正しくは、「新・のび太の日本誕生」でした。

→ LangChainを使えば簡単に解決できる

👌
検索エンジンをChatGPTと組み合わせて、最新情報を反映させて回答させることができる!
👌
専門的な知識などを文書として読み込ませ、その情報をもとに回答させることができる!

LangChainにより、数行のコードでChatGPTの機能を拡張可能になります。

LangChainの機能


LangChainには、様々な便利な機能が提供されています。Models, Prompts, Chains, Indexes, Memory, Agentsの6つの機能に分けられます。

Models

LLM、Chat Model、Text Embedding Modelの3種類のモデルが提供されています。それぞれのモデルで、OpenAI、Cohere、Hugging Faceなど様々なAPIが提供されています。例として、OpenAIモデルを使ってみます。

  • LLM
import os
from langchain.llms import OpenAI

os.environ["OPENAI_API_KEY"]="OpenAI_api_key"
llm = OpenAI(model_name="gpt-3.5-turbo", temperature=0)
print(llm("AIは何の略ですか?"))
AIは人工知能(Artificial Intelligence)の略です。
  • Chat Model
import os
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage

os.environ["OPENAI_API_KEY"]="OpenAI_api_key"
chat = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
message = [HumanMessage(content="ChatGPTとは何ですか?")]
print(chat(message))
content='ChatGPTは、人工知能による自然言語処理技術を使用して、人々が質問や会話をするためのオンラインチャットボットです。ChatGPTは、OpenAIのGPT(Generative Pre-trained Transformer)モデルを使用して、人工知能による自然言語処理を実行し、人々が質問や会話をするための応答を生成します。ChatGPTは、様々なトピックに関する質問や会話に対応するこ とができ、24時間365日、いつでも利用することができます。' additional_kwargs={} example=False
  • Text Embedding Model
import os
from langchain.embeddings import OpenAIEmbeddings
os.environ["OPENAI_API_KEY"]="OpenAI_api_key"
embeddings = OpenAIEmbeddings()
Prompts

LLMに入力するテキストを管理することができます。

プロンプトの中にユーザーが入力したいことを埋め込めるようにテンプレート機能があり、とても便利です。

from langchain import PromptTemplate
template = """
与えられたサッカー選手の情報を出力してください。ただし必ず以下のように出力してください。
・ 身長
・ 体重
・ 国籍
・ 所属チーム
・ ポジション
サッカー選手の名前: {player_name}"""
 prompt = PromptTemplate(
    input_variables=["player_name"],
    template=template,
)

上記のようにテンプレートを作成できます。

input_variables=["player_name"]では、インプットに何を入力すればよいのか決めることができます。今回はサッカー選手の名前がインプットとして設定されています。

ユーザーは、サッカー選手の名前をインプットとして渡すだけで、templateに書かれた質問をすることができます。

何回も同じ内容を質問するときはテンプレートを使うと便利ですね!

後ほどこちらのテンプレートを使って、回答を生成していきます。

Chains

Chainsによって、複数のコンポーネントを組み合わせて、1つのアプリケーションを作成することができます。

たとえば、PromptのテンプレートとLLMをチェーンすることができたり、複数のチェーンを組み合わせることで、より複雑なチェーンを構築したり、他のコンポーネントと組み合わせることもできます。

実際にやってみます!

例1)LLMとプロンプトのテンプレートをチェインする

先ほど作成したテンプレートを使って、チェインをしてみます。

import os
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate
from langchain.chains import LLMChain

os.environ["OPENAI_API_KEY"]="OpenAI_api_key"
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
template = """
与えられたサッカー選手の情報を出力してください。ただし必ず以下のように出力してください。
・ 身長
・ 体重
・ 国籍
・ 所属チーム
・ ポジション
サッカー選手の名前: {player_name}"""
 prompt = PromptTemplate(
    input_variables=["player_name"],
    template=template,
)
chain = LLMChain(llm=llm, prompt=prompt)
chain.run("Lionel Messi")
身長: 170cm
体重: 72kg
国籍: アルゼンチン
所属チーム: パリ・サンジェルマン
ポジション: フォワード
例2)チェインしたもの同士をチェインする

今回は、日本の情報を受け取り、その情報からキャッチフレーズを考えてもらいました。

import os
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate
from langchain.chains import LLMChain
from langchain.chains import SimpleSequentialChain

os.environ["OPENAI_API_KEY"]="OpenAI_api_key"
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
template = """
与えられた国の情報を簡潔に出力してください。100文字以内でお願いします。
国の名前: {country_name}"""
prompt = PromptTemplate(
    input_variables=["country_name"],
    template=template,
)
chain = LLMChain(llm=llm, prompt=prompt)

second_template = """
与えられた国の情報から、その国のキャッチフレーズを1つ考えてください
国の情報: {country_information}"""
second_prompt = PromptTemplate(
    input_variables=["country_information"],
    template=second_template,
)
second_chain = LLMChain(llm=llm, prompt=second_prompt)

overall_chain = SimpleSequentialChain(chains=[chain, second_chain], verbose=True)
catchphrase = overall_chain.run("Japan")
> Entering new SimpleSequentialChain chain...
日本は、アジア東部に位置する島国で、人口は約12600万人。首都は東京で、政治制度は立憲君主制。経済は世界有数の先進国で、自動車や
電子機器などの製造業が主力。文化的には、和食や茶道、武道などが代表的。世界遺産には、富士山や古都京都などがある。
「日本、伝統と革新の融合の国」

> Finished chain.
「日本、伝統と革新の融合の国」

上記の例以外にも、様々なChainの仕方があります。公式ドキュメントを見てみてください!

Indexes

Indexesは、LLMがドキュメントとやり取りできるようにするためにドキュメントを構造化するものです。

例えば、専門的な情報を読み込み、Indexesにより構造化することで、LLMを利用できるようにすることができます

デフォルトでは、ChromaをVectorStoreとして使用するので、インストールをします。

pip install chromadb

今回はテキストデータを読み込んで、その内容とやり取りをしていきます。読み込むテキストファイルは走れメロスの話です。

from langchain.document_loaders import TextLoader
from langchain.indexes import VectorstoreIndexCreator
from langchain.indexes.vectorstore import VectorStoreIndexWrapper

loader = TextLoader('hashire_merosu.txt', encoding='utf8')
index = VectorstoreIndexCreator().from_loaders([loader])
index: VectorStoreIndexWrapper = VectorstoreIndexCreator().from_loaders([loader])
query = "please summarize"
print(index.query(query))
Using embedded DuckDB without persistence: data will be transient
 メロスは、友のセリヌンティウスを救おうと、深夜から走り続け、太陽が沈む前にシラクスの市の塔楼まで走り切り、セリヌンティウスを救おうとしましたが、間に合わずに死刑を受けたことを知ります。しかし、メロ
スは正義の士として死ぬことができると信じて、最後まで走り続けました。
Memory

チャットボットなどを実現するためには前段階の状態を記憶しておく必要があります。しかし、デフォルトではステートレスです。

そこで、Memory機能を使えば、Chatとの会話の内容を記憶することができます。

実際にやってみます!

import os
from langchain.chains import ConversationChain
from langchain.llms import OpenAI
from langchain.memory import ConversationBufferMemory

os.environ["OPENAI_API_KEY"]="OpenAI_api_key"
llm = OpenAI(temperature=0)
conversation = ConversationChain(
    llm=llm, 
    verbose=True, 
    memory=ConversationBufferMemory()
)
conversation.predict(input="AIとは何ですか?")
print(conversation.predict(input="その内容を簡潔に要約してください。"))
> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.

Current conversation:
Human: AIとは何ですか?
AI:  AIとは人工知能のことです。AIは、コンピューターを使用して人間のようなタスクを実 行するために設計されたプログラムです。AIは、自然言語処理、画像認識、ロボット技術など、さまざまな分野で使用されています。
Human: その内容を簡潔に要約してください。
AI:

> Finished chain.
 AIは、コンピューターを使用して人間のようなタスクを実行するために設計されたプログラ ムです。AIは、自然言語処理、画像認識、ロボット技術など、さまざまな分野で使用されています。

前文の内容を保持し、要約をすることができていますね!

Agents

入力に応じて、適切なツールを使って回答を生成することができます。

例えば、2023年のWBCの結果が知りたい場合を考えてみます。Agentにより、Google 検索をツールとして持たせれば、Googleで足りない情報を検索して回答を出してくれるようになります。

他にもツールはたくさんあります。

今回は実際にGoogle検索を使って、実践してみます。

import os
from langchain.chat_models import ChatOpenAI
from langchain.agents import load_tools
from langchain.agents import initialize_agent

os.environ["OPENAI_API_KEY"]="OpenAI_api_key"
os.environ["GOOGLE_API_KEY"] = "GOOGLE_API_KEY"
os.environ["GOOGLE_CSE_ID"] = "GOOGLE_CSE_ID"
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
tools = load_tools(["google-search"], llm=llm)
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
agent.run("2023年のWBCの優勝国は?")
> Entering new AgentExecutor chain...

I need to search for information
 about the World Baseball Classic (WBC) and its future events.
Action: Google Search
Action Input: "2023 World Baseball Classic winner"
Observation: Mar 21, 2023 ... Ja
pan tops Team USA in dramatic finish to claim 3rd Classic title ... MIAMI -- In the end, it all came down to Shohei Ohtani vs. Mike Trout. The ... The game was played on March 21, 
2023, at LoanDepot Park in Miami, Florida, United States, between hosts and defending champion United States and two-time ... Mar 22, 2023 ... The 2023 World Baseball Classic came 
to a close with a thriller on Tuesday as Japan took down Team USA 3-2 to win the title. Japan won their record-extending third title after defeating defending champions United States 32 in the championship game, becoming the second team since the ... Mar 21, 2023 ... 2023 World Baseball Classic scores, WBC results, bracket: Japan beats USA in championship game ... The 2023 World Baseball Classic wrapped up ... WBSC accepted the suggestion after 
an executive meeting, giving the "World Champion" title to the WBC winner on the condition that the Classic should have ... Mar 21, 2023 ... The 2023 World Baseball Classic wrapped up Tuesday night with Shohei Ohtani and Japan holding off the United States in the championship game ... Get World Baseball Classic (WBC) 2023 news, highlights, schedule, scores, 
standings, bracket & more. World Baseball Classic prize money breakdown: How much do the winners make in 2023? Author Photo. David Suggs. 03/21/20233 min read. (Getty Images). Mar 23, 2023 ... World Baseball Classic 2023: 
All results, scores and standings - complete 
list ; Host venue: Taichung Intercontinental 
Baseball Stadium, Taichung.
Thought:Based on the Google Sear
ch results, Japan won the 2023 World Baseball Classic.
Final Answer: Japan.

Google検索を用いて、足りない最新情報を取ってくることができています。その情報をもとに解答することが可能です。

まとめ


今回は、LangChainがどのようなものなのか紹介していきました。LangChainはModels, Prompts, Chains, Indexes, Memory, Agentsと6種類の機能があります。これらの機能には、紹介しきれていない便利な機能があるのでぜひ触ってみてください!

参考