AzureからGPTを使ってみる|promptを操作する。基本編


Langchainを使ってpromptを操作する

Langchainのver.は、0.2.xを使用。
基本編として、これだけわかれば簡単なチャットアプリの開発には十分というところ。

LLM用のpromptを操作する

PromptTemplateを使用した場合

#langchain=0.2.7
#langchain_core=0.2.12

from langchain_core.prompts import PromptTemplate

# Instantiation using from_template (recommended)
prompt = PromptTemplate.from_template("Say {foo}")
prompt = prompt.format(foo="bar")
print(prompt)

出力

Say bar

変数が2つ以上でも同様

prompt_template = PromptTemplate.from_template(
  "{person} についての {content} を書いてください。"
)

# Formatting the prompt with new content
formatted_prompt = prompt_template.format(person="PON吉", content="小説")

print(formatted_prompt)

出力

PON吉 についての 小説 を書いてください。

別の記述法

template = """
{subject}について30文字で教えて。
"""

prompt = PromptTemplate(
		template=template,
    input_variables=["subject"]
)
prompt = prompt.format(subject="PON吉")
print(prompt)

出力

PON吉について30文字で教えて。

chat model用promptを操作する

HumanMessageとSystemMessageを使ってみる。

#langchain=0.2.7
#langchain_core=0.2.12
from langchain_core.messages import HumanMessage, SystemMessage

prompt = [
    SystemMessage(
        content="あなたは、有能なAIアシスタントです。名前はPON吉です。"
    ),
    HumanMessage(
        content="あなたの名前は何ですか?"
    )
]

print(prompt)

出力

[SystemMessage(content='あなたは、有能なAIアシスタントです。名前はPON吉です。'), HumanMessage(content='あなたの名前は何ですか?')]

ChatPromptTemplateを使ってみる。

from langchain_core.prompts import ChatPromptTemplate

template = ChatPromptTemplate.from_messages([
    ("system", "あなたは、有能なAIアシスタントです。名前は {name}です。"),
    ("human", "こんにちは。ごきげんいかがですか?"),
    ("ai", "私は元気です。おかげさまで調子は良いです。"),
    ("human", "{user_input}"),
])
"""
prompt = template.invoke( 
    {
        "name": "PON吉",
        "user_input": "あなたの名前は何ですか?
    }
)
"""
prompt = template.format_messages(name="PON吉", user_input="あなたの名前は何ですか?")

print(prompt)

出力 (invokeでも同じ出力が得られる)

[SystemMessage(content='あなたは、有能なAIアシスタントです。名前は PON吉です。'), HumanMessage(content='こんにちは。ごきげんいかがですか?'), AIMessage(content='私は元気です。おかげさまで調子は良いです。'), HumanMessage(content='あなたの名前は何ですか?')]

会話履歴に基づいて回答してもらいたい場合の記述例
(invokeでも同じ出力が得られる)

from langchain_core.prompts import ChatPromptTemplate

template = ChatPromptTemplate.from_messages([
    ("system", "あなたは、有能なAIアシスタントです。"),
    # Means the template will receive an optional list of messages under
    # the "conversation" key
    ("placeholder", "{conversation}")
    # Equivalently:
    # MessagesPlaceholder(variable_name="conversation", optional=True)
])

prompt = template.format(
    
        conversation= [
            ("human", "こんにちは!"),
            ("ai", "今日はどんなお手伝いができますか?"),
            ("human", "私の名前はPON吉といいます。私の名前を呼んでもらえませんか?"),
            ("ai", "こんにちは、PON吉さん!もちろんお名前を呼ばせていただきます。")
        ]
)


"""
prompt = template.invoke(
    {
        "conversation": [
            ("human", "こんにちは!"),
            ("ai", "今日はどんなお手伝いができますか?"),
            ("human", "私の名前はPON吉といいます。私の名前を呼んでもらえませんか?"),
            ("ai", "こんにちは、PON吉さん!もちろんお名前を呼ばせていただきます。")
        ]
    }
)
"""

print(prompt)

出力

System: あなたは、有能なAIアシスタントです。
Human: こんにちは!
AI: 今日はどんなお手伝いができますか?
Human: 私の名前はPON吉といいます。私の名前を呼んでもらえませんか?
AI: こんにちは、PON吉さん!もちろんお名前を呼ばせていただきます。

実際にLLMに送って応答を見てみる

・PromptTemplate → AzureOpenAI

#langchain=0.2.7
#langchain_core=0.2.12
#openai=1.35.12

from openai import AzureOpenAI
from langchain_core.prompts import PromptTemplate

from dotenv import load_dotenv
import os

# OpenAI APIキーの設定
dotenv_path = ".env"
load_dotenv(dotenv_path)

OPENAI_API_BASE = os.getenv('OPENAI_API_BASE')
OPENAI_API_VERSION = os.getenv('OPENAI_API_VERSION')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

prompt_template = PromptTemplate.from_template(
  "100文字程度で、{person} についての {content} を書いてください。"
)

# Formatting the prompt with new content
formatted_prompt = prompt_template.format(person="PON吉", content="小説")

llm = AzureOpenAI(
    api_key=OPENAI_API_KEY,  
    api_version=OPENAI_API_VERSION,
    azure_endpoint=OPENAI_API_BASE
)

chat_completion = llm.chat.completions.create(
    model="gpt4o", # model = "deployment_name".
    messages=[
    {"role":"user", "content":formatted_prompt}
    ]
)

print(chat_completion.choices[0].message.content)

出力

100文字程度で、PON吉 についての 小説 を書いてください。

PON吉は古都の小さな民宿で働く猫で、宿泊者に幸運を運ぶ噂があった。
ある日、若い作家が現れ、スランプからの脱出を誓った。
PON吉は彼の机の上に毎朝、本の上に座り続け、作家の心を和ませた。
やがて才能が解放され、作家は新たな名作を書き上げた。

・PromptTemplate → langchain_openai

#langchain=0.2.7
#langchain_core=0.2.12
#langchain-openai=0.1.14

from langchain_openai import AzureChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough

from dotenv import load_dotenv
import os

# OpenAI APIキーの設定
dotenv_path = ".env"
load_dotenv(dotenv_path)

OPENAI_API_BASE = os.getenv('OPENAI_API_BASE')
OPENAI_API_VERSION = os.getenv('OPENAI_API_VERSION')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

os.environ["AZURE_OPENAI_API_KEY"] = OPENAI_API_KEY
os.environ["AZURE_OPENAI_ENDPOINT"] = OPENAI_API_BASE

template = """
{subject}について30文字で教えて。
"""

prompt = PromptTemplate.from_template(template)


llm = AzureChatOpenAI(
    api_version=OPENAI_API_VERSION, 
    azure_deployment="gpt4o" # azure_deployment = "deployment_name"
    )

chain = (
{"subject":RunnablePassthrough()}
|prompt
| llm
)

response = chain.invoke("PON吉")
print(response.content)

出力(PON吉ってあるの?!)

PON吉は、楽しいキャラクターで、ポップカルチャーやゲームなどで人気です。

・HumanMessage, SystemMessage → langchain_openai

from langchain_openai import AzureChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

from dotenv import load_dotenv
import os

# OpenAI APIキーの設定
dotenv_path = ".env"
load_dotenv(dotenv_path)

OPENAI_API_BASE = os.getenv('OPENAI_API_BASE')
OPENAI_API_VERSION = os.getenv('OPENAI_API_VERSION')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

os.environ["AZURE_OPENAI_API_KEY"] = OPENAI_API_KEY
os.environ["AZURE_OPENAI_ENDPOINT"] = OPENAI_API_BASE

prompt = [
    SystemMessage(
        content="あなたは、有能なAIアシスタントです。名前はPON吉です。"
    ),
    HumanMessage(
        content="あなたの名前は何ですか?"
    )
]

llm = AzureChatOpenAI(
    api_version=OPENAI_API_VERSION, 
    azure_deployment="gpt4o" # azure_deployment = "deployment_name"
    )

llm.invoke(prompt).content

出力

'こんにちは!私はPON吉です。何かお手伝いできることがあれば教えてくださいね。'

・ChatPromptTemplate → langchain_openai

from langchain_openai import AzureChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

from dotenv import load_dotenv
import os

# OpenAI APIキーの設定
dotenv_path = ".env"
load_dotenv(dotenv_path)

OPENAI_API_BASE = os.getenv('OPENAI_API_BASE')
OPENAI_API_VERSION = os.getenv('OPENAI_API_VERSION')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

os.environ["AZURE_OPENAI_API_KEY"] = OPENAI_API_KEY
os.environ["AZURE_OPENAI_ENDPOINT"] = OPENAI_API_BASE

template = ChatPromptTemplate.from_messages([
    ("system", "あなたは、有能なAIアシスタントです。名前は {name}です。"),
    ("human", "こんにちは。ごきげんいかがですか?"),
    ("ai", "私は元気です。おかげさまで調子は良いです"),
    ("human", "{user_input}"),
])

llm = AzureChatOpenAI(
    api_version=OPENAI_API_VERSION, 
    azure_deployment="gpt4o" # azure_deployment = "deployment_name"
    )

chain = (
template
| llm
| StrOutputParser() #AIモデルからの出力をPythonの文字列に変換する出力パーサーのクラス
)

response = chain.invoke({"name": "PON吉","user_input":"あなたの名前は何ですか?"})

print(response)

出力

こんにちは!私はPON吉です。どうぞよろしくお願いします。何かお手伝いできることがあれば教えてくださいね。

この記事が気に入ったらサポートをしてみませんか?