2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LangChain入門:AIアプリケーション開発の新時代

Last updated at Posted at 2024-11-05

はじめに

人工知能(AI)の世界は日々進化を続けており、その中でもLangChainは大きな注目を集めています。LangChainは、大規模言語モデル(LLM)を活用したアプリケーション開発を効率化するためのフレームワークです。本記事では、LangChainの基本から応用まで、15の章を通じて詳しく解説していきます。

記事に新しい章を追加し、LangChainのインストールについて説明します。以下は、既存の記事構成に合わせた新しい章の提案です。

はじめに②LangChainのインストールと環境設定

LangChainを使用するには、まず適切にインストールし、環境を設定する必要があります。以下に、インストール手順と基本的な環境設定を説明します。

LangChainは、Pythonのパッケージマネージャーであるpipを使用して簡単にインストールできます。以下のコマンドを実行してください:

pip install langchain

OpenAIのAPIを使用する場合は、追加で以下のパッケージもインストールしてください:

pip install openai

環境変数の設定

LangChainを使用する際、特に外部APIを利用する場合は、適切な環境変数を設定する必要があります。例えば、OpenAIのAPIキーを設定するには以下のようにします:

import os
os.environ["OPENAI_API_KEY"] = "あなたのOpenAI APIキー"

セキュリティ上の理由から、APIキーを直接コードに記述するのではなく、環境変数として設定することをお勧めします。

基本的な使用例

インストールと環境設定が完了したら、以下のような簡単なコードでLangChainの動作を確認できます:

from langchain.llms import OpenAI

llm = OpenAI(temperature=0.9)
text = "What would be a good company name for a company that makes colorful socks?"
print(llm(text))

このコードは、OpenAIのモデルを使用して、カラフルな靴下を製造する会社の名前を生成します。

注意点

  • LangChainは活発に開発が進められているため、定期的に最新バージョンにアップデートすることをお勧めします。
  • 使用するAPIやサービスによっては、追加のパッケージのインストールや設定が必要な場合があります。
  • APIの使用には料金が発生する場合があるため、利用規約と料金体系を確認してください。

以上の手順で、LangChainを使用するための基本的な環境が整います。

第1章:LangChainとは

LangChainは、AIアプリケーション開発を簡素化するためのオープンソースライブラリです。大規模言語モデル(LLM)を中心に、様々なAI関連のタスクを効率的に実行するためのツールセットを提供しています。

from langchain import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

# LangChainの基本的な使用例
llm = OpenAI(temperature=0.9)
prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)
chain = LLMChain(llm=llm, prompt=prompt)

# 製品名を入力して会社名を生成
print(chain.run("eco-friendly water bottles"))

第2章:LangChainの主要コンポーネント

LangChainは、モデル、プロンプト、メモリ、チェーン、エージェントなど、複数の重要なコンポーネントで構成されています。これらのコンポーネントを組み合わせることで、複雑なAIアプリケーションを構築できます。

from langchain.prompts import (
    ChatPromptTemplate,
    MessagesPlaceholder,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate
)
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory

# チャットプロンプトの作成
prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template("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."),
    MessagesPlaceholder(variable_name="history"),
    HumanMessagePromptTemplate.from_template("{input}")
])

# メモリの設定
memory = ConversationBufferMemory(return_messages=True)

# 会話チェーンの作成
conversation = ConversationChain(
    memory=memory,
    prompt=prompt,
    llm=ChatOpenAI(temperature=0)
)

# 会話の実行
print(conversation.predict(input="Hi there!"))

第3章:プロンプトエンジニアリング

プロンプトエンジニアリングは、LangChainを使用する上で非常に重要な概念です。適切なプロンプトを設計することで、AIモデルからより正確で有用な回答を得ることができます。

from langchain import PromptTemplate

# プロンプトテンプレートの作成
template = """
You are a helpful assistant that translates {input_language} to {output_language}.

Translate the following text:
{text}

Translation:
"""

prompt = PromptTemplate(
    input_variables=["input_language", "output_language", "text"],
    template=template
)

# プロンプトの使用
print(prompt.format(input_language="English", output_language="French", text="Hello, how are you?"))

第4章:チェーンの構築

チェーンは、LangChainの中核的な概念の1つです。複数のコンポーネントを連結して、より複雑なタスクを実行することができます。

from langchain.chains import SimpleSequentialChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

# LLMの初期化
llm = OpenAI(temperature=0.7)

# 最初のチェーン:製品のアイデアを生成
first_prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)
chain_one = LLMChain(llm=llm, prompt=first_prompt)

# 二番目のチェーン:会社の説明を生成
second_prompt = PromptTemplate(
    input_variables=["company_name"],
    template="Write a catchphrase for the following company: {company_name}",
)
chain_two = LLMChain(llm=llm, prompt=second_prompt)

# チェーンの連結
overall_chain = SimpleSequentialChain(chains=[chain_one, chain_two], verbose=True)

# チェーンの実行
print(overall_chain.run("eco-friendly water bottles"))

第5章:メモリの活用

メモリコンポーネントを使用することで、会話の文脈を保持し、より自然な対話を実現することができます。

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

# メモリの初期化
memory = ConversationBufferMemory()

# 会話チェーンの作成
conversation = ConversationChain(
    llm=OpenAI(temperature=0),
    memory=memory,
    verbose=True
)

# 会話の実行
print(conversation.predict(input="Hi, my name is Alice"))
print(conversation.predict(input="What's my name?"))
print(conversation.predict(input="What have we talked about so far?"))

第6章:ドキュメント検索と質問応答

LangChainを使用して、大量のドキュメントから情報を検索し、質問に答えるシステムを構築することができます。

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA

# テキストの準備
with open('your_document.txt', 'r') as file:
    raw_text = file.read()

# テキストの分割
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_text(raw_text)

# ベクトルストアの作成
embeddings = OpenAIEmbeddings()
docsearch = Chroma.from_texts(texts, embeddings, metadatas=[{"source": str(i)} for i in range(len(texts))])

# 質問応答チェーンの作成
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=docsearch.as_retriever())

# 質問の実行
query = "What is the main topic of this document?"
print(qa.run(query))

第7章:エージェントの活用

エージェントは、LangChainの中でも特に強力な機能の1つです。複数のツールを組み合わせて、より複雑なタスクを自律的に実行することができます。

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI

# LLMの初期化
llm = OpenAI(temperature=0)

# ツールの読み込み
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# エージェントの初期化
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

# エージェントの実行
agent.run("What was the high temperature in SF yesterday in Fahrenheit? What is that number raised to the .023 power?")

第8章:外部APIとの連携

LangChainを使用して、外部APIと連携することで、より豊富な情報源を活用したAIアプリケーションを構築できます。

from langchain.utilities import OpenWeatherMapAPIWrapper
from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI

# OpenWeatherMap APIの初期化
weather = OpenWeatherMapAPIWrapper()

# ツールの定義
tools = [
    Tool(
        name="Weather",
        func=weather.run,
        description="useful for when you need to answer questions about the weather"
    )
]

# エージェントの初期化
agent = initialize_agent(tools, OpenAI(temperature=0), agent="zero-shot-react-description", verbose=True)

# エージェントの実行
agent.run("What's the weather like in Tokyo right now?")

第9章:テキスト要約

LangChainを使用して、長文のテキストを効率的に要約することができます。

from langchain.chains.summarize import load_summarize_chain
from langchain.llms import OpenAI
from langchain.docstore.document import Document

# テキストの準備
text = """
LangChain is a framework for developing applications powered by language models. It enables applications that:
Are context-aware: connect a language model to sources of context (prompt instructions, few shot examples, content to ground its response in, etc.)
Reason: rely on a language model to reason (about how to answer based on provided context, what actions to take, etc.)
"""

# ドキュメントの作成
docs = [Document(page_content=text)]

# 要約チェーンの作成
chain = load_summarize_chain(OpenAI(temperature=0), chain_type="stuff")

# 要約の実行
print(chain.run(docs))

第10章:感情分析

LangChainを使用して、テキストの感情分析を行うことができます。

from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
from langchain.chains import LLMChain

# プロンプトテンプレートの作成
template = """
Analyze the sentiment of the following text:

Text: {text}

Sentiment (positive/negative/neutral):
"""

prompt = PromptTemplate(
    input_variables=["text"],
    template=template
)

# チェーンの作成
chain = LLMChain(llm=OpenAI(temperature=0), prompt=prompt)

# 感情分析の実行
text = "I love using LangChain for AI development. It's so powerful and easy to use!"
print(chain.run(text))

第11章:多言語対応

LangChainを使用して、多言語対応のアプリケーションを構築することができます。

from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage

chat = ChatOpenAI(temperature=0)

messages = [
    SystemMessage(content="You are a helpful assistant that translates English to Japanese."),
    HumanMessage(content="Translate the following English text to Japanese: 'Hello, how are you?'")
]

print(chat(messages).content)

messages.append(HumanMessage(content="Now translate this to French: 'I love programming'"))

print(chat(messages).content)

第12章:カスタムツールの作成

LangChainでは、独自のカスタムツールを作成して、エージェントに組み込むことができます。

from langchain.agents import Tool, AgentExecutor, LLMSingleActionAgent
from langchain.prompts import StringPromptTemplate
from langchain import OpenAI, SerpAPIWrapper, LLMChain
from typing import List, Union
from langchain.schema import AgentAction, AgentFinish

# カスタムプロンプトテンプレート
class CustomPromptTemplate(StringPromptTemplate):
    template: str
    tools: List[Tool]
    
    def format(self, **kwargs) -> str:
        intermediate_steps = kwargs.pop("intermediate_steps")
        thoughts = ""
        for action, observation in intermediate_steps:
            thoughts += action.log
            thoughts += f"\nObservation: {observation}\nThought: "
        kwargs["agent_scratchpad"] = thoughts
        kwargs["tools"] = "\n".join([f"{tool.name}: {tool.description}" for tool in self.tools])
        kwargs["tool_names"] = ", ".join([tool.name for tool in self.tools])
        return self.template.format(**kwargs)

# カスタムツールの定義
def random_word(word: str) -> str:
    return f"A random word related to {word} is: example"

# ツールの設定
search = SerpAPIWrapper()
tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to answer questions about current events"
    ),
    Tool(
        name = "RandomWord",
        func=random_word,
        description="useful for when you need a random word related to a given word"
    )
]

# プロンプトテンプレートの設定
prompt = CustomPromptTemplate(
    template="Answer the following questions as best you can. You have access to the following tools:\n\n{tools}\n\nUse the following format:\n\nQuestion: the input question you must answer\nThought: you should always think about what to do\nAction: the action to take, should be one of [{tool_names}]\nAction Input: the input to the action\nObservation: the result of the action\n... (this Thought/Action/Action Input/Observation can repeat N times)\nThought: I now know the final answer\nFinal Answer: the final answer to the original input question\n\nBegin!\n\nQuestion: {input}\nThought:{agent_scratchpad}",
    tools=tools,
)

# 出力パーサーの設定
class CustomOutputParser:
    def parse(self, llm_output: str) -> Union[AgentAction, AgentFinish]:
        if "Final Answer:" in llm_output:
            return AgentFinish(
                return_values={"output": llm_output.split("Final Answer:")[-1].strip()},
                log=llm_output,
            )
        regex = r"Action: (.*?)\nAction Input: (.*)"
        match = re.search(regex, llm_output, re.DOTALL)
        if not match:
            raise ValueError(f"Could not parse LLM output: `{llm_output}`")
        action = match.group(1).strip()
        action_input = match.group(2).strip()
        return AgentAction(tool=action, tool_input=action_input, log=llm_output)

output_parser = CustomOutputParser()

# LLMチェーンの作成
llm = OpenAI(temperature=0)
llm_chain = LLMChain(llm=llm, prompt=prompt)

# エージェントの作成
tool_names = [tool.name for tool in tools]
agent = LLMSingleActionAgent(
    llm_chain=llm_chain, 
    output_parser=output_parser,
    stop=["\nObservation:"], 
    allowed_tools=tool_names
)

# エージェントの実行
agent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, verbose=True)
agent_executor.run("What's a random word related to 'programming'?")

第13章:データベース統合

LangChainを使用して、データベースと統合し、構造化されたデータに基づいて質問に答えるシステムを構築できます。

from langchain import OpenAI, SQLDatabase, SQLDatabaseChain

# データベースの接続
db = SQLDatabase.from_uri("sqlite:///chinook.db")

# LLMの初期化
llm = OpenAI(temperature=0)

# データベースチェーンの作成
db_chain = SQLDatabaseChain(llm=llm, database=db, verbose=True)

# クエリの実行
query = "How many tracks are there in the album with ID 1?"
print(db_chain.run(query))

第14章:音声認識と合成

LangChainを使用して、音声認識と音声合成を組み込んだアプリケーションを作成できます。

from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
import speech_recognition as sr
import pyttsx3

# 音声認識の設定
recognizer = sr.Recognizer()

# 音声合成の設定
engine = pyttsx3.init()

# LLMチェーンの設定
llm = OpenAI(temperature=0.7)
prompt = PromptTemplate(
    input_variables=["query"],
    template="You are a helpful assistant. Answer the following query: {query}"
)
chain = LLMChain(llm=llm, prompt=prompt)

# 音声認識
with sr.Microphone() as source:
    print("Speak your question:")
    audio = recognizer.listen(source)

try:
    # 音声をテキストに変換
    query = recognizer.recognize_google(audio)
    print(f"You said: {query}")

    # LLMで回答を生成
    response = chain.run(query)
    print(f"AI response: {response}")

    # 回答を音声で出力
    engine.say(response)
    engine.runAndWait()

except sr.UnknownValueError:
    print("Sorry, I couldn't understand that.")
except sr.RequestError as e:
    print(f"Could not request results; {e}")

第15章:LangChainのベストプラクティスと最適化

LangChainを効果的に使用するためのベストプラクティスと、パフォーマンスを最適化するためのテクニックを紹介します。

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.cache import InMemoryCache
import langchain
import time

# キャッシュの設定
langchain.llm_cache = InMemoryCache()

# LLMの初期化(低温度設定で一貫性を向上)
llm = OpenAI(temperature=0.1)

# プロンプトテンプレートの最適化
template = """
You are an AI assistant specialized in {topic}.
Please provide a concise answer to the following question:
Question: {question}
Answer:
"""

prompt = PromptTemplate(
    input_variables=["topic", "question"],
    template=template
)

# チェーンの作成
chain = LLMChain(llm=llm, prompt=prompt)

# パフォーマンス測定
start_time = time.time()

# 複数回の実行(キャッシュの効果を確認)
for _ in range(5):
    response = chain.run(topic="Python programming", question="What is a list comprehension?")
    print(response)

end_time = time.time()
print(f"Execution time: {end_time - start_time} seconds")

# エラーハンドリングの例
try:
    invalid_response = chain.run(topic="Invalid topic", question="This will cause an error")
except Exception as e:
    print(f"An error occurred: {e}")
    # ここでエラーログを記録したり、フォールバックの処理を行ったりします

# リソースの解放
del llm
del chain

以上が、LangChainに関する15章構成の記事です。各章で、LangChainの主要な機能と概念を詳しく解説し、実践的なコード例を提供しました。この記事を通じて、読者がLangChainの基本から応用まで幅広く理解し、自身のAIアプリケーション開発に活用できるようになることを願っています。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?