Toilを無くして徒然なるままに日暮し硯に向かひたい

生成AIアプリケーション開発などを行うエンジニアのブログです。

生成AIアプリケーション開発入門ハンズオン

genai-users.connpass.com

この記事は、日本生成AIユーザ会 #1 生成AIアプリケーション開発入門ハンズオンの資料です。

アーカイブ動画はこちら

youtu.be

自己紹介

小渕 周(こぶち しゅう)

2023年12月株式会社スリーシェイクに入社

Sreake事業部 エンジニア

生成AIアプリケーション開発に従事

sreake.com

発表内容

  • Python + LangChain + OpenAIで簡単なサンプルコードを実行しながら生成AIアプリケーション開発についてご説明していきます。
  • プロンプトエンジニアリングについても学べる内容となっています。
  • 最後に少しRAGアプリも紹介します。

使用するソースコード

https://github.com/shu-kob/langchain-sample-app

Pythonを使う理由

  • LangChainライブラリがJavaScript(TypeScript)版より情報が多い

OpenAIを使う理由

  • 情報が多いから
    • Python + LangChain + OpenAIの組み合わせの情報が最も多い

Python設定

python3 --version
Python 3.11.4
  • Python 3.11系を使ってください。
  • Python 3.12系だと、ライブラリの関係で、最後の「chainlit_chat_db.py」が実行できないかもしれません。

OpenAI API設定

  • https://platform.openai.com/
    • API KeysでSECRET KEYを取得
  • 無料枠
    • APIはアカウント開設してから3ヶ月間、$5.00 分利用可能
  • それ以降は課金する必要あり
    • 別でアカウント作っても、SMS認証に使う電話番号が同じであれば無料枠はもらえない模様
    • $5.00から課金可能
    • ChatGPTの有料プランとは異なるので注意
    • 以下のエラーが出たら課金する必要あり
openai.RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}
  • 課金して数分すればエラーが出ず正常実行できるように

  • API Keyを環境変数に設定

export OPENAI_API_KEY=sk-***********************************

他のLLM

Gemini

  • Google CloudのVertex AIで利用可能

Claude 3

  • 上位 ← Opus、Sonnet、Haiku → 下位
  • AWSAmazon BedrockでOpus(最上位モデル)利用可能
  • Google CloudではSonnet(中位モデル)利用可能
    • OpusはComing Soon

OpenAI APIを使ったプログラミング

  • 無料枠でも利用可能なgpt-3.5-turboを使用
python3 -m pip install openai==1.16.1
  • openai_chat_completions.py
import os
from openai import OpenAI

client = OpenAI(
  # This is the default and can be omitted
  api_key=os.environ.get("OPENAI_API_KEY"),
)

chat_completion = client.chat.completions.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": "私は優秀なソフトウェアエンジニアです。"},
    {"role": "user", "content": "kubernetesについて説明してください。"}
  ]
)

print(chat_completion.choices[0].message.content)
  • 実行
python3 openai_chat_completions.py
Kubernetes(クーバーネティス)は、コンテナ化されたアプリケーションを管理するためのオープンソースのコンテナオーケストレーションツールです。Kubernetesは、複数のコンテナを効率的かつ柔軟に管理することができ、アプリケーションのデプロイメント、スケーリング、バージョン管理、ネットワーキングなどを自動化します。

Kubernetesは、クラウド上やオンプレミスの環境など、さまざまな環境で使用でき、高い信頼性、拡張性、セキュリティを提供します。また、リソースの効率的な管理や障害時の自己修復機能も持っています。

Kubernetesは、コンテナ化されたアプリケーションの展開や管理を容易にするための多くの機能やリソースを提供しており、クラウドネイティブなアプリケーションの開発や運用において非常に重要な役割を果たしています

LangChain

  • LLMの差分を吸収するライブラリ
  • Python版がメインで開発は先行
    • 情報が多い
  • 追従して、JavaScript(TypeScript)版が出る
    • Webフロントエンドと開発言語を合わせられる
  • LangChain以外のLLMライブラリはLlamaなど
python3 -m pip install langchain==0.1.14
python3 -m pip install langchain-openai==0.1.1
  • langchain_chat.py
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage

chat = ChatOpenAI(
  model="gpt-3.5-turbo",
)

result = chat.invoke(
  [
    SystemMessage(content="私は優秀なソフトウェアエンジニアです。"),
    HumanMessage(content="LangChainについて説明してください。"),
  ]
)
print(result.content)
  • 実行
python3 langchain_chat.py
LangChainは、ブロックチェーン技術を活用して言語学習者とネイティブスピーカーをつなぐプラットフォームです。言語学習者は、LangChainを通じてネイティブスピーカーとリアルタイムでコミュニケーションを取りながら、言語スキルを向上させることができます。ネイティブスピーカーは、言語学習者に言語を教えることで収入を得ることができます。ブロックチェーン技術によって、安全かつ透明な支払いシステムが提供され、利用者同士の信頼関係を築くことができます。LangChainは、言語学習をより効果的かつ楽しくする革新的なプラットフォームとして注目されています。
  • ハルシネーションが発生
  • 実行前にブロックチェーンの質問はしていないし、会話履歴は取得・使用していない
  • GPT-4でもハルシネーション
LangChainは、AIを活用した言語翻訳プラットフォームです。ブロックチェーン技術を導入することで、翻訳者は自分の作業を通じて報酬を得ることができます。また、LangChainは独自のトークン経済を持っており、翻訳作業の報酬やサービスの利用料金にそのトークンが使用されます。

LangChainの特徴は、AI技術を活用して高精度な自動翻訳を可能にしている点です。また、ブロックチェーンを活用して翻訳者とクライアント間の取引を透明化し、安全性と信頼性を確保しています。

さらに、LangChainはコミュニティ主導型のプラットフォームであり、ユーザーがサービスの改善や発展に直接貢献できることも大きな特徴です。

ただし、上記内容はLangChainについて一般的に説明したものであり、特定のLangChainとは異なる場合があります。具体的な情報は各LangChainの公式情報をご確認ください。

Chainlit

  • Pythonで稼動するLLMフレームワーク
  • すぐにリッチなUIを使える
  • カスタマイズは限定される
  • 自由にUI開発するならStreamitを使えば良い
python3 -m pip install chainlit==1.0.500
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParser
from langchain.schema.runnable import Runnable
from langchain.schema.runnable.config import RunnableConfig

import chainlit as cl

@cl.on_chat_start
async def on_chat_start():
    model = ChatOpenAI(model="gpt-3.5-turbo", streaming=True)
    prompt = ChatPromptTemplate.from_messages(
        [
            (
                "system",
                "あなたはとても優秀なソフトウェアエンジニアです。",
            ),
            ("human", "{question}"),
        ]
    )
    runnable = prompt | model | StrOutputParser()
    cl.user_session.set("runnable", runnable)
    await cl.Message(content="こんにちは。私はAIです。質問をしてください。").send()

@cl.on_message
async def on_message(message: cl.Message):
    runnable = cl.user_session.get("runnable")  # type: Runnable

    msg = cl.Message(content="")

    async for chunk in runnable.astream(
        {"question": message.content},
        config=RunnableConfig(callbacks=[cl.LangchainCallbackHandler()]),
    ):
        await msg.stream_token(chunk)

    await msg.send()
  • 起動方法
chainlit run chainlit_app.py -w

-w をつけると、ソースの更新が即時反映

以下をChainlitのUIから実行

プロンプトエンジニアリング

プロンプトの工夫

  • システム開発しなくても、LLMデフォルトのUI上でプロンプトを工夫して欲しい結果を得られる
  • ChatGPTのUIでもプロンプトを登録可能
    • 左下のプロフィール > ChatGPTをカスタマイズする

役割を与える

  • あなたは〇〇の専門家です。
あなたはIT営業です。生成AIを企業のお客様にわかりやすく解説してください。
生成AIとは、人工知能の一種で、データから新しい情報やコンテンツを生成することができる技術です。例えば、文章や画像、音声など、さまざまな形式のデータを入力として与えると、生成AIはそのデータを分析し、それらに似た新しいデータを作成することができます。

企業が生成AIを活用することで、以下のようなメリットが得られます:
1. 新しい商品やサービスの開発:生成AIを使って市場のトレンドや消費者のニーズを分析し、新しい商品やサービスのアイデアを生み出すことができます。
2. マーケティング戦略の強化:生成AIを使って効果的な広告コピーを作成したり、ターゲットとなる顧客に最適なコンテンツを提供することができます。
3. プロセスの効率化:生成AIを活用して、自動で文章を生成したり、画像を加工したりすることで、業務プロセスを効率化し、作業効率を向上させることができます。

生成AIは、ビジネスのさまざまな分野で活用されており、企業の競争力を強化するための強力なツールとなっています。

文字数指定

  • 〇〇について200文字以内で教えてください。
AWSについて200文字以内で教えてください。
AWS(Amazon Web Services)は、Amazonが提供するクラウドコンピューティングサービスのことです。AWSを利用することで、サーバー、ストレージ、データベースなどのインフラストラクチャをクラウド上で提供し、スケーラビリティや柔軟性を実現します。多くのサービスが用意されており、企業や個人が必要なサービスを選択して利用することができます。AWSは世界中で広く利用されており、安定性やセキュリティ面でも信頼性が高いです。

箇条書き

  • 〇〇について箇条書きしてください。
良いプレゼンに必要なことを箇条書きで答えてください。
・ 明確な目的を持つ
・ 聴衆に合わせた内容とレベルを選定する
・ わかりやすい構成と論理展開
・ 魅力的なビジュアル要素の使用
・ 適切な言葉遣いとトーン
・ 質疑応答に備えた準備
・ タイムマネジメントを考慮したスピーチ時間の管理
・ 自信を持ってプレゼンする

簡単な回答を得る

  • 〇〇について小学5年生にもわかるような文章で教えてください。
公定歩合について小学5年生にもわかるような文章で教えてください。
公定歩合とは、日本銀行が決める金利のことです。これは、お金を借りたり貸したりするときに使われる金利の基準です。公定歩合が高いと、お金を借りるのがちょっと高くなってしまいます。逆に、公定歩合が低いと、お金を借りるのが安くなります。公定歩合は、経済や物価などに関係していて、政府や日本銀行が調整しています。

手順を書かせる

  • 賞味期限の近い食材を含め、今あるもので料理を作る、という想定
冷蔵庫に、キャベツ、豚肉、豆腐、味噌があります。これらの食材で作れる料理を教えてください。また、調理の手順を箇条書きで書いてください。
キャベツと豚肉の味噌炒めを作ることができます。以下に調理手順を箇条書きで示します。

材料:
- キャベツ
- 豚肉
- 味噌
- 豆腐(オプション)

調理手順:
1. キャベツを千切りにします。
2. 豚肉を食べやすい大きさに切ります。
3. フライパンに少量の油を熱し、豚肉を炒めます。
4. 豚肉に火が通ったら、キャベツを加えてさらに炒めます。
5. キャベツがしんなりとしたら、味噌を加えて全体を混ぜます。
6. ソースが全体になじんだら完成です。
7. 豆腐を加えてさらに煮込むと、豆腐も味を含んで美味しくなります。

是非お試しください!

ハッシュタグで条件を指定

  • メール作成や翻訳など、テンプレート化しておくと便利
# 役割:
あなたはITコンサルタントです。
# 目的:
生成AIを用いたシステム開発を見込み客に提案
# 条件:
・開発期間は2ヶ月
・予算は1,000万円
・見込み客は生成AIシステム開発は初めて
# 指示:
以上の条件をもとに事業企画書をA4用紙1枚分で出してください。

事業企画書

プロジェクト概要

  • プロジェクト名: 生成AIを活用したシステム開発プロジェクト
  • 目的: 見込み客の業務効率向上と競争力強化
  • 開発期間: 2ヶ月
  • 予算: 1,000万円

背景

  • 見込み客は生成AIシステム開発に初めて取り組む
  • 生成AIの活用により業務プロセスの自動化や品質向上が期待される

提案内容

  1. 要件定義および設計フェーズ
    • 要件ヒアリングとシステム設計の作成
    • 開発方針の決定と進行管理計画の策定
  2. 開発フェーズ
    • 生成AIモデルの構築と学習
    • システムの開発とテスト
  3. 導入および運用フェーズ
    • システムの導入支援とトレーニン
    • 運用保守体制の構築とサポート体制の整備

期待効果

  • 業務効率の向上と品質の向上
  • 競争力の強化と市場シェアの拡大

結言

  • 生成AIを活用したシステム開発は見込み客にとって未知の領域かもしれませんが、弊社の豊富な経験と専門知識により、成功への道筋を示すことができます。
  • ご検討いただければ幸いです。

プロンプトエンジニアリングガイド

Prompt Engineering Guide – Nextra

  • 基本的知識から様々な応用手法まで紹介
  • LangChainで実装できる手法も存在

RAG

speakerdeck.com

  • ライブラリをインストール
python3 -m pip install pymupdf-1.24.1
python3 -m pip install spacy==3.7.4
python3 -m spacy download ja_core_news_sm
python3 -m pip install tiktoken==0.6.0
python3 -m pip install chromadb==0.4.24
python3 -m pip install langchain-community==0.0.31
  • prepare_db.py
    • PDFの内容をベクトル化してChroma DBに格納
from langchain.document_loaders import PyMuPDFLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import SpacyTextSplitter
from langchain.vectorstores import Chroma

loader = PyMuPDFLoader("./sample.pdf")
documents = loader.load()

text_splitter = SpacyTextSplitter(
  chunk_size=300,
  pipeline="ja_core_news_sm"
)
splitted_documents = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings(
  model="text-embedding-ada-002"
)

database = Chroma(
  persist_directory="./.data",
  embedding_function=embeddings
)

database.add_documents(
  splitted_documents,
)

print("データベースの作成が完了しました。")
  • PDFをベクトル化してDBに格納
python3 prepare_db.py
  • DBに格納したPDFの内容について質問可能なChainlitアプリ
import chainlit as cl
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain.prompts import PromptTemplate
from langchain.schema import HumanMessage
from langchain_community.vectorstores import Chroma

embeddings = OpenAIEmbeddings(
  model="text-embedding-ada-002"
)

chat = ChatOpenAI(model="gpt-3.5-turbo")

prompt = PromptTemplate(template="""文章を元に質問に答えてください。

文章:
{document}

質問: {query}
""", input_variables=["document", "query"])

database = Chroma(
  persist_directory="./.data",
  embedding_function=embeddings
)

@cl.on_chat_start
async def on_caht_start():
  await cl.Message(content="準備ができました!メッセージを入力してください!").send()

@cl.on_message
async def on_message(input_message: cl.Message):
  print("入力されたメッセージ: " + input_message.content)
  documents = database.similarity_search(input_message.content)

  documents_string = ""

  for document in documents:
    documents_string += f"""
  -------------------------
  {document.page_content}
  """

  result = chat([
    HumanMessage(content=prompt.format(document=documents_string, query=input_message.content))
  ])
  await cl.Message(content=result.content).send()
  • Chainlitアプリを実行し、PDFの内容について質問可能
chainlit run chainlit_chat_db.py -w 

www.oreilly.co.jp

Terraformで再利用可能なモジュールを作成するためのコツを教えてください。
再利用可能なTerraformモジュールを作成するためのコツは、以下の点に注意することです。

小さなモジュールを作成する: 1つのモジュールに複数の機能やリソースを詰め込まず、1つの機能やリソースに焦点を当てた小さなモジュールを作成することで、再利用性が高くなります。

組み合わせ可能なモジュールを作成する: モジュール同士が疎結合であり、組み合わせて利用することが容易な設計を心がけることで、柔軟性が向上します。

テスト可能なモジュールを作成する: モジュールごとに適切なテストを実施し、品質を担保することが重要です。テストが容易に実施できるようなモジュールを作成することがポイントです。

バージョン管理されたモジュールを使用する: モジュールのバージョン管理を行い、変更やアップデートが容易に行えるようにすることが大切です。

これらのポイントに留意しながら、Terraformモジュールを設計・作成することで、効果的な再利用可能性を実現できます。
  • オライリー本をEbookで購入して、PDFをRAGに入れていけば便利そう
    • 詳解Terraformのベクトル化でEmbeddingモデルにかかった料金は$0.06

参考文献