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

LLMのエコシステム / Ecosystem of LLM

LLMのエコシステム / Ecosystem of LLM

2024/07/10 に行われた OCHaCafe Season8 #6 の資料です。

oracle4engineer

July 10, 2024
Tweet

Video

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. LLMのエコシステム Oracle Cloud Hangout Cafe Season8 #6 Shuhei Kawamura Solutions

    Architect, Oracle Digital/ISV Solutions Oracle Corporation Japan
  2. ⾃⼰紹介 Copyright © 2024, Oracle and/or its affiliates 2 @shukawam

    X/GitHub/Qiita 川村 修平 (Shuhei Kawamura) オラクル・デジタル / ISVソリューション本部 ⽇本オラクル株式会社 コミュニティ • OCHaCafe • CloudNative Days – Observabilityチーム ひとこと • 暑くて夏バテ気味、冷や汁最⾼
  3. アジェンダ 1. 前提知識: LLMとは︖RAGとは︖ 2. LLMのエコシステム 1. オーケストレーション – LangChain

    2. ベクトルデータベース – Milvus, Oracle Database 23ai 3. LLMOps – Langfuse 3. デモ 3 Copyright © 2024, Oracle and/or its affiliates
  4. 話すこと・話さないこと 話すこと • Retrieval-Augmented Generation(以下、RAG)を構築する際に役に⽴つ周辺ツールのこと • LangChain, Milvus, Langfuse •

    各ツールの概要 + 代表的な使い⽅ 話さないこと • LLMそのものに関する詳細な仕組み、LLM間の⽐較 • RAGの実装戦略や検索精度向上のための具体的な⼿法 • 類似ツールとの⽐較 • LangChain vs. LlamaIndex – この後のセッションに期待︕ • Milvus vs. Pinecone • Langfuse vs. LangSmith or OpenLLMetry + Any Observability Tool (Grafana Tempo, …) • … 4 Copyright © 2024, Oracle and/or its affiliates
  5. LLMとは︖ Large Language Model/⼤規模⾔語モデル ⾔語モデル • ⼈間が扱う⾃然⾔語で書かれた⽂や⽂章が⽣成される確率をモデル化したもの • 個別のタスク(エンティティ抽出、センチメント分析、etc.)ごとにモデルを作成 ⼤規模⾔語モデル

    • 多くのパラメータを使⽤して、ラベル付けされていない多くのテキストデータから学習されたディープラーニング技術を⽤ いて構築された⾔語モデルのこと • モデル1つで汎⽤的にタスク(テキスト⽣成、要約、翻訳、etc.)を⾏うことができる 6 Copyright © 2024, Oracle and/or its affiliates Task A Task B Task D … Task A Task B Task D … ⾔語モデル ⼤規模⾔語モデル
  6. LLMはどのように振る舞うのか理解する • テキストの⼀部をトークンと呼ばれる⼩さな単位に分解する • 機械学習モデルで処理可能なテキストの構造化表現を作成することが⽬的 • 選択するアルゴリズムによって分解される単位が異なる • Word Tokenization(単語トークン化)

    • テキストを単語ごとに分割、スペースや辞書を⽤いて単語を特定する • e.g. “I love eating ramen.” → [“I”, “love”, “eating”, “ramen”, ”.”] • Character Tokenization(⽂字トークン化) • テキストを個々の⽂字に分割 • e.g. ”ramen” → [“r”, “a”, “m”, “e”, “n”] • Subword Tokenization(サブワードトークン化) • テキストを⼩さな部分⽂字列(Subword)に分割 • BPE(Byte-Pair Encoding)やSentencePieceなどが代表的な⼿法 • e.g. “I love eating ramen.” → [“I”, “love”, “eating”, “ram”, “en”, ”.”] • 使⽤: https://platform.openai.com/tokenizer 7 Copyright © 2024, Oracle and/or its affiliates The cat is on the The cat is on the Tokenizer トークン
  7. LLMはどのように振る舞うのか理解する 8 Copyright © 2024, Oracle and/or its affiliates The

    cat is on the The cat is on the Tokenizer トークン ベクトル表現 • 各トークンを埋め込みベクトル(Embeddings)に変換する • 何次元のベクトル空間に埋め込まれるかは、使⽤するモデルに依存 • e.g. Cohere Embed v3: 1024 • ベクトルとして表現されることで、モデルがトークンに数学的演算を⾏い、 トークンが現れる⽂脈を理解することができる Queen King Woman Man King – Man + Woman ≈ Queen ベクトル空間に適切に埋め込むことができれば という関係が成り⽴つはず d! d"
  8. LLMはどのように振る舞うのか理解する • ベクトル化された⼊⼒をANN*へ渡す • ⼊⼒層 • ⼊⼒データを受け取る層 • 隠れ層(中間層) •

    ⼊⼒層から情報を受け取り、さまざまな計算を ⾏う層 • 出⼒層 • ⼊⼒層、中間層で重みをかけ、活性化関数 で処理された値が出⼒される層 • Softmax • 実数のベクトルを確率分布に変換する関数 • Softmax 𝑧! = "#$ %! ∑"#$ % "#$ %" 9 Copyright © 2024, Oracle and/or its affiliates ベクトル表現 隠れ層 … 省略 … Softmax(x) ⾮線形活性化関数 *: Artificial Neural Network(⼈⼯ニューラルネットワーク) roof table chair 確率分布
  9. 参考: 特にTransformer周りなどもう少し詳細に知りたい⽅ 10 Copyright © 2024, Oracle and/or its affiliates

    https://oracle-code-tokyo-dev.connpass.com/event/282420/ https://qiita.com/ksonoda/items/b767cbd283e379303178
  10. RAG(Retrieval-Augmented Generation)とは︖ LLMのテキスト⽣成を関連情報を取得する検索システムと統合することで強化する⼿法のこと • LLMの⼊⼒プロンプトに検索結果を組み込むことで、LLMのテキスト⽣成を調整する • よく使われる検索システムの例 • (ベクトル)データベース、全⽂検索エンジン、etc. 11

    Copyright © 2024, Oracle and/or its affiliates OCHaCafeって なんですか︖ OCHaCafeは、お茶を テーマにしたユニークな カフェです。... OCHaCafeって なんですか︖ OCHaCafeは、⽇本オ ラクルが主催するコミュ ニティの1つです。… 連携 検索システム RAGを使わない例 RAGを⽤いた例 LLM LLM ユーザー ユーザー
  11. RAGの代表的な構成例と流れ 12 Copyright © 2024, Oracle and/or its affiliates 検索システム

    LLM ユーザー アプリケーション 1. 質問 2. 質問に関連する情報 3. 質問 + 関連情報 4. 関連情報を含んだ回答 関連情報に基づいて、質問に回答してください ## 関連情報 OCHaCafeは、⽇本オラクルが主催するコミュニティの1 つです。… ## 質問 OCHaCafeってなんですか︖
  12. LLMを活⽤したアプリケーションを作る際に検討が必要なこと LLMが学習していない内容をテキスト⽣成に含めたい • 企業独⾃のデータ、学習時点以降の最新データ、etc. LLMやデータソースを含む周辺のコンポーネントとの連携を効率的に実装したい • 周辺のコンポーネント例: データストア、キャッシュストア、オブザーバビリティ、⼊出⼒のバリデーション、etc. アプリケーションを継続的に改善するための仕組みを導⼊したい •

    ユーザーからのフィードバックを取り込み、それを改善に活かすための仕組み • ユーザー体験を改善するために必要なデータの取得 • e.g. ユーザーがプロンプトを⼊⼒してからテキストが返却されるまでに各ステップでかかった時間 13 Copyright © 2024, Oracle and/or its affiliates データストアなど周辺のコンポーネントをきちんと使いこなすことが重要
  13. LLMを活⽤したアプリケーション構築に必要なコンポーネントの⼀例 14 Copyright © 2024, Oracle and/or its affiliates オーケストレーション

    データパイプライン エンベディング ベクトルデータベース (コンテキスト・データ ベクトル・データ) API/Plugins キャッシュ Logging, Tracing /LLMOps バリデーション アプリケーション コンテキスト データ クエリ 出⼒ Proprietary API (OpenAI, Anthropic, …) Cloud Provider (OCI, AWS, Azure, …) Open API (Hugging Face, …) Opinionated Cloud LLM APIs and Hosting LLMの出⼒のために提供するコンテキスト・データの流れ ユーザーから提出されたクエリーの流れ ユーザーに返却する出⼒の流れ
  14. LLMを活⽤したアプリケーション構築に必要なコンポーネントの⼀例 15 Copyright © 2024, Oracle and/or its affiliates データパイプライン

    エンベディング API/Plugins キャッシュ バリデーション アプリケーション コンテキスト データ クエリ 出⼒ Proprietary API (OpenAI, Anthropic, …) Cloud Provider (OCI, AWS, Azure, …) Open API (Hugging Face, …) Opinionated Cloud LLM APIs and Hosting LLMの出⼒のために提供するコンテキスト・データの流れ ユーザーから提出されたクエリーの流れ ユーザーに返却する出⼒の流れ オーケストレーション ベクトルデータベース (コンテキスト・データ ベクトル・データ) Logging, Tracing /LLMOps
  15. RAGの実装上の課題 アプリケーションのコードには、各コンポーネントとの連携に関するすべてのコードをきちんと実装する必要がある • LLM • ⼊⼒を渡し、⽣成結果を取得するための⼀連の⼿続き • データストア • ⼊⼒をもとに関連データを取得するための⼀連の⼿続き

    • データを格納するための⼀連の⼿続き • ドキュメントのローディング、チャンキング*、埋め込みベクトルの取得、データの保存、etc. • … *: ⼤きなテキストを⼩さな部分に分割すること 18 Copyright © 2024, Oracle and/or its affiliates お決まりの⼿続きは、ライブラリやツールにオフロードして楽に実装したい
  16. LangChain LLMを活⽤したアプリケーションのためのフレームワーク • LangChain(Python), LangChain.js(JavaScript/TypeScript) • LLMアプリケーションのライフサイクルを簡素化 • 開発(LangChain)、運⽤監視(LangSmith)、デプロイメント(LangServe) LangChainの構成

    • langchain-core: 基本機能、各コンポーネントの抽象化、LCEL(LangChain Expression Language) • langchain-community: 3rdパーティとの統合 • langchain: チェーン、エージェント、検索周りの汎⽤的な機能 • *langgraph: エージェントをグラフとしてモデル化 • *langserve: LangChainのチェーンをREST APIとしてデプロイ • *langsmith: LLMアプリケーションのデバッグ、テスト、評価、監視を⾏うプラットフォーム *: 今⽇は対象外 19 Copyright © 2024, Oracle and/or its affiliates
  17. Getting started LangChain w/ OCI Generative AI Service(Command R+) テキスト⽣成

    20 Copyright © 2024, Oracle and/or its affiliates from langchain_community.chat_models.oci_generative_ai import ChatOCIGenAI chat = ChatOCIGenAI( service_endpoint=service_endpoint, compartment_id=compartment_id, model_id="cohere.command-r-plus", is_stream=True, model_kwargs={ "temperature": 0, "max_tokens": 500, "top_p": 0.75, "top_k": 0, "frequency_penalty": 0, "presence_penalty": 0 } ) res = chat.invoke( "OCHaCafeってなんですか︖" ) print(chunk.content) langchain-communityから提供されている OCI Generative AI Service(Cohere Command R+) を使うためのクライアントの宣⾔ 回答⽣成 他にも、invoke, stream, batch, astream, ainvoke, abatch, astream_log, astream_events が使⽤可能 OCHaCafe(オチャカフェ)は、オンライン茶道体験を提供する⽇本のスタートアップ企業です。 茶道は⽇本の伝統的な⽂化の⼀つで、茶を点てて飲む儀式的な実践です。 OCHaCafe は、世界中の⼈々が⽇本の茶道の美しさと奥深さを発⾒できるようにすることを使命としています。…
  18. Getting started LangChain w/ OCI Generative AI Service(Command R+) エンベディング

    21 Copyright © 2024, Oracle and/or its affiliates from langchain_community.embeddings.oci_generative_ai import OCIGenAIEmbeddings embeddings = OCIGenAIEmbeddings( auth_type="INSTANCE_PRINCIPAL", model_id="cohere.embed-multilingual-v3.0", service_endpoint=service_endpoint, compartment_id=compartment_id ) docs = [ "「Oracle Cloud Hangout Cafe」(通称「おちゃかふぇ」/以降、OCHaCafe)は、⽇本オラクルが主催するコミュニティの1つです。..." ] res = embeddings.embed_documents(docs) print("Dims:", len(res[0])) print("Embeddings:", res) langchain-communityから提供されている OCI Generative AI Service(Cohere Embeddings) を使うためのクライアントの宣⾔ 対象データの埋め込みベクトルを取得 Dims: 1024 Embeddings: [[-0.0055618286, 0.041046143, -0.0234375, 0.015029907, ...
  19. langchain-core 基本機能、各コンポーネントの抽象化、LCEL(LangChain Expression Language)が含まれる • https://github.com/langchain-ai/langchain/tree/master/libs/core 以下が対象 • 3rd パーティーツールはlangchain-coreの対象機能を実装することで、LangChain対応することができる

    22 Copyright © 2024, Oracle and/or its affiliates . ├── callbacks ├── document_loaders ├── documents ├── embeddings ├── example_selectors ├── indexing ├── language_models ├── messages ├── output_parsers ├── outputs ├── prompts ├── runnables ├── tracers ├── utils ├── ... ├── ... ├── agents.py ├── caches.py ├── chat_history.py ├── chat_loaders.py ├── chat_sessions.py ├── memory.py ├── prompt_values.py ├── retrievers.py ├── stores.py ├── structured_query.py ├── sys_info.py ├── tools.py └── vectorstores.py ※ https://github.com/langchain-ai/langchain/tree/master/libs/core 以下の主要なものを抽出
  20. LCEL: LangChain Expression Language LangChainのコンポーネントを連鎖(チェーン)させるための宣⾔的な⽅法 • 実現するために langchain_core.runnable.base.Runnable プロトコルが実装されている •

    チェーンを定義し、呼び出すための標準的なI/Fが定義されている • e.g. invoke, stream, batch, ainvoke, astream, abatch, astream_log, astream_events • 多くのコンポーネントがRunnableを実装 – Chat Model, Output Parser, Retriever, Prompt Template, … 23 Copyright © 2024, Oracle and/or its affiliates chat = ChatCohere( cohere_api_key=api_key ) prompt1 = ChatPromptTemplate.from_template("{person}はどの街出⾝ですか︖") prompt2 = ChatPromptTemplate.from_template("{city}はどの国ですか︖この質問を{language}で答えてください。") chain1 = prompt1 | chat | StrOutputParser() chain2 = ( {"city": chain1, "language": itemgetter("language")} | prompt2 | chat | StrOutputParser() ) chain2.invoke( {"person": "徳永家康", "language": "スペイン語"} ) チェーン実⾏するコンポーネントを “|” で繋いで定義 Parallelに実⾏される Sequentialに実⾏される
  21. LCELを使うメリット 1/2 ストリーミングのサポート • 可能な限り最良のTTFT(time-to-first-token: 出⼒の最初のチャンクが得られるまでの経過時間)が得られる 同期/⾮同期APIのサポート • コードを変更することなく同期/⾮同期APIの両⽅で呼び出すことができる •

    i.e. Jupyter Notebookのようなプロトタイプと本番で同じコードを使うことができる 最適化された並列実⾏ • 並列実⾏可能なステップがある場合は、可能な限り最⼩のレイテンシで⾃動的に実⾏される リトライとフォールバック • チェーンの任意の部分にリトライ、フォールバックが設定可能 • チェーンの信頼性向上に繋がる • ※ストリーミングは現在⾮対応 24 Copyright © 2024, Oracle and/or its affiliates
  22. langchain-community LangChainコミュニティによってメンテナンスされている3rdパーティの統合機能が含まれる • 主要なパートナーパッケージは分離されている • e.g. Amazon Web Services, Cohere,

    Elasticsearch, Google, OpenAI, … • 2024/06現在: 約760のコミュニティ機能が提供されている • https://python.langchain.com/v0.2/docs/integrations/platforms/ 26 Copyright © 2024, Oracle and/or its affiliates Chat models LLMs Embedding models Document loaders Chat loaders Document transformers Vector stores Retrievers Tools Adapters Toolkits Memory Graphs Callbacks Stores Model caches
  23. langchain チェーンやエージェント、検索周りなどの汎⽤的な機能が含まれる • https://github.com/langchain-ai/langchain/tree/master/libs/langchain 以下が対象 • ⼀部3rd Partyの機能が含まれているが、軒並みDeprecatedな扱いとなっている • 順次、Community,

    Partner Packagesへ移⾏中(ということだと思う…) 27 Copyright © 2024, Oracle and/or its affiliates . ├── adapters ├── agents ├── callbacks ├── chains ├── chat_loaders ├── chat_models ├── docstore ├── document_loaders ├── document_transformers ├── embeddings ├── evaluation ├── globals ├── graphs ├── indexes ├── ... ├── ... ├── llms ├── load ├── memory ├── output_parsers ├── prompts ├── pydantic_v1 ├── retrievers ├── runnables ├── schema ├── smith ├── storage ├── tools ├── utilities ├── utils └── vectorstores ※ https://github.com/langchain-ai/langchain/tree/master/libs/langchain 以下の主要なものを抽出
  24. よくあるLangChainの使い⽅ - RAGのフロー実装 ユーザーの⼊⼒を受け取り、関連する情報を取得し、LLMへ問い合わせるフローの実装例 28 Copyright © 2024, Oracle and/or

    its affiliates prompt_template = PromptTemplate.from_template( template=""" 以下の質問をコンテキストに基づいて回答してください。 ## 質問 {query} ## コンテキスト {context} """ ) my_retriever = MyRetriever() chain = ( {"query": RunnablePassthrough(), "context": my_retriever} | prompt_template | chat | StrOutputParser() ) chain.invoke("アラン・チューリングはだれですか︖") LLMに渡すプロンプトのテンプレート定義 ダミーのRetriever(外部データを参照するための機能)を宣⾔ RAGを実現するチェーンの定義
  25. 参考: OCI Generative AI Agents(Limited Availability) RAG Agent: Gen AI

    Agentシリーズ最初のAgent 29 Copyright © 2024, Oracle and/or its affiliates OCI GenAI RAG Agentを⾃社のナレッジ・ベースに接続 ユーザーが⾃然⾔語で質問を実施 Gen AI RAG Agentは⼈と同様に応答し、 関連するドキュメント・ソースへのリンクを提⽰ ユーザーが 関連した追加質問を実施 GenAI RAG Agentは、 チャット履歴とより詳細な情報を取得して回答 LLM ⼤規模⾔ 語モデル RAG 顧客データ ベース アプリ ケーション ビジネス・ システム
  26. LLMアプリケーションでベクトルデータベースがよく使⽤されるワケ RAG: LLMの⼊⼒プロンプトに検索結果を組み込むことで、LLMのテキスト⽣成を調整する⼿法のこと • LLMへ⼊⼒可能なトークン/⽂字数には限りがある • 推論APIを実⾏するには、トークン/⽂字数に⽐例してコストがかかる • 余計な情報を渡すとテキスト⽣成のノイズになり得る →

    ⼊⼒に組み込む検索結果は、ユーザーの⼊⼒プロンプトと関連性が⾼いこと&必要⼗分な数であることが望ましい 32 Copyright © 2024, Oracle and/or its affiliates ユーザーの⼊⼒と関連性が⾼いものを 検索して組み込めるか︖が重要 ユーザーの⼊⼒⽂章 RAGのための コンテキスト・データ LLMの⼊⼒に渡すことが可能な ⽂字/トークン数には限りがある データストア LLM OpenAI GPT-4o: 128k Cohere Command R+: 128k … ベクトルデータベースの場合︓ ベクトル空間に埋め込まれたデータと⼊⼒の 類似性をベクトル演算によって評価することが可能 (コサイン類似度、ユークリッド距離、etc.)
  27. Milvus 機械学習モデルによって⽣成された膨⼤な埋め込みベクトルを保存、インデックス化、管理する⽬的で誕⽣ • LF AI & Data Foundationで管理されているOSS • ⾮構造化データから変換された埋め込みベクトルを扱うために設計されている

    • 膨⼤なデータセットに対するベクトル検索で⾼いパフォーマンス • ベンチマーク結果が公開されています︕ - https://milvus.io/docs/v2.2.x/benchmark.md • 多⾔語SDK(Python, Node.js, Go, Java)とツールチェーン(Attu, Sizing Tool, Milvus CLI) • ⾼いスケーラビリティと信頼性 • ベクトル検索 + フィルタリングを組み合わせたハイブリッド検索をサポート • サポートされるインデックス • HNSW, FLAT, IVF, SCANN, DiskANN • サポートされる類似性メトリクス • コサイン類似度、ユークリッド距離、ドット積、ジャッカード、ハミング 33 Copyright © 2024, Oracle and/or its affiliates
  28. Getting started Milvus with Python SDK 1/2 35 Copyright ©

    2024, Oracle and/or its affiliates client = MilvusClient(uri=milvus_uri) client.create_collection( collection_name="demo_collection", dimension=1024, ) docs = [ "⼈⼯知能は1956年に学問分野として設⽴されました。", "アラン・チューリングは⼈⼯知能の研究を⼤規模に⾏った最初の⼈物です。", "ロンドンのマイダ・ベールで⽣まれたチューリングは、イングランド南部で育ちました。", ] embedding_fn = CohereEmbeddingFunction( api_key=cohere_api_key, model_name="embed-multilingual-v3.0” ) vectors = embedding_fn.encode_documents(documents=docs) Milvusのクライアント宣⾔ コレクションを作成 (埋め込みベクトルを保存する論理単位、RDBMSでいうテーブル相当) エンベディングに使うクライアントを宣⾔ いくつかのモデルは、MilvusのSDKからラッパーが提供されているので 使いたいモデルがある場合は、こちらを使うと楽 e.g. OpenAI, Cohere, … コレクションに保存するための埋め込みベクトルを取得
  29. Getting started Milvus with Python SDK 2/2 36 Copyright ©

    2024, Oracle and/or its affiliates data = [ {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"} for i in range(len(vectors)) ] res = client.insert( collection_name="demo_collection", data=data ) queries = ["アラン・チューリングはだれですか︖"] query_vectors = embedding_fn.encode_queries(queries=queries) res = client.search( collection_name="demo_collection", data=[query_vectors], limit=2, output_fields=["text", "subject"], ) 作成したコレクションにデータを保存 ベクトル検索するために、 ⼊⼒クエリーの埋め込み表現を取得 作成したコレクションに対して、ベクトル検索を実⾏ ["[{'id': 1, 'distance': 0.6781278252601624, 'entity': {'text': 'アラ ン・チューリングは⼈⼯知能の研究を⼤規模に⾏った最初の⼈物です。', 'subject': 'history'}}, {'id': 2, 'distance': 0.5685498714447021, 'entity': {'text': 'ロンドンのマイダ・ベールで⽣まれたチューリングは、イングランド南部で育ちました。', 'subject': 'history'}}]"] , extra_info: {'cost': 0}
  30. Oracle Database 23ai AI Vector Search あらゆる⽣成AIを⽀える、マルチモーダルプラットフォーム 様々なデータ、検索⼿法を1つのデータベースでセキュアに管理 • 品質と鮮度の⾼いビジネスデータと、ベクトルデータを、

    ⼀つのデータベースに集約し、SQLで検索可能 • RAG精度向上の⼿法を、SQL機能で実現し、検索精度を向上 • ドキュメントのテキスト化からベクトル変換までデータベース内で実施 データ⼀貫性維持と、開発⽣産性向上を実現 • データベースの持つ堅牢なアクセスコントロール スケーラビリティ、⾼可⽤性 • データ整合性を保持しながら、スケールアウトを可能に • Exadata Cloudの持つ、⾼性能、⾼可⽤性を活⽤ 充実のツール群 • ドキュメントローダー、テキストスプリッターのプロシージャ • ONNXモデルをインポートし、データベース内でベクトル化 • プロンプトエンジニアリングのプロシージャ 37 Copyright © 2024, Oracle and/or its affiliates 分類 価格 テキスト ベクトル(テキスト) 画像 ベクトル(画像) 0 001 ¥1,000 AAA…… 0.1, 0.2, 0.6. .... 0.5, 1.5, 2.6, .... 1 002 ¥2,000 BBB…… 0.8, 0.1, 0.4. .... 1.0, 0.9, 1.6, .... 2 003 ¥3,000 CCC…… 0.5, 0.3, 0.9. .... 0.6, 1.1, 1.3, .... 7623 SQL SQL Single Source of Truth Oracle Database 23ai AI Vector Search
  31. Oracle Database 23aiを⽤いたRAGの構成 38 Copyright © 2024, Oracle and/or its

    affiliates アプリケーション LLM 様々なデータソース ⾮構造化データ 構造化データ SFDC SAP Confluence SharePoint 販売実績 顧客 製品マスタ … Workday Snowflake ServiceNow IoT ②クエリー (SQL) ①質問 ⑥回答 ④回答⽣成指⽰ (質問 + 検索結果) ⑤回答 ③検索結果 データの取り込み同期・チャンク・インデックス・ベクトル化 GoldenGate GoldenGate Stream Analytics Integration Data Flow … コンバージドデータベース
  32. Getting started Oracle Database 23ai w/ python-oracledb 1/3 39 Copyright

    © 2024, Oracle and/or its affiliates import array from langchain_community.embeddings.oci_generative_ai import OCIGenAIEmbeddings import oracledb embeddings = OCIGenAIEmbeddings( auth_type="INSTANCE_PRINCIPAL", model_id="cohere.embed-multilingual-v3.0", service_endpoint=service_endpoint, compartment_id=compartment_id, ) with oracledb.connect(user=un, password=pw, dsn=dsn, ...) as connection: with connection.cursor() as cursor: create_table_sql = """ CREATE TABLE IF NOT EXISTS DEMO ( ID NUMBER PRIMARY KEY, TEXT CLOB, VECTOR VECTOR(1024) ) """ cursor.execute(statement=create_table_sql) 新しくVECTOR型がサポートされた エンベディングに使うクライアントを宣⾔
  33. Getting started Oracle Database 23ai w/ python-oracledb 2/3 40 Copyright

    © 2024, Oracle and/or its affiliates docs = [ "⼈⼯知能は1956年に学問分野として設⽴されました。", "アラン・チューリングは⼈⼯知能の研究を⼤規模に⾏った最初の⼈物です。", "ロンドンのマイダ・ベールで⽣まれたチューリングは、イングランド南部で育ちました。", ] vectors = embeddings.embed_documents(texts=docs) data = [ {"id": i, "text": docs[i], "vector": array.array("f", vectors[i])} for i in range(len(vectors)) ] with oracledb.connect(user=un, password=pw, dsn=dsn, ...) as connection: with connection.cursor() as cursor: insert_data_sql = """ INSERT INTO DEMO (ID, TEXT, VECTOR) VALUES ( :id, :text, :vector ) """ cursor.executemany(statement=insert_data_sql, parameters=data) connection.commit() Pythonの配列 (array.array()) を使ってデータの挿⼊が可能
  34. Getting started Oracle Database 23ai w/ python-oracledb 3/3 41 Copyright

    © 2024, Oracle and/or its affiliates def output_type_handler(cursor, metadata): if metadata.type_code is oracledb.DB_TYPE_VECTOR: return cursor.var(metadata.type_code, arraysize=cursor.arraysize, outconverter=list) query_vector = embeddings.embed_query("アラン・チューリングはだれですか︖") parameters = {"query_vector": array.array("f", query_vector)} oracledb.defaults.fetch_lobs = False with oracledb.connect(user=un, password=pw, dsn=dsn, ...) as connection: connection.outputtypehandler = output_type_handler with connection.cursor() as cursor: vector_search_sql = """ SELECT ID, TEXT FROM DEMO ORDER BY VECTOR_DISTANCE(:query_vector, VECTOR) FETCH FIRST 2 ROWS ONLY """ cursor.execute(statement=vector_search_sql, parameters=parameters) for row in cursor.fetchall(): print("row:", row) 任意: VectorデータをPythonの リストに変換するハンドラー SQL⽂でベクトル検索 ⼊⼒クエリに類似するレコードを検索 row: (1, 'アラン・チューリングは⼈⼯知能の研究を⼤規模に⾏った最初の⼈物です。') row: (2, 'ロンドンのマイダ・ベールで⽣まれたチューリングは、イングランド南部で育ちました。')
  35. 参考: Oracle Database 23aiから提供されている便利機能 DBMS_VECTOR_CHAINパッケージ ドキュメントのテキストデータ化、テキストデータのチャンク分割、ベクトル化のすべての処理をデータベース内で実⾏可能 CHAINパッケージという名前の通り、それぞれのパッケージの⼊出⼒形式が連動している 42 Copyright ©

    2024, Oracle and/or its affiliates PDF Word HTML etc. ベクトルデータ チャンクテキスト テキスト ドキュメント chunk vector --- --- --- --- --- UTL_TO_TEXT ドキュメントデータの 構造解析を実⾏し テキストデータに変換 UTL_TO_CHUNKS テキストデータを チャンクテキストに分割 UTL_TO_EMBEDDINGS 埋め込みモデルを使い チャンクテキストを ベクトルデータに変換
  36. 参考: HeatWave (旧称: MySQL HeatWave) オブジェクト・ストレージ内のデータのクエリに最適化されたスケールアウト型データ処理エンジン 43 Copyright © 2024,

    Oracle and/or its affiliates HeatWave GenAI HeatWave Lakehouse HeatWave MySQL HeatWave AutoML HeatWave • インデータベースLLM • ベクトル・ストアを⾃動化 • スケールアウト対応 • HeatWave Chat • オブジェクト・ストレージのデー タに対応 • ⽐類なきパフォーマンスと価 格設定 • MySQL のデータとオプション で利⽤可能 • MySQL のクエリを圧倒的に ⾼速処理 • ETL不要でリアルタイム分析 可能 • ⾼度なセキュリティ機能 • データベース内蔵ML • MLモデル構築を⾃動化 • データベース内・オブジェクト・ ストーレージのデータを使って トレーニング・モデル⽣成可 能 HeatWave Autopilot • HeatWaveの機械学習を活⽤し⾃動化 • パフォーマンスと価格性能⽐を⾃動的に向上 • DBAと開発者の双⽅の⽣産性を向上
  37. 参考: HeatWave GenAI - インデータベースLLMとデータベース内ベクトル処理を提供 業界初のインデータベースLLMと⾃動化されたインデータベース・ベクトル・ストア 44 Copyright © 2024,

    Oracle and/or its affiliates Applications HeatWave Object store Pretrained models In-database LLM ⾃然⾔語による 質問 ⾃然⾔語による 回答 Augmented prompt Vector Store HeatWave Chat > CALL sys.ML_RAG(“What is HeatWave?", @NL_response, @optional_search_parameters); Embedding Generation HeatWave AutoML
  38. LLMアプリケーションの運⽤ 作成したLLMを活⽤したアプリケーションをユーザーに継続的に利⽤してもらうには継続的な改善が必要 • 出⼒プロンプトの精度改善 • TTFTの改善 改善のために必要な情報を収集し、それを活⽤することが重要 • ユーザーの⼊⼒に対して、検索システムからどのような結果が返却されているのか︖ •

    プロンプトやモデルパラメーターの改善後に精度やユーザーの満⾜度はどれくらい変化しているのか︖ • 回答⽣成までの過程でプロンプトがどのように変化しているのか︖ • 回答⽣成までの過程でどこにどれくらいの時間がかかっているのか︖ 46 Copyright © 2024, Oracle and/or its affiliates
  39. Langfuse https://github.com/langfuse/langfuse LLMエンジニアリングのためのプラットフォーム • Self-hosed, Managed版(無償枠あり)を提供 • 提供機能 • オブザーバビリティ

    - LLMアプリケーションの計装 + トレース情報の連携 • プロンプト管理 - プロンプトのバージョン管理、デプロイ • プロンプトエンジニアリング - プロンプトのテストが可能(Self-hostedは⾮対応) • 分析 - LLMの推論実⾏にかかったコスト、レイテンシー等がダッシュボードから確認可能 • 評価 - LLMが⽣成した回答に対する評価が可能(⼀部、Self-hostedは⾮対応) • テスト - データセット(⼊⼒と期待される回答)に対して、ベンチマークが可能 • あらゆるLLMアプリケーション、モデルに対して統合が可能 • Python, JavaScript/TypeScript SDK, OpenAI SDK, LangChain, LlamaIndex, … 47 Copyright © 2024, Oracle and/or its affiliates
  40. Self-hosted版のインストール⼿順 Dockerの場合︓ Kubernetesの場合︓ 参考: https://github.com/shukawam/manifests/blob/main/app/langfuse.yaml 48 Copyright © 2024, Oracle

    and/or its affiliates docker container run --name langfuse ¥ -e DATABASE_URL=postgresql://hello ¥ -e NEXTAUTH_URL=http://localhost:3000 ¥ -e NEXTAUTH_SECRET=mysecret ¥ -e SALT=mysalt ¥ -p 3000:3000 ¥ -a STDOUT ¥ langfuse/langfuse helm repo add langfuse https://langfuse.github.io/langfuse-k8s helm repo update helm install langfuse langfuse/langfuse
  41. オブザーバビリティ LLMアプリケーションに対する計装とトレース情報の連携が可能 • Langfuse SDK: Low-level SDK or Decorator •

    Integrations: OpenAI SDK, LangChain, LlamaIndex, LiteLLM, Flowise, Langflow 49 Copyright © 2024, Oracle and/or its affiliates トレースとスパン スパンの属性情報 e.g. レイテンシー、モデル名、モデルパラメータ、コスト、etc.
  42. langfuse = Langfuse( secret_key=secret_key, public_key=public_key, host=langfuse_host ) trace = langfuse.trace(name

    = "tracing example") span = trace.span( name="embedding-search", metadata={"database": "mock database"}, input={"query": query} ) document = search(query) span.end(output=document) generation = trace.generation( name="Text Generation", model="cohere.command-r-16k", model_parameters={"maxTokens": "512",...}, input=[{"role": "system", "content": ...}] ) response = generative_ai_inference_client.chat( ... 省略 ... ) generation.end(output=response.data.chat_response.text) オブザーバビリティ Low-level SDKを使⽤する場合 50 Copyright © 2024, Oracle and/or its affiliates トレース開始 スパンの宣⾔ ジェネレーションの宣⾔ (LLMの⽣成タスク⽤の特殊なスパン) Langfuseのクライアント宣⾔
  43. オブザーバビリティ Decoratorを使⽤する場合 計装したい関数にデコレーターをつければ、スパンの作成 + 属性情報が⾃動で収集される 51 Copyright © 2024, Oracle

    and/or its affiliates @observe() def search_with_decorator(query: str) -> dict: time.sleep(2) return {"text": "「Oracle Cloud Hangout Cafe」(通称「おちゃかふぇ」/以降、OCHaCafe)は、..."} @observe(as_type="generation") def generate_text_with_decorator(query: str, **kwargs) -> dict: document = search_with_decorator(query=query) res = generative_ai_inference_client.chat( chat_details=ChatDetails( compartment_id=compartment_id, serving_mode=OnDemandServingMode( model_id="cohere.command-r-16k" ), chat_request=CohereChatRequest( message=query, max_tokens=512, documents=[document] ) ) ) return res.data スパンの宣⾔ ジェネレーション(LLM⽣成タスク⽤の特殊なスパン)の宣⾔
  44. オブザーバビリティ LangChain Integrationを使う場合 Langfuseから提供されているLangChainのCallbacks実装を使うと、⾃動的にトレースの作成を⾏う 52 Copyright © 2024, Oracle and/or

    its affiliates langfuse_handler = CallbackHandler( secret_key=secret_key, public_key=public_key, host=langfuse_host ) chat = ChatCohere( model="command-r-plus", cohere_api_key=api_key ) prompt1 = ChatPromptTemplate.from_template("{person}はどの街出⾝ですか︖") prompt2 = ChatPromptTemplate.from_template("{city}はどの国ですか︖この質問を{language}で答えてください。") chain1 = prompt1 | chat | StrOutputParser() chain2 = ( {"city": chain1, "language": itemgetter("language")} | prompt2 | chat | StrOutputParser() ) chain2.invoke( {"person": "徳永家康", "language": "スペイン語"}, config={"callbacks": [langfuse_handler]} ) LangChainのCallbacksを宣⾔ 使⽤するチャットモデルの宣⾔ LangChainのCallbacksシステムにLangfuseの実装を渡す
  45. プロンプト管理 LLMアプリケーションが使⽤するプロンプトをLangfuseで管理し、それをSDKから使⽤することができる • アプリケーションの再デプロイなしで新しいプロンプトがデプロイ可能 • ⾮技術者でもLangfuse Consoleからプロンプトの作成と更新が可能 • プロンプトのロールバックが可能 •

    トレースと組み合わせることで、プロンプトのバージョンごとにパフォーマンスが追跡可能 53 Copyright © 2024, Oracle and/or its affiliates langfuse = Langfuse( ... 省略 ... ) chat = ChatCohere( model="command-r-plus", cohere_api_key=api_key ) chat_prompt = langfuse.get_prompt( name="simple-chat-prompt", type="chat” ) chat.invoke( chat_prompt.compile(person="徳永家康"), config={"callbacks": [langfuse_handler]} ) Langfuseで管理している プロンプトを取得
  46. 評価 LLMアプリケーションの品質向上のために、LLMが⽣成した回答に対する評価が可能 評価⽅法も複数サポート • ⼿動アノテーション: Langfuse Consoleから⼿動で評価 • ユーザーのフィードバック: サムズアップ/ダウン(👍,

    👎)、1~5つ星の評価、ページの滞在時間、etc. • モデルによる評価: Langfuseが管理する評価⽤モデル or 外部ライブラリ(OpenAI Evals, LangChain Evaluators, …)で評価 • LangfuseのAPI/SDKを⽤いた評価: ユーザー独⾃の評価ルールに基づいて評価 Langfuseでは、評価メトリクスは常にトレースに関連づけられるように設計されている 55 Copyright © 2024, Oracle and/or its affiliates
  47. 評価の実装例 56 Copyright © 2024, Oracle and/or its affiliates chat

    = ChatCohere(model="command-r-plus", cohere_api_key=api_key) messages = [HumanMessage(content="OCHaCafeとはなんですか︖")] res = chat.invoke(messages, config={"callbacks": [langfuse_handler]}) langfuse = Langfuse( secret_key=secret_key, public_key=public_key, host=langfuse_host ) langfuse_handler = CallbackHandler( secret_key=secret_key, public_key=public_key, host=langfuse_host ) trace_id = langfuse_handler.get_trace_id() trace = langfuse.score( name="user-feedback", trace_id=trace_id, value=0, comment="OCHaCafeは、お茶をテーマにしたユニークなカフェではありません。" ) response content='OCHaCafe(オチャカフェ)は、 お茶をテーマにしたユニークなカフェです。お茶の⽂化と現 代的なカフェの雰囲気を融合させた空間を提供し、 伝統的なお茶から斬新なお茶まで、 様々な種類のお茶を楽しむことができます。...' トレースに評価 メトリクスを紐づける
  48. OCI Region LLMのエコシステムを活⽤したAIチャットボット • LLMが学習していない内容をデータストアを活⽤し、LLMのテキスト⽣成に含めて回答させる(いわゆるRAG構成) • データ: OCHaCafe Digest 1,

    2(ThinkIT)の記事内容 • データストア: Milvus on OKE, Oracle Database 23ai (Autonomous Database) • LLMアプリケーションが使うプロンプトや実際のトレース情報、ユーザーのフィードバックなどはLangfuseで管理 59 Copyright © 2024, Oracle and/or its affiliates namespace: milvus namespace: langfuse namespace: ochacafe ochat milvus langfuse Oracle Autonomous Database
  49. 参考 • Retrieval-Augmented Generation for LLM Applications (Early Release) •

    https://learning.oreilly.com/library/view/retrieval-augmented-generation-for/9781098168254/ • Building LLM Powered Applications • https://learning.oreilly.com/library/view/building-llm-powered/9781835462317/ • LangChain • https://www.langchain.com/ • Milvus • https://milvus.io/ • Langfuse • https://langfuse.com/ • デモのコード、セットアップ⽤Notebook • https://github.com/oracle-japan/ochacafe-llm-ecosystem 61 Copyright © 2024, Oracle and/or its affiliates