Slide 1

Slide 1 text

LLMのエコシステム Oracle Cloud Hangout Cafe Season8 #6 Shuhei Kawamura Solutions Architect, Oracle Digital/ISV Solutions Oracle Corporation Japan

Slide 2

Slide 2 text

⾃⼰紹介 Copyright © 2024, Oracle and/or its affiliates 2 @shukawam X/GitHub/Qiita 川村 修平 (Shuhei Kawamura) オラクル・デジタル / ISVソリューション本部 ⽇本オラクル株式会社 コミュニティ • OCHaCafe • CloudNative Days – Observabilityチーム ひとこと • 暑くて夏バテ気味、冷や汁最⾼

Slide 3

Slide 3 text

アジェンダ 1. 前提知識: LLMとは︖RAGとは︖ 2. LLMのエコシステム 1. オーケストレーション – LangChain 2. ベクトルデータベース – Milvus, Oracle Database 23ai 3. LLMOps – Langfuse 3. デモ 3 Copyright © 2024, Oracle and/or its affiliates

Slide 4

Slide 4 text

話すこと・話さないこと 話すこと • 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

Slide 5

Slide 5 text

前提知識: LLMとは︖RAGとは︖ 5 Copyright © 2024, Oracle and/or its affiliates

Slide 6

Slide 6 text

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 … ⾔語モデル ⼤規模⾔語モデル

Slide 7

Slide 7 text

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 トークン

Slide 8

Slide 8 text

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"

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

参考: 特にTransformer周りなどもう少し詳細に知りたい⽅ 10 Copyright © 2024, Oracle and/or its affiliates https://oracle-code-tokyo-dev.connpass.com/event/282420/ https://qiita.com/ksonoda/items/b767cbd283e379303178

Slide 11

Slide 11 text

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 ユーザー ユーザー

Slide 12

Slide 12 text

RAGの代表的な構成例と流れ 12 Copyright © 2024, Oracle and/or its affiliates 検索システム LLM ユーザー アプリケーション 1. 質問 2. 質問に関連する情報 3. 質問 + 関連情報 4. 関連情報を含んだ回答 関連情報に基づいて、質問に回答してください ## 関連情報 OCHaCafeは、⽇本オラクルが主催するコミュニティの1 つです。… ## 質問 OCHaCafeってなんですか︖

Slide 13

Slide 13 text

LLMを活⽤したアプリケーションを作る際に検討が必要なこと LLMが学習していない内容をテキスト⽣成に含めたい • 企業独⾃のデータ、学習時点以降の最新データ、etc. LLMやデータソースを含む周辺のコンポーネントとの連携を効率的に実装したい • 周辺のコンポーネント例: データストア、キャッシュストア、オブザーバビリティ、⼊出⼒のバリデーション、etc. アプリケーションを継続的に改善するための仕組みを導⼊したい • ユーザーからのフィードバックを取り込み、それを改善に活かすための仕組み • ユーザー体験を改善するために必要なデータの取得 • e.g. ユーザーがプロンプトを⼊⼒してからテキストが返却されるまでに各ステップでかかった時間 13 Copyright © 2024, Oracle and/or its affiliates データストアなど周辺のコンポーネントをきちんと使いこなすことが重要

Slide 14

Slide 14 text

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の出⼒のために提供するコンテキスト・データの流れ ユーザーから提出されたクエリーの流れ ユーザーに返却する出⼒の流れ

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

LLMのエコシステム オーケストレーション – LangChain 16 Copyright © 2024, Oracle and/or its affiliates

Slide 17

Slide 17 text

お断り • 2024/07現在の最新版(v0.2)に基づいて資料は作成されています • サンプルコードは、紙⾯の都合上インポートするライブラリ等いくつか割愛して記載しているものもあります • https://github.com/oracle-japan/ochacafe-llm-ecosystem 17 Copyright © 2024, Oracle and/or its affiliates

Slide 18

Slide 18 text

RAGの実装上の課題 アプリケーションのコードには、各コンポーネントとの連携に関するすべてのコードをきちんと実装する必要がある • LLM • ⼊⼒を渡し、⽣成結果を取得するための⼀連の⼿続き • データストア • ⼊⼒をもとに関連データを取得するための⼀連の⼿続き • データを格納するための⼀連の⼿続き • ドキュメントのローディング、チャンキング*、埋め込みベクトルの取得、データの保存、etc. • … *: ⼤きなテキストを⼩さな部分に分割すること 18 Copyright © 2024, Oracle and/or its affiliates お決まりの⼿続きは、ライブラリやツールにオフロードして楽に実装したい

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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 は、世界中の⼈々が⽇本の茶道の美しさと奥深さを発⾒できるようにすることを使命としています。…

Slide 21

Slide 21 text

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, ...

Slide 22

Slide 22 text

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 以下の主要なものを抽出

Slide 23

Slide 23 text

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に実⾏される

Slide 24

Slide 24 text

LCELを使うメリット 1/2 ストリーミングのサポート • 可能な限り最良のTTFT(time-to-first-token: 出⼒の最初のチャンクが得られるまでの経過時間)が得られる 同期/⾮同期APIのサポート • コードを変更することなく同期/⾮同期APIの両⽅で呼び出すことができる • i.e. Jupyter Notebookのようなプロトタイプと本番で同じコードを使うことができる 最適化された並列実⾏ • 並列実⾏可能なステップがある場合は、可能な限り最⼩のレイテンシで⾃動的に実⾏される リトライとフォールバック • チェーンの任意の部分にリトライ、フォールバックが設定可能 • チェーンの信頼性向上に繋がる • ※ストリーミングは現在⾮対応 24 Copyright © 2024, Oracle and/or its affiliates

Slide 25

Slide 25 text

LCELを使うメリット 2/2 中間結果へのアクセス • 最終的な出⼒が出る前の結果にアクセスすることができる • デバッグ⽤途やエンドユーザーに何が起きているか知らせるのに便利に使える LangSmithとのシームレスな統合 • 全てのステップが⾃動的にLangSmithにログとして記録される LangServeで簡単にデプロイ • LCELで作成したチェーンは、LangServeを使って簡単にデプロイできる 25 Copyright © 2024, Oracle and/or its affiliates

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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 以下の主要なものを抽出

Slide 28

Slide 28 text

よくある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を実現するチェーンの定義

Slide 29

Slide 29 text

参考: 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 顧客データ ベース アプリ ケーション ビジネス・ システム

Slide 30

Slide 30 text

LLMのエコシステム ベクトルデータベース – Milvus, Oracle Database 23ai 30 Copyright © 2024, Oracle and/or its affiliates

Slide 31

Slide 31 text

ベクトルデータベースとは︖ 埋め込みベクトルを他の項⽬とともに保存、検索、管理することを⽬的としたデータベースのこと ベクトル空間に埋め込まれたデータと⼊⼒の類似性をベクトル演算によって評価することができる 実装は、以下の2種類に分類される • 純粋ベクトルデータベース • 埋め込みベクトルを少量のメタデータと共に格納して効率的に管理できるように設計されている • e.g. Milvus, Chroma, Pinecone, Qdrant, … • 統合ベクトルデータベース • RDB, NoSQLなどにベクトルデータを保持する追加の機能を備えたもの • e.g. Oracle Database 23ai, HeatWave GenAI, Neo4j, Elasticsearch(OpenSearch), Redis, … 31 Copyright © 2024, Oracle and/or its affiliates

Slide 32

Slide 32 text

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.)

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

Milvusのアーキテクチャ 34 Copyright © 2024, Oracle and/or its affiliates 引⽤: https://milvus.io/docs/architecture_overview.md

Slide 35

Slide 35 text

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, … コレクションに保存するための埋め込みベクトルを取得

Slide 36

Slide 36 text

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}

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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 … コンバージドデータベース

Slide 39

Slide 39 text

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型がサポートされた エンベディングに使うクライアントを宣⾔

Slide 40

Slide 40 text

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()) を使ってデータの挿⼊が可能

Slide 41

Slide 41 text

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, 'ロンドンのマイダ・ベールで⽣まれたチューリングは、イングランド南部で育ちました。')

Slide 42

Slide 42 text

参考: 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 埋め込みモデルを使い チャンクテキストを ベクトルデータに変換

Slide 43

Slide 43 text

参考: 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と開発者の双⽅の⽣産性を向上

Slide 44

Slide 44 text

参考: 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

Slide 45

Slide 45 text

LLMのエコシステム LLMOps – Langfuse 45 Copyright © 2024, Oracle and/or its affiliates

Slide 46

Slide 46 text

LLMアプリケーションの運⽤ 作成したLLMを活⽤したアプリケーションをユーザーに継続的に利⽤してもらうには継続的な改善が必要 • 出⼒プロンプトの精度改善 • TTFTの改善 改善のために必要な情報を収集し、それを活⽤することが重要 • ユーザーの⼊⼒に対して、検索システムからどのような結果が返却されているのか︖ • プロンプトやモデルパラメーターの改善後に精度やユーザーの満⾜度はどれくらい変化しているのか︖ • 回答⽣成までの過程でプロンプトがどのように変化しているのか︖ • 回答⽣成までの過程でどこにどれくらいの時間がかかっているのか︖ 46 Copyright © 2024, Oracle and/or its affiliates

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

オブザーバビリティ 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.

Slide 50

Slide 50 text

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のクライアント宣⾔

Slide 51

Slide 51 text

オブザーバビリティ 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⽣成タスク⽤の特殊なスパン)の宣⾔

Slide 52

Slide 52 text

オブザーバビリティ 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の実装を渡す

Slide 53

Slide 53 text

プロンプト管理 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で管理している プロンプトを取得

Slide 54

Slide 54 text

分析 Langfuseが収集するさまざまなメトリクスをダッシュボードで参照&分析が可能 • メトリクス – クオリティ/コストとレイテンシー/ボリューム • ディメンション – トレースの名前/ユーザー/リリース or バージョン番号 54 Copyright © 2024, Oracle and/or its affiliates

Slide 55

Slide 55 text

評価 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

Slide 56

Slide 56 text

評価の実装例 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(オチャカフェ)は、 お茶をテーマにしたユニークなカフェです。お茶の⽂化と現 代的なカフェの雰囲気を融合させた空間を提供し、 伝統的なお茶から斬新なお茶まで、 様々な種類のお茶を楽しむことができます。...' トレースに評価 メトリクスを紐づける

Slide 57

Slide 57 text

テスト データセット(LLMアプリケーションの⼊⼒と期待される出⼒の集合)を⽤いてベンチマークを⾏うことができる • データセットは、あらかじめ作成することも本番環境の⼊出⼒結果からも作成可能 • 本番環境にデプロイする前の新バージョンのベンチマークに利⽤ • ベンチマーク: 評価⽤の関数を⾃分で実装 or モデルベースの評価 57 Copyright © 2024, Oracle and/or its affiliates

Slide 58

Slide 58 text

デモ 58 Copyright © 2024, Oracle and/or its affiliates

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

まとめ LLMを活⽤したアプリケーションでは多くの考慮事項が必要 • LLMが学習していないデータを⽣成結果に含めたい • 周辺コンポーネントまで含めて効率的に実装したい • 継続的にアプリケーションを改善するために必要な情報を収集したい LLM含め周辺のエコシステムをきちんと使いこなすことが重要 • 今⽇取り扱ったもの • オーケストレーション → LangChain • ベクトルデータベース → Milvus, Oracle Database 23ai • LLMアプリケーションの運⽤ → Langfuse 60 Copyright © 2024, Oracle and/or its affiliates

Slide 61

Slide 61 text

参考 • 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

Slide 62

Slide 62 text

No content