ドッカーコン

Docker内でLangChainベースのデータベースベースのGenAIアプリケーションを迅速に構築する方法

ハリソン・チェイス(Harrison Chase)氏、LangChain創業者兼CEO

Michael Hunger 氏 (製品イノベーションおよび開発者戦略責任者、Neo4j)

2023年10月20日収録
このプレゼンテーションでは、大規模言語モデルを使用する際の課題と利点について説明し、開発者がDocker内でLangChainベースのデータベースベースのGenAIアプリケーションを迅速にセットアップおよび構築するのに役立つ新しいテクノロジーについて説明します。

写し

私たちがまとめた新しいGenAIスタックでGenAIアプリケーションを構築する方法について話し合うこのワークショップにお越しいただきありがとうございます。 私の名前はHarrison Chaseで、LangChainのCEO兼共同創設者です。 私はMichael Hunger、Neo4jの製品イノベーション責任者です。 今朝の基調講演をご覧になった方もいらっしゃると思いますが、ここでやりたいのは、なぜ、どのように、舞台裏に何があるのか、コードが実際にどのようなものなのか、そしてどのように始めればよいのかについて、もう少し深く掘り下げることです。

このGenAIスタックイニシアチブには、LangChainとNeo4jの4つのパートナーがおり、すべてDockerとOllamaがローカルLLM向けにオーケストレーションしています。 背景を説明するために、大規模言語モデル(LLM)とGenAI全般についてお話ししましょう。 LLMをまだ使ったことがない人はいますか?1。さて、おそらくほとんどの人は何らかの形でChatGPTを使用したことがあるでしょう。

目次

    基礎モデル

    LLMは、基本的に情報を予測するために大量のデータでトレーニングされていた新しいタイプの基盤モデルの一部です。 従来、機械学習モデルは、非常に特殊な目的のためにモデルをトレーニングする非常に賢いデータサイエンティストの領域にありました。 たとえば、法律文書を分析するための法的モデルや、画像内の特定の部分や特定の種類のオブジェクトを認識する画像認識モデルがあったとします。 つまり、非常に特殊な目的のためにモデルを微調整したり、トレーニングしたりする必要があり、これを実現するためには、データサイエンティストが常に多くの具体的な努力をしなければならなかったのです。

    基盤モデルでは、基本的に「よし、大量のデータでモデルをトレーニングしよう」と言われるため、これらすべてが変わりました。 そして、基本的には予測メカニズムを使って、このデータに基づいて、これらのモデルが学習した世界の知識とほぼ同じだと言うのです。 テキスト、画像、動画などのユーザーの入力を、たとえば、情報の生成、検出、情報の抽出など、さまざまな用途に使用できます。 そして、これの本当にクールな点は、これらのモデルが開発者に利用可能になったことです。 データサイエンティストである必要はもうありません。 これについては後で少し説明します。

    また、 2017では、Googleのトランスフォーマーアーキテクチャにより、この種のモデルをトレーニングすることができました。 そして、トレーニング量はかなり増えました。 そのため、これらの大規模なモデルは、現在、何兆もの情報トークンでトレーニングされています。 また、Google、OpenAI、Amazon、Anthropic、Meta、そしてもちろんLlamaなど、あらゆる種類のプロバイダーのモデルがあります。 世の中にはたくさんのモデルがあるんですね。 そして、興味深いことに、特定のトレーニングサイズから、突然、これらのモデルが創発的な動作を示し始めました。 あるレベルまでは、何とか期待できても、ある程度のトレーニングサイズになると、急にもっと増えたような気がする閾値のようなものがありましたよね? 例えば、ある程度の理解や擬似的な人間同士の相互作用は、現在私たちが43目にしているような、ある種の擬似的な人間同士の相互作用が可能でした。

    また、非常に興味深いのは、これらのモデルが会話を行えるようになったことです。 以前のコンテキストを保持できます。 より大きなコンテキストウィンドウなどで作業できるため、その上にはるかに自然に動作するアプリケーションを構築できます。 では、なぜ今、こんなに暑いのでしょうか?

    LLMでできることはたくさんあります。 電卓やコンピューターのような汎用ツールのようなものですよね? ですから、LLMがあなたに取って代わるわけではありませんが、LLMはあなたを速くしたり、より生産的になったり、より賢くしたりします。 LLMを使用すると、多くのデータ取得タスクを自動化できます。 モノからデータ情報を抽出するために、特定のモデルをトレーニングする必要はありません。 エンド ユーザー エクスペリエンスは、組織内だけでなく組織外でも向上させることができます。 たとえば、データベースがある場合、以前は、データにアクセスするために、ユーザーがアプリを作成するか、SQLなどのクエリ言語を自分で作成する必要がありました。 これで、データについて自然言語で質問する人が増え、本当にうれしいです。

    そしてもちろん、私たちは皆、情報に惹かれます。 また、LLMは私たちを助けたり、一般的な基盤モデルは、この情報をより理解したり、すばやく要約したりするのに役立ちます。 もちろん、罠はありますよね? 一方の側では、LLMは情報を生成するために使用され、他方では、情報を再度要約するために使用されるため、情報の要約バージョンを送信することもできます。 ですから、一般的な空間にも多くの罠があります。 特に開発者にとって、コージェネレーションは本当にクールです。 Copilot を使用したことがある方も多いと思いますが、Duet AI など、他にも多くのツールがあります。 これは、自然言語からのSQL生成、または自然言語からの情報生成です。 私たち開発者がもっとうまくやれることはたくさんあります。 それで、基本的には5日かかっていたことが、これまで使われていなかった新しいものを作るために2〜3時間に短縮できるという、本当に良い記事を見ました。

    課題

    GenAIにはいくつかの課題がありますよね? 一つは幻覚のようなもので、オウム返しですよね? 「わからない」と言うのではなく、でっち上げているだけです。 人間のフィードバックによる強化学習は、基本的にこれらのモデルを「ああ、私は常に人間を喜ばせなければならない」というようなものにしましたよね? ですから、「わからない」と言う代わりに、たとえそれがすべて偽物であっても、彼らは非常に説得力のある情報、リンク、その他のものを生成します。 このようなシステムをアプリケーションや企業に導入したくないため、これは大きな問題です。 これらのモデルを信頼できるようにする必要があります。

    そして、トレーニングデータのカットオフが大きな問題です。 なぜなら、これらのトレーニング済みモデルはすべて特定の日に送られ、その後に得られるすべての情報はどうなるのでしょうか? または、これらのモデルを使用して、独自のデータベースにある独自の個人情報にどのようにアクセスしますか? 現在、Webなどにアクセスするためのプラグインがある可能性はありますが、データベースなどはどうなるのでしょうか? そして、セキュリティコンプライアンス、PIAなどを保持する必要があります。

    彼らは言語理解に長けており、私たちはそれを何のために使っているのです。 ですから、基本的には彼らの言語スキルだけを使い、彼らが使われたトレーニングデータはすべて無視しています。 それで、また幻覚が、とても自信に満ちていて、でっち上げている。 たまに、私が何かを話しているような感じですよね? インポスター症候群のように。 私はすでにこれらのほとんどについて言及しました。 また、倫理的な側面もすべてです。 そのデータはどこから来たのでしょうか? たとえば、著者やアーティストがトレーニングにデータを使用することに対して報酬は支払われていますか? 人や大企業は、データにどのようなモデルラベルを付けていますか? 労働と搾取の側面があります。 だから、いろんなものがある。 迅速な注射は、まったく十分なサービスを受けていない大きなトピックです。

    課題はたくさんあるので、一つ一つ解決していく必要がありますが、一般的には、最終的にはネガティブなことよりも有益なことだと思います。 ですから、私はネガティブな立場ではありません。

    LLMのこれらすべての課題で、どうすればLLMを改善できますか? いくつかのオプションがあります。 既存のモデルを使用して微調整することもできますが、それは大変な労力です。 そして、多くの場合、アウトプットと結果は、少なくとも今日では、システムモデルに取り入れて微調整したいものではありません。 LLMと話すときに、いくつかの例を提供できます。 しかし、基本的にはこれらの例をハードコーディングする必要があり、あまり役に立ちません。 そして、グラウンディングや検索の補強についてですが、これは基本的に、ユーザーの質問に答えるためにLLMが使用すべき情報をLLMに提供することです。 そして、要約の言語スキルを使ってそこにたどり着くのです。 しかし、今は開発者にとって本当に良い機会があります。

    相互 作用

    私たちが今生きているこの世界で最もエキサイティングなことの1つは、これらの非常に強力な機械学習モデルと対話するためにデータサイエンティストである必要がないことです。 人々が使っている主なものの多くは、APIのすぐ後ろにあります。 つまり、OpenAI は API の背後にあり、Anthropic は API の背後にいるため、非常に簡単に操作できます。 また、今回使用する Ollama のような非常にエキサイティングなパッケージもありますが、これらはローカルでホストされるモデルですが、非常にうまくバンドルされています。 モデルをトレーニングする必要がなくなりました。あなたはそれを実行し、それを提供する必要があります。 そして、Ollama はそれを本当に簡単にします。 ですから、このような大規模言語モデルを誰が使えるかという民主化が進んでいます。

    やるべきこともあります。 何も残っていない完成したプロジェクトではなく、みんなで夕日に向かって出航するだけです。 これらの言語モデルを使用するには、多くの作業を行う必要があります。 つまり、プロンプトはまったく新しい種類の規律が出現したのです。 これらの言語モデルでは、通常、テキストを入力および出力テキストとして受け取ります。 また、出力テキストは、多くの場合、ユーザーへの応答か、下流で何かを行う方法を示すものです。 そのため、最適な結果が得られるような出力テキストを取得できることが非常に重要です。 そのための方法は、言語モデルに渡す文字列を慎重に構築するプロンプトを使用することです。

    プロンプト以外のものも言語モデルに影響します。 これらのモデルには温度のようなものがあり、反応のランダム性に影響を与えます。 また、本当に確定的な出力が必要な場合、または決定論的な出力にかなり近い場合は、温度を非常に低く設定できます。 よりクリエイティブで可変的な応答が必要な場合は、非常に高く設定します。 そして、常に正しい人はいません。 これらは、さまざまなアプリケーションに役立ちます。 ですから、世の中には、おそらくかなり高い温度を持っているものがあるでしょう。 特定のことを本当にうまくやりたいと思っているパーソナルアシスタントの中には、体温が低い人もいます。 そのため、これらのモデルを最大限に活用するために、開発者が学習し、エキスパートになることができる多くの手法とトリガーがあります。

    また、言語モデルの出力を使用するようなものもすべてあります。 そこで、LangChainの出番です。 アイデアは、出力がテキストである可能性がありますが、多くの場合、単なるテキストよりも多くの構造を持っています。 そのため、解析して処理し、API への入力として使用したり、SQL コマンドを実行したりできるように、正しい方法で構造化されていることを確認する必要があります。 そのため、これらの言語モデルを他のデータや計算ソースに接続するには、多くの作業が必要です。

    前にもお話ししたように、ファンデーションモデルには多種多様なものがあると思います。 主要なクラウドプロバイダーがこぞって参入しています。 Olamaのようなローカルモデルがあり、誰でも自分のコンピュータで実行できます。 また、OpenAIやAnthropicのようなAIネイティブのスタートアップもあり、多くのアプリケーションのベースレイヤーのようなものです。 さらに上のレベルには、LangChain、LlamaIndex、HumanLoopなどのオーケストレーションフレームワークがあり、多くの言語モデルを調整し、それらを他のデータや計算ソースに接続するのに役立ちます。 そして、それがRAGアプリでどのように見えるかを詳しく説明します。

    そうすれば、これらすべてを網羅するインフラができあがります。 デプロイ、監視、評価、ツールがあります。 その多くはソフトウェアエンジニアリングと似ていますが、LLM固有のツールにもいくつかの違いがあります。 今回紹介したLangSmithはその一例ですが、APIレスポンスの監視に重点を置いたものは他にもたくさんあります。 中には、MLの側面に重点を置き、人々が実際にチャットボットを何に使っているのかを掘り下げるのに役立つものもあります。 このインフラストラクチャのカテゴリでは、多くの新しいツールが登場しています。

    そして、Michaelが言ったように、本当に良い反応を得るためには、一般的に、接続され、アプリケーションの実際の事実を支えているある種のデータベースが必要です。 そのため、ベクトル検索とベクトルデータベースは、言語モデルに接続するのに非常に強力であることが証明されているこの新しい形式として登場しましたが、SQLやグラフデータベースなどの既存のデータベースもすべて存在し、このコンテキストを提供するために引き続き使用できます。

    ですから、これをもう少し細かい写真で見ると、これはA16 Zからのものであることがわかります。数ヶ月前の話です。 その隣に「部分的」と書かれているのは、空間が本当に、本当に速く変化するからです。 このオーケストレーションレイヤーが真ん中にあり、そこにLangChainがあることがわかります。 しかし、その周りには他にもたくさんの作品があります。 プレイグラウンド、API、プラグインがあります。 トップレベルでは、コンテクスチュアルデータのようなものがあり、データパイプラインやベッティングモデル、ベクターデータベースなどがあります。 そして、もし今日それを拡張するなら、グラフデータベースやSQLなど、他のデータベースもそこに置いておくでしょう。 次に、LLMキャッシュ、ロギング、LLM運用、検証を含むすべてのインフラストラクチャが下部にあります。 さらにズームインすることもできます。 そして、ついにアプリのホスティングにたどり着きます。

    ここで紹介する内容の多くは、表面的には非常に単純なアプリのように見えますが、コードと、これらのさまざまなコンポーネントの舞台裏を多数紹介します。 GenAIスタックの価値提案の一部は、これを少し単純化し、非常に簡単に使い始める方法を提供することです。

    ラングチェーン

    ここまで、LangChainについて少しお話ししてきました。 もう少し掘り下げると、LangChainはGenAIオーケストレーションフレームワークです。 ここに表示されるこれらすべての異なるモジュールに接続します。 ツール、サンプルセレクタ、プロンプト、ベクターストア、ドキュメントローダー、オープンパーサー、テキスト、スプリッター、モデル、おそらくここでは触れていない他のものも。 これらはすべてLangChainの異なるモジュールです。 また、アプリケーションは通常、さまざまな方法で構築された4つ、5つ、または6つの異なるモジュールで構成されています。 そのため、これらすべてのモジュールに一種の標準インターフェイスを提供しています。

    50以上の異なるLLMプロバイダーの標準インターフェースがあります。そして、これらのモジュールのいくつかを自分たちで実装しています。 例えば、テキストスプリッターは、LangChainにある実装の1つで、LangChainのネイティブのようなものです。 LangChainのもう一つの価値提案は、構築済みのチェーンとエージェントです。 前述したように、これらのアプリケーションの多くは、特定の方法で構築されたモジュールです。 既製のチェーンやエージェントは、基本的にさまざまなタスクを実行するための事前構築済みのテンプレートです。 そして、今日はそのうちの1つを使用して、ソースチェーンの検索、QAを行い、舞台裏で何が起こっているのかを掘り下げることができます。 私はそれをマイケルに返して、RAGについてもっと話すつもりです。

    襤褸

    RAGは今日大流行しています。 前述したように、データベースやデータ ソースから言語モデルへの情報のバッキングやフィードは、役に立ちます。 これは、幻覚や知識のようなものにアプローチするための現在の最良の方法です。 RAGは、Retrieval Augmented Generationの頭文字をとったものです。 2年前か1年前かはわかりませんが、私にとっては半年前かはわかりませんが、彼らがこれを探求した論文があり、人々がその価値を認めたので、これは本当に定着しました。 そして、基本的にはLLMのトレーニングデータを無視し、言語スキルだけを使うのです。 ユーザーの質問を受け付けます。 ユーザーの質問をベクトル埋め込みまたはデータベースクエリに変換し、データベースまたはデータソースに送信します。 もちろん、この質問に関連する情報を抽出しますが、データベース内のすべての情報を抽出するわけではありません。 しかし、この質問に関連する情報。 そして、この情報を含む質問をLLMに送信して、その人の回答を作成します。 これは、このパターンでも見られるアプローチの一種です。

    場合によっては、情報を取得するためにデータベースにアクセスする必要があるかどうかを決定することもできます。 例えば、クリエイティブな仕事があるなら、次のプロジェクトのアイデアを出してくれとか。 クリエイティブなタスクの場合は、LLMに直接アクセスすることもできますが、実際に内部データにアクセスしたい場合は、データベースにアクセスしてこれを行います。

    今朝の基調講演でもお見せしたように、今回お話ししたコンポーネントだけでなく、すでにスタックに組み込まれているサンプルアプリケーションも多数あります。 私たちはさらに追加するつもりですし、もちろん、皆さんからのフィードバックにも興味があります。 そのため、アイデアや質問がある場合は、GitHub のイシューを開くか、リポジトリにプルリクエストを送信してください。

    そこにある最初のアプリは、基本的にAPIからデータを取得し、データデータベースを作成し、ベクトルインデックスに埋め込みの埋め込みソースを生成するナレッジグラフのインポートです。 そして、他のアプリがそれを使用できるようにします。

    今朝紹介した2つ目は、LLMと直接やり取りしたり、データベースでRAGを使用したりできるチャットボットです。 また、この質問に答えるための情報がナレッジベースにない場合は、ナレッジベースで基本的に上位または最も評価の高い質問を選択して、社内サポートチームがこの質問に答えるための新しいチケットを生成できますか? そのため、ユーザーの質問からのすべての入力に加えて、ナレッジベースで最も評価の高い質問または最も評価の高い質問のトーンとスタイルとタイプを受け取り、同じトーンとスタイルで新しい質問を生成します。

    次に、そこにある4番目のアプリは、基本的にPDFへのチャットです。 PDFをアップロードすると、チャンクやベクターに変換され、チェーンとUIを使用してストリーミングし、PDFとチャットしたり、このPDFについて質問したりできます。 これは、データベースではないドキュメントをアクセシブルにする方法の一般的な例でもあります。 そして、繰り返しになりますが、すでに何度か言及したように、GenAIスタックのビルディングブロックです。 そして、そのすべてがDocker Composeによってまとめられています。

    Ollama にはまったく新しいベースイメージがあり、特に Linux もそのまま動作します。 LangChainベースのイメージはどちらも公式イメージであり、かなり前から存在していたNeo4jの公式イメージは、Docker Composeセットアップによってすべてまとめられており、基本的には、使用するモデル、長さなど、すべての環境変数をオーケストレーションおよび構成します。 たとえば、接続情報や、どのような内部情報も入れたいかなどです。

    つまり、アプリのフローを見ると、コンテナで話した内容と似ていますよね? ですから、基本的には Streamlit アプリでユーザーの質問に答えることになります — Python 開発者にとって、それがプロトタイプ UI に到達するための最良の方法または最速の方法であるため、現在 UI フレームワークとして Streamlit を使用しています。 API と JavaScript のフロントエンドは必要ありませんが、基本的には Python を直接使用してアプリケーションを実行できます。 そこで、ユーザーの質問を受けて、埋め込みモデルに移動して、ユーザーの質問のベクトル埋め込みを生成します。 たとえば、文変換器だけでなく、ラマ 2、なども使用できます。 埋め込みを取得し、データベース内のデータベクトル検索に移動し、ベクトル検索を行い、グラフデータベースであるため、ベクトル検索から上位K個の要素を取得し、コンテキストを拡張します。

    それで、この質問に他に何が関連していますよね? 最も評価の高い回答は何ですか、タグなどを通じてこれに関連する他の質問は何ですか? 次に、この情報を取得し、LangChainを介してチャットモデル(埋め込みモデルとは異なるモデル)に送信し、回答を返し、アプリにレンダリングします。 それでは、デモを見せて、私が始めて、Harrisonが2番目の部分を見ていきます。

    デモ

    今朝お見せしたように、基本的には「docker compose up」を実行できます。 また、ここで処理を行っている間、作成ファイルを確認することもできます。 そのため、compose ファイルには多数のコンポーネントが含まれています。 ローカル LLM を管理するローカル Ollama の LLM イメージがあります。 基本的に Ollama レジストリからイメージをプルする別のプル モデル イメージ。 したがって、使用するモデルに応じて、このモデルをプルします。 これらのモデルはかなり大きくなる可能性があるため、LLMのような小さなモデルは 27 0億ギガバイト、 4 ギガバイト、 13 10億ギガバイトは 10 ギガバイト、 70 10億は 30 ギガバイトなどです。 これは大量のデータですが、Olamaもこれをローカルに保持しているため、リロードする必要はありません。 したがって、一度プルすると、マシン上にあり、これを実行できます。 次に、データベースNeo4jがここをチェックし、さまざまなアプリがあります。 つまり、ローダーがあり、ボットがあり、PDFボットがあり、それは基本的に、このマシンのさまざまなポートを公開している画像です。 そして、構成はローカル画像の情報を渡すか、開いているAIキーを入力することもでき、GPT3 またはGPT4 をモデルとして使用することもできます。

    その間、私たちの「docker compose down」は成功し、私が始めると、これは基本的にLLMモデル、データベース、およびアプリもプルアップします。 その間、UI でお見せします。 基本的に、ここにはローダーがあり、現在実行されているはずなので、基本的には、興味のある Stack Overflow 技術を選択できます。

    たとえば、Dockerの質問をデータベースに追加するとします。 質問の最後の終了ページ(すべての質問、すべての回答、すべてのユーザー、すべてのタグ)を取得し、これをベクトル埋め込みに埋め込んでから取得します。 そのため、Stack Overflow で Docker に関する最後の 100 つの質問を取得するには、約 10 秒から 20 秒かかります。したがって、過去数日間に質問にも回答した場合、質問はおそらくここにあります。 そのため、グラフデータベースに追加されます。 これで、インポートが成功したことがわかります。 データベースへのリンクで直接ここにジャンプすると、質問、回答、ユーザー、タグを含むこのデータモデルが表示されます。 そして、データベースに移動すると、このデータを探索し、ナビゲートできます。 紫色の質問、青色の質問が回答、オレンジ色のタグが表示され、たとえばこのタグを展開したいと言うと、他のすべての質問もここに表示されます。 私はデータベースなどを作成し、それらすべてにベクトル埋め込みもあるので、基本的にこれらの質問の1つを見ると、ここに質問本文があり、ここにエンティティに直接添付された埋め込みデータがあり、検索用のベクトルインデックスも格納されていることがわかります。

    以上が、データベース自体と、そのデータベースへの入力方法です。 また、Stack Overflow API 呼び出しのみを使用して、Stack Overflow のデータを取得します。 しかし、このデータは、あらゆる場所、あらゆる API、あらゆるデータソースなどから得られることは想像に難くありません。 そして、RAGが無効になっているとき、ボットは最初のモードになります。 基本的に直接使用したLLMであれば、LLMと対話し、たとえば、Docker Scoutの使い方などを言うことができます。 そして、私は情報を選び、それは基本的にあなたに何かを与えますが、私は知りません。 ラマ 2だと思います。 実際にこれに関する情報があるかもしれません。 しかし、今朝の質問を使用すると、LangChainを使用してPDFを要約するにはどうすればよいですか? それから、基本的に私はLangChainについて何も知らないと言います、なぜなら知識が遮断されたのはLangChainが昨年11月にリリースされる前だったからですよね? ええ、それはブロックチェーンだと思っています。 ああ、そうです。 したがって、基本的には、RAGストアに行く同じ質問と比較できます。 したがって、基本的には前に説明したことを行います。 それはあなたの質問を受け取り、それをベクトルに変換し、ベクトルインデックスに行き、グラフデータベース内の上位Kのドキュメントまたは要素を検索し、これらの質問から最も評価の高い、または受け入れられている回答に行き、それらの質問とこれらの回答をLLMに渡して、ここでの質問に答えます。

    舞台裏では多くのことが起こっていますが、コードについても調べます。 これは実際にはデータベースにあるStack Overflowの記事から取られたもので、RAGパターンの本当に良い点の1つは、基本的に参照可能で検証可能なソースを回答から得られることです。 右。 つまり、単に回答を生成するだけでなく、テキストチャンクや情報が基本的に検証されるリンクやURL、その他の種類のソースをLLMに渡すと、LLMに指示して、回答を出力または要約するときに、再生成されたソースリンクとして使用するように促すことができます。 したがって、それらを使用して詳細に入ることができます。 次に、これらのリンクの1つをクリックして、ここで情報を取得できます。

    そして最後のアプリケーションは、前述したように、PDFチャットボットです。 LLMからの回答に満足できない場合は、ドラフトチケットを生成すると言うことができます - それは私が前に述べた他のアプリで、基本的にデータベースから最高評価の情報またはデータベースから最高評価の質問を取得し、その質問のスタイルでも回答を生成します。

    ここでは、基本的にアインシュタインの特許と発明をアップロードし、ファイルに「すべての発明をリストアップする」と言うことができます。 次に、基本的には、pdfから抽出されたこれらのテキストチャンクを再度取得し、最も関連性の高い情報を要約して取得し、回答を返します。 つまり、これは一種の外部なので、これらのアプリはすべてストリーミングアプリです。 API と JavaScript フロントエンドを備えた言語とアプリも追加する予定です。 ですから、これは出発点にすぎません。 そして、基本的には、アインシュタインがブラウスは科学的な発明ではなく実用的な発明であると決定したことがPDFからわかります。

    これらすべてのコードを調べたい場合は、Harrison がもう少し詳しく説明できる点もあるでしょう。 たとえば、LLMのみを使用する関数があり、これらの質問に答えるために役立つヘルプがあることを示すプロンプトがあり、プロンプトテンプレートを使用して人間の質問とシステムメッセージの質問を入力します。 そして、ストリーミング出力を使用します。 ChatGPT と同様に、回答をストリームとして生成します。 だから、ここにこのコールバックがあるのです。 次に、基本的にユーザー入力とコールバックでチェーンを呼び出し、回答の生成を開始します。

    基本的には、LLMのみのチャットを行うために必要なコードはすべてこれだけです。 直接的なものを実行したい場合は、ここにより複雑なコードがあり、プロンプトはもう少し複雑です。 私たちはあなたが見ているもの、そしてあなたがソースとリンクを持っていることをちょっと説明し、そしてこのセクションではデータベースクエリからの要約です。 そして、ユーザーの質問は、ユーザーテンプレートに渡されます。 したがって、各回答にもリンクが必要であるとも述べています。 また、わからない場合は、答えようとしないでください。知らないとだけ言ってください。

    次に、これをシステムと人間のテンプレートのチャットプロンプトに取り込み、ベクトルとナレッジグラフの統合を確認しますが、基本的にはLangChain、ベクターストアパッケージ、または一部からと言うだけです。 Neo4j ベクター ストアを取り込むことができます。 また、必要に応じて他のベクターストアを取り込んで、基本的にこれが私のベクターインデックスであり、これが探すフィールドであると言い、実際にこのグラフを提供し、質問に移動して関連情報を取得してLLMに返すこともできます。 次に、これらすべてを、ベクターをレトリーバーとして構成した検索QAチェーン内で組み合わせます。 上の2つの要素が必要です。 これを増やすことはできますが、要素に渡されるテキストの量が大きくなり、その影響があります。 1つは、例えば、プロンプトの途中にあるものを無視し始めるため、より確率的になることです。 つまり、テキストの量に応じて2〜5個が適切であり、これが質問に答えるために使用されるQAチェーンです。

    これが舞台裏のコードのようなもので、Harrison は、このコードの実行中に実際に何が起こっているのかを把握する方法を少し調べます。

    ええ、もちろんです。 そこで、Michaelが最後に見せたのは、このソースチェーンによる検索QAで、これは、この正確なRAGベースのアプリケーションを実行するための多くのロジックを含むチェーン内のクラスです。 これは、そのクラスだけで簡単に開始できることを意味するので素晴らしいことですが、そのクラスには実際にはかなりの量のロジックが含まれているため、少し理想的ではありません。 そして、これはLangChainの実際にはより単純なクラスの1つでもあります。 より複雑なものの中には、さらに多くのロジックが内部にあるものもあります。

    ラングスミス

    アプリケーションを構築するときは、数行のコードから始めるのは素晴らしいことですが、内部で何が起こっているかを理解して、デバッグと改善を行い、プロトタイプから運用環境に実際に移行できるようにすることが非常に重要です。 そのために、デバッガである LangSmith を作成しました。 多くのことを行いますが、人々がそれを使用する主な目的は、内部で何が起こっているかを正確に確認するためのデバッグと可観測性です。

    ここで見ると、実際には3つの異なるタイプのシーケンスがあることがわかります。 というわけで、これが最初の1つです。 これは、RAGのない最初のLLMコールにすぎません。 そして、これはLLMの非常に単純なプロンプトなので、非常に簡単です。 ただし、LangSmith で実現できる優れた機能のいくつかを披露する例としてこれを使用するだけで、各ステップへの入力と出力が何であるかを正確に確認できます。 関連付けられているメタデータを表示できます。 そして、特にLLMの場所に行くと、実際に小さな遊び場を開いて、それをいじくり回すことができます。 そのため、あちらの設定を確認できます。 入力を変更してから再実行し、出力を取得して基本的にデバッグできます。 これは、複数の LLM 呼び出しのシーケンスがある場合に非常に役立ちます。 たとえば、そのシーケンスの 3 番目のシーケンスをデバッグする場合は、正確な状態、正確な入力変数、および正確なプロンプト テンプレートを再作成する必要があります。 ですから、これらすべてをアプリで独立して行おうとするのではなく、ここで簡単にプレイグラウンドを開くことができます。

    戻ると、チェーンにはさらに2つのタイプがあることがわかります。 これらは実際には非常によく似たチェーンですが、プロンプトが異なるだけです。 したがって、この検索、ソースチェーンによる検索QAを見ると、一連の手順を確認できます。 最初にこの retriever ステップがあり、次にこの StuffDocumentsChain があります。 retriever ステップを見ると、クエリを受け取り、ドキュメントのリストを返すことが行われていることがわかります。 ここでは、返却されているドキュメントが正確に何であるかを調べることができます。 そして、私たちはそれらすべてをここで見ることができます。 この StuffDocumentsChain は基本的にこれらの入力を受け取ります。 つまり、質問があり、チャット履歴があり、これらの入力ドキュメントがあります。 そして、これらは前のレトリーバーステップから来ています。

    そして、内部的には、これらすべてを言語モデルへの最終的な呼び出しに渡しています。 そして、これを再びプレイグラウンドで開くと、マイケルが以前に指摘していたシステムプロンプトが表示されます。 次のコンテキストを使用し、最後に質問に答えます。 コンテキストには、何とか、何とか、何とか、質問が含まれています。 そして、それはここに貼り付けられています。 そして、最後には、ユーザーの質問が表示されます。 LangChainを使ってPDFを要約するにはどうすればいいですか? このプロンプトがどのように表示されるかは、取得手順が完了するまでに正確にわかります。

    ここに戻ると、このチェーンは基本的に同じように見えることがわかります。 そして、何が起こっているかというと、主な違いは渡されるプロンプトです。 そして、これが、プロンプトが言語モデルに実行方法を指示するため、以前に非常に重要だった理由です。 そして、この結果の違いを覚えていれば、どこで参照を取得しますか。 そして、この結果は、そうでない場合、唯一の違いはプロンプトです。 1つのプロンプトは、その回答を含むソースのリストを生成するように指示しており、もう1つのプロンプトはそれを求めていません。 これは、このタイプのプロンプト戦略で得られる多くの柔軟性を示しています。

    アプリケーションの詳細

    それがここで紹介したかったことだと思うので、とりあえずスライドに戻ります。 次の数枚のスライドでは、このアプリケーションの詳細を説明しています。 これらを共有して、多くのオーケストレーションで Docker Compose を使用している内容をより詳細に確認できるようにします。 さまざまなコンテナが引き上げられています。 Ollama — 私たちは彼らのローカルLLMを使っています。 そして、これらは、必要に応じてサブインできる他のLLMです。 そして、これらはすべて、まったく同じインターフェースを持つLangChainとの統合のようなものを持っています。 そのため、それらを交換したり、交換したり、実験したりするのは非常に簡単です。

    基調講演では、あなたやあなたの会社がGenAIのために何を構築するかを把握し、実際にそれに製品市場を適合させるために、基本的にこの迅速な実験段階の重要性について話していた人がいたと思います。 これがLangChainの価値提案の一部であり、この迅速な実験でもあります。 Neo4jは明らかにここでのナレッジグラフです。 そして、Neo4jの大きな利点は、さまざまなコンセプトを視覚化できることです。 ここでも、データを接続します。 その多くは、データをベクターストアに投げ込んでいます。 チェーンで何が起こっているかを視覚化できるのと同じように、ベクターストアに何があるかを正確に視覚化できるのは本当に素晴らしいことです。

    そして、これらすべてのLLMアプリケーションのテーマの1つは、このような確率的性質が加わると、オブザーバビリティが本当に重要になるということです。 これは、私たちがまとめたこのGenAIスタックの大きなボーナスであり、ナレッジグラフでLLMを接地するために使用されるNeo4jのものも同様です。 このインポート手順を確認できます。 インデックス作成のステップも非常に複雑です。 ですから、それ自体は別の話なのでしょう。 このテキストを前処理し、チャンクに分割し、さまざまなタグでベクターデータベースに正確に配置する方法に関して、舞台裏ではさまざまなオプションが進行中です。 この素晴らしい視覚化をここで取得できるようにします。

    LangChainの部分も、これらのさまざまなコンポーネント、つまりアプリを構築する方法のようなものです。 次に、作成されたアプリケーションのいくつかが表示されます。 まず、質問に基づいて回答するこのサポート エージェント ボットです。 Pythonで書かれています。UIはStreamlitにあります。 そして、LLMチェーンはLLMに埋め込むように促し、シーンの下でNeo4jを促します。 具体的には、QAチェーンでユーザーの質問があり、プロンプトを構成して出力を提供し、ソースをリストアップし、UIにレンダリングします。

    Neo4jベクターストアで具体的に何が起こっているのかについては、ここで詳しく説明しますので、質問を渡すベクトルとして埋め込みます。 そのベクトルに関連するドキュメントを検索し、それを戻します。 これは、Michaelが披露したワークフローで、ナレッジベースに回答がない場合にチケットを生成します。 ユーザーの質問をチケットに変えることができます。 というのも、人々がいまだに解明しようとしている大きなことの1つであり、なぜ今、開発者になるのに本当に良い時期なのかは、これらすべてのGenAIアプリケーションにとって適切なUXは何かということだからです。 それらは本当に優れていて、本当に強力である可能性がありますが、完璧ではありません。 では、それをどのように伝えながら、UXに取り入れるもので補っているのでしょうか? そして、これは少しアプリケーション固有のものであり、これもまた、今GenAIiでアプリケーションを構築する絶好の機会である理由です。

    これは、LangChainのドキュメントからのスクリーンショットで、私たちが持っているユースケースのいくつかを紹介していますので、これらのいずれかがあなたの空想を刺激するならば、必ずそれらをチェックしに行きに行きます。 さまざまなユースケースがあり、さまざまな統合もたくさんあるので、それらは反対側にあります。 ですから、クラウドプロバイダーなど、主要なものだけでなく、さまざまなコンポーネントにも多くのものがあることがわかります。 それぞれの下には、取り込むことができるさまざまなタイプのツール、レトリーバー、LLMについて100する50があることはご存じでしょう。LangSmithは、これまで見てきたように、LLMアプリケーションのオブザーバビリティステップのようなもので、どのようなステップを踏むのでしょうか? 各ステップのインプットとアウトプットは何ですか? 現在、プライベートベータ版ですが、今日ここにいるすべての人のためにコードを作成しましたので、ぜひ試してみていただき、そのQRコードでLangSmithにすぐにアクセスできるはずです。 これを見逃した場合は、後で私に会いに来てください。 セットアップできてうれしいです。 これにより、正確なトレースと正確な入力を確認できるこのようなビューが可能になります。 Michaelは、私たちが話してきたこれらすべてのものにアクセスする方法について少し話します。

    起動して実行する

    では、どこで入手できますか? 最も簡単な方法は、ラーニングセンターでDocker Desktopを開くだけで、中央のAIとMLのガイド(GenAIスタック)の下に表示されます。 リンクをクリックすると、基本的にgitリポジトリに移動し、クローンを作成してダウンロードできます。 「docker compose up」を実行すると、起動して実行されているはずです。 他のものを追加する場合、または使用するモデルの種類を変更する場合は、すべて構成にあります。 乞うご期待。そこにはもっと多くのものがあります。

    お気軽にご意見をお寄せください。 10月 26日には開発者会議が開催されますので、このグラフの見方や情報のつなぎ方についてもっと知りたい方は、ぜひお越しください。 すべてのタイムゾーンで 24 時間のコンテンツがあり、100以上の講演があります。 ML/AI は、強力なビジュアライゼーションなど、その大きな側面です。 どうもありがとうございます。

    質疑応答

    質問もできますが、マイクとか持ってないと怒鳴らないといけないので、遠慮なくお願いします。

    つまり、グラフ データベースは、まず第一に、情報をエンティティおよびリレーションシップとして格納する汎用トランザクション データベースです。 したがって、テーブルだけがあるリレーショナル データベースとは異なり、エンティティは 1 つのタイプのオブジェクトとして、リレーションシップは別のタイプのオブジェクトとして持っています。

    ベクトルデータベース、またはより一般的にはベクトルインデックスは、多次元浮動小数点と情報の本質のコーディングを取るインデックスです。 そして、ベクトル埋め込みでのベクトル符号化は、多次元ベクトル空間における文章の本質、この写真の本質、この単語やビデオの本質など、というようなものです。 そして、ベクトルデータベースのこれらのベクトルインデックスは、基本的に特定のベクトルを見つけることを可能にします。

    あなたが質問するように、私のデータベース内で、距離または角距離、余弦またはユークリッド距離のいずれかですでに存在する他のベクトルに最も類似している、または最も近いものは何ですか? ベクトルデータベースは基本的に、既存のベクトルを大量に取得し、入力に最も近いベクトルを見つける非常に高速なアルゴリズムです。 他にも多くのベクターデータベースがあり、例えば松ぼっくりなどです。 しかし、Neo4j、MongoDB、Postgresなどの他の多くのデータベースは、通常のデータベースにベクトルインデックスを追加しているため、通常のデータベースとベクトル検索を併用する利点があります。 したがって、ベクトル検索だけを行い、それ以外は何も行わないという非常に狭いユースケースがあり、ベクトルデータベースが適しているが、データベースに既存のデータがすべてある場合は、データベースのベクトル検索機能をそのまま使用できます。

    では、ベクトルデータベースで何をしたいのか、プロンプトを出すと言えますか? AIにプロンプトの作成を依頼するというコンセプトについて読みました。 その場合、アイデアなどはありますが、デジタルプロンプトのように役立ちます。

    プロンプトを取り、LLMにそれを改善するように依頼するという流れでいくつかの研究論文がありました。 実装はあると思います。 APE(オートマチック・プロンプト・エンジニア)というものがある。 というのも、LLMがうまくいかない場合、スペースや物があってはならないところに余分なスペースがあるわけではないからです。 MidJourneyのプロンプトを見ると、ランダムな文字のようなものがありますよね? そして、どの単語を並べるべきかを考えるための一種の芸術があります。

    LLMはそうではないと思いますし、失敗すると、根拠となるデータがなかったり、指示が明確でなかったりするなど、答えるべき正しい文脈が欠けていることが多いと思います。 したがって、指示が明確でなくても問題ありません。 私がより強気なのは、LLMを使って、人間がプロンプトにもっと多くのものをもたらすことができる方法を提案するというアイデアかもしれません - LLMが自動的にその情報を持ち込むのは難しいと思うので、必ずしも自分でやるわけではありませんが、どのようなことを言うかは明確ではありません。

    ありがとうございます。

    さらに詳しく

    この記事には、DockerCon 2023のプレゼンテーションの YouTube トランスクリプトが含まれています。 「How to Quickly Build LangChain-based, Database-Backed GenAI Applications within Docker」は、LangChainの創業者兼CEOであるHarrison Chase氏と、Neo4jの製品イノベーションおよび開発者戦略責任者であるMichael Hunger氏によって発表されました。

    自分に合ったサブスクリプションを見つける

    今すぐ専門家に連絡して、Dockerサブスクリプションのコラボレーション、セキュリティ、サポートの完璧なバランスを見つけてください。