Upgrade to Pro — share decks privately, control downloads, hide ads and more …

人工無能たいたん

hmatsu47
November 19, 2023

 人工無能たいたん

JAWS-UG 名古屋 Amazon Bedrock ハンズオン 2023/11/20 LT

hmatsu47

November 19, 2023
Tweet

More Decks by hmatsu47

Other Decks in Technology

Transcript

  1. 人工無能たいたん
    JAWS-UG 名古屋 Amazon Bedrock ハンズオン
    2023/11/20
    まつひさ(hmatsu47)

    View full-size slide

  2. 自己紹介…は(また)書く時間がなかったのでスキップ
    松久裕保(@hmatsu47)
    ● https://qiita.com/hmatsu47
    2

    View full-size slide

  3. 本日のネタ着想元
    ● 10 月に「吉祥寺.pm 34」で話した内容
    3

    View full-size slide

  4. パソコン通信むかしばなし
    吉祥寺.pm34【オンライン】 2023/10/31
    まつひさ(hmatsu47)

    View full-size slide

  5. BBS ソフトウェアをリニューアル
    ● 自作に切り替え
    ○ 骨格は BASIC
    ○ 通信制御とその周辺部分のみアセンブリ言語で書き換え
    ○ 日本語対応強化
    ○ ファイル転送対応(XMODEM)
    ○ ついでにゲームを実装
    ○ おまけとしてチャットに人工無能を追加
    5
    ←これで思いついた

    View full-size slide

  6. 本日のネタ
    ● Bedrock のモデルを使って文章をベクトル化して
    ○ Titan Embeddings G1 - Text
    ● Vector store に突っ込んで
    ○ pgvector(PostgreSQL)
    ● 入力した文章に近い意味の文章を返すチャットを作る
    ○ いわゆる人工無能(無脳)の一種
    ■ おうむ返し・唐突なリアクション
    6

    View full-size slide

  7. 本日のネタ
    ● こちらを参考に(LangChain を使って)
    ○ あえて質問を Claude に投げないスタイルで実装
    ■ https://gihyo.jp/book/2023/978-4-297-13839-4
    7

    View full-size slide

  8. GitHub リポジトリはこちら
    ● https://github.com/hmatsu47/munou-chat
    8

    View full-size slide

  9. Titan Embeddings G1 - Text
    ● 文章ベクトル化のためのモデル
    ○ 1536 次元のベクトルを出力
    ■ OpenAI の text-embedding-ada-002 と同じ
    ○ 日本語にも対応
    ■ Titan Text G1 - Express / Lite(プレビュー)は日本語未対応
    9

    View full-size slide

  10. 他の文書ベクトル化方法(従来からあったもの)
    ● TF-IDF(例:scikit-learn(sklearn)の TfidfVectorizer)
    ○ 文章中に出てくる単語の頻度とレア度を使ってベクトル化
    ■ 事前に形態素解析して単語に分解した状態の文章を使う
    ■ TfidfVectorizer では単語の頻度・レア度を無視する使い方も可能
    ■ FAQ サイトの関連質問へのリンク生成などに使用
    ■ https://github.com/hmatsu47/vaccinecert-qa-similarity-test (旧ワクチン証明書アプリ FAQ)
    ● Word2vec(2013 年)
    ○ 機械学習のモデル(群)by Google の研究チーム
    10

    View full-size slide

  11. 文章をベクトル化すると?
    ● ベクトルを比較することで近い意味の文章が検索可能
    ○ ベクトル間のユークリッド距離、コサイン類似度などで比較
    ■ 近いものから順に文章を抽出
    ○ 多言語対応モデルを使うと違う言語間の検索(比較)が可能
    ■ 例:「これは猫です」と「This is a cat」が近いものとして抽出
    11

    View full-size slide

  12. pgvector
    ● PostgreSQL 用の拡張機能(Extension)
    ○ ベクトルデータの保存・検索が可能に
    ■ 16,000 次元までのベクトルに対応
    ■ ユークリッド距離(L2 距離)、コサイン類似度などを計算し検索
    ■ INDEX の作成も可能(検索・比較を高速化)
    ■ https://github.com/pgvector/pgvector
    ○ 今回は Docker イメージを利用
    ■ https://hub.docker.com/r/ankane/pgvector
    12

    View full-size slide

  13. LangChain から使う
    ● ストア(pgvector)から入力に類似する文章を取得
    13
    # ベクターストアから応答を取得
    bedrock_client = boto3.client('bedrock-runtime', region_name="ap-northeast-1")
    embeddings = BedrockEmbeddings(
    client=bedrock_client,
    model_id="amazon.titan-embed-text-v1"
    )
    store = PGVector(
    collection_name=COLLECTION_NAME,
    connection_string=CONNECTION_STRING,
    embedding_function=embeddings,
    )
    docs = store.similarity_search_with_score(trimed_prompt)
    (中略)
    # 近い文章を返す
    response = docs[0][0].page_content
    1つ目([0])の要素=入力文書に最も近い文章を返す

    View full-size slide

  14. LangChain から使う
    ● ストア(pgvector)に文章を追加
    14
    # ベクターストアに入力を追加
    store.add_documents([Document(page_content=trimed_prompt)])
    文章を渡すとベクトル値と一緒に保存される

    View full-size slide

  15. 一方、本編(ハンズオン)では
    ● RAG の Retriever として Kendra を使用
    ● Kendra はセマンティック検索が可能
    ○ 人が入力(質問)した文の意味に沿った検索
    15

    View full-size slide

  16. デモ
    ● 最初はおうむ返し → 言葉を覚えるとズレた会話に
    16

    View full-size slide

  17. 正しく RAG として使うには?
    ● ストアから取得した文章はプロンプトの文脈として渡す
    ○ LangChain では RetrievalQA でストアの retriever を渡す
    ■ そうすれば Claude がちゃんとした答えを返してくれるはず
    ● 会話履歴もあわせて渡す
    ○ ただし一問一答式の QA の場合は除く
    17

    View full-size slide

  18. まとめ
    ● Titan Embeddings G1 - Text は日本語文章のベクトル化
    に使える
    ● 機能は正しく使うべし
    ○ 今回はちょっと変な(間違った)使い方をしてみた
    18

    View full-size slide