🦜LangChain表現言語(LCEL)

LangChainは、大規模言語モデル(LLM)を使ったアプリケーションの作成を簡素化するために設計されたフレームワークです。言語モデル統合フレームワークとして、LangChainのユースケースは、文書解析や要約、チャットボット、コード解析など、言語モデル全般のユースケースとほぼ重なっています

https://en.wikipedia.org/wiki/LangChain

LangChainは、機械学習スタートアップのRobust Intelligenceで働いていたハリソン・チェイスによって、2022年10月にオープンソースプロジェクトとして立ち上げられた。プロジェクトは瞬く間に人気を集め、2023年4月、LangChainは法人化し、新しいスタートアップはベンチャー企業Sequoia Capitalから少なくとも2億ドルの評価額で2000万ドル以上の資金を調達し、1週間後にはBenchmarkから1000万ドルのシード投資を発表した[3][4]。
2023年10月、LangChainはLCEL(LangChain Expression Language)のプロトタイプから量産可能なアプリケーションへの移行を促進するために設計されたデプロイツールであるLangServeを発表した

https://amzn.to/40NB1nO

2023年3月現在、LangChainは、Amazon、Google、Microsoft Azureクラウドストレージを含むシステムとの統合、ニュース、映画情報、天気予報のAPIラッパー、要約、構文とセマンティクスのチェック、シェルスクリプトの実行のためのBash、複数のウェブスクレイピングサブシステムとテンプレート、数発学習プロンプト生成のサポートなどを含んでいる; Googleドライブのドキュメント、スプレッドシート、プレゼンテーションの要約、抽出、作成、Google検索とMicrosoft Bingウェブ検索、OpenAI、Anthropic、Hugging Face言語モデル、iFixit修理ガイドとWikiの検索と要約、質問回答、ドキュメントの結合、質問生成のためのMapReduce; PDFファイルのテキスト抽出と操作のためのPyPDF、pdfminer、fitz、pymupdf、PythonとJavaScriptのコード生成、解析、デバッグ、ベクトル埋め込みを保存・取得するMilvusベクトルデータベース[6]、埋め込みとデータオブジェクトをキャッシュするWeaviateベクトルデータベース[7]、Redisキャッシュデータベースストレージ; APIリクエストのためのPython RequestsWrapperおよびその他のメソッド,JSONサポートを含むSQLおよびNoSQLデータベース,ロギングを含むStreamlit,k-nearest neighbors検索のためのテキストマッピング,タイムゾーンの変換とカレンダーの操作,スレッドおよび非同期サブプロセスの実行におけるスタックシンボルのトレースと記録,Wolfram AlphaのWebサイトとSDK. [8]2023年4月現在,50を超えるドキュメントタイプとデータソースから読み取ることができる。

LangChain表現言語(LCEL)

LangChain表現言語(LCEL)は、チェーンを簡単に組み合わせるための宣言的な方法です。LCELは、最も単純な "prompt + LLM "チェーンから、最も複雑なチェーンまで、コードを変更することなく、プロトタイプを本番で使用できるように、初日から設計されました(本番で100以上のステップを持つLCELチェーンの実行に成功した人を見てきました)。LCELを使いたくなる理由をいくつか挙げてみましょう:

https://python.langchain.com/docs/expression_language/

多くの人がOpenAIから始めて、他のモデルを探したいと思っています。LangChainは多くのモデルプロバイダと統合しているので、簡単にできます。LangChainは独自のメッセージAPIとモデルAPIを持っていますが、LangChainモデルをOpenAIのAPIに適応させるアダプタを公開することで、他のモデルをできるだけ簡単に探せるようにしています。
現時点では、これは出力のみを扱い、他の情報(トークン数、停止理由など)は返しません。

https://python.langchain.com/docs/guides/adapters/openai

LangChainのチェインとは、コンポーネントを呼び出す一連のシーケンスのことを指します。チェーンには他のチェーンも含めることができます。
LangChainにはチェーンを構築するための2つのフレームワークがあります。
1つはレガシーなアプローチで、Chainインターフェースを使用する方法です。
もう1つは、LangChain式言語(LCEL)を使用する更新されたアプローチです。新しいアプリケーションを構築する場合は、LCELを使用することをおすすめします。
LCELは、コンポーネントを組み合わせるための直感的で読みやすい構文を提供します。また、ストリーミング、非同期呼び出し、バッチ処理、並列処理などのサポートも提供します。
一方、Chainインターフェースはレガシーなアプローチですが、多くの便利な組み込みチェーンが存在するため、引き続きサポートされています。
ChainとLCELは相互に排他的ではなく、ChainをLCELの中で使用することもできます。
LangChainでは、これら2つのフレームワークを使って、コンポーネントを柔軟に連結することができます。

チェインとは何か?

LLMを単独で使うのは単純なアプリケーションでは良いのですが、より複雑なアプリケーションでは、LLM同士、あるいは他のコンポーネントとLLMを連結する必要があります。
LangChainは、コンポーネントを "チェーン "するための2つのハイレベルなフレームワークを提供します。レガシーなアプローチは、Chainインタフェースを使うことです。最新のアプローチはLangChain Expression Language (LCEL)です。新しいアプリケーションを構築する際には、LCELを使ってチェーンを構成することをお勧めします。しかし、便利なビルトイン・チェインが数多くあり、私たちはそれをサポートし続けています。後述しますが、Chainはそれ自体LCELでも使用できますので、この2つは互いに排他的なものではありません

ストリーミングのサポート
LCELでチェーンを構築すると、可能な限り最良のtime-to-first-token(出力の最初のチャンクが出るまでの経過時間)が得られます。チェーンによっては、LLMからストリーミング出力パーサーに直接トークンをストリーミングし、LLMプロバイダーが生のトークンを出力するのと同じ速度で、解析されたインクリメンタルな出力チャンクを返します。
非同期サポート LCELで構築されたチェーンは、同期API(例:Jupyterノートブックでプロトタイピング中)と非同期API(例:LangServeサーバー)の両方で呼び出すことができます。これにより、プロトタイプと本番で同じコードを使用することができ、優れたパフォーマンスと、同じサーバで多数の同時リクエストを処理することができます。
最適化された並列実行 LCELチェーンに並列実行可能なステップがある場合(例:複数のリトリーバからドキュメントを取得する場合)、同期と非同期の両方のインターフェイスで、可能な限り最小の待ち時間で自動的に実行します。

https://python.langchain.com/docs/expression_language/

リトライとフォールバック LCELチェーンの任意の部分にリトライとフォールバックを設定します。これは、スケール時のチェーンの信頼性を高める素晴らしい方法です。現在、リトライ/フォールバックのストリーミング・サポートの追加に取り組んでいます。
中間結果へのアクセス より複雑なチェーンでは、最終出力が生成される前であっても中間ステップの結果にアクセスすることが非常に便利です。これは、エンドユーザーに何かが起こっていることを知らせたり、単にチェーンをデバッグするために使うことができる。中間結果をストリーミングすることができ、全てのLangServeサーバで利用可能です。
入出力スキーマ 入出力スキーマは、チェーンの構造から推測されるPydanticスキーマとJSONSchemaスキーマを、すべてのLCELチェーンに与えます。これは入力と出力の検証に使用でき、LangServeの不可欠な部分です。
シームレスなLangSmithトレース統合 チェーンが複雑化するにつれ、各ステップで何が起こっているかを正確に理解することがますます重要になってきます。LCELでは、全てのステップが自動的にLangSmithに記録され、最大限の観察可能性とデバッグ可能性を実現します。
シームレスなLangServeデプロイメント統合 LCELで作成されたチェーンは、LangServeを使って簡単にデプロイできます。

https://python.langchain.com/docs/expression_language/

リトリーバーとベクターストア

元の質問(「ラングスミスはテストでどのように役立つのか」)に適切に答えるためには、LLMに追加のコンテキストを提供する必要がある。これは検索によって行うことができます。リトリーバルは、LLMに直接渡すにはデータが多すぎる場合に便利です。リトリーバーを使って、最も関連性の高い部分のみを取り出し、それをLLMに渡すことができる。
このプロセスでは、レトリーバーから関連文書を検索し、それをプロンプトに渡す。リトリーバはSQLテーブルやインターネットなど、どんなものでも使用できますが、今回はベクターストアにデータを取り込み、それをリトリーバとして使用します。

https://python.langchain.com/docs/get_started/quickstart

非構造化データを格納し、検索する最も一般的な方法の1つは、データを埋め込み、その結果の埋め込みベクトルを格納し、クエリ時に非構造化クエリを埋め込み、埋め込まれたクエリと「最も類似した」埋め込みベクトルを検索することです。ベクトルストアは、埋め込みデータの保存とベクトル検索の実行を代行してくれます。

https://python.langchain.com/docs/modules/data_connection/vectorstores

Embeddingsクラスは、テキスト埋め込みモデルとのインタフェースのために設計されたクラスです。エンベッディング・モデルのプロバイダはたくさんありますが(OpenAI、Cohere、Hugging Faceなど)、このクラスはそれらすべての標準的なインタフェースを提供するように設計されています。
エンベッディングはテキストをベクトル表現します。これは、テキストをベクトル空間で考えることができ、ベクトル空間で最も似ているテキストの断片を探す意味検索のようなことができるので便利です。
LangChainのベースとなるEmbeddingsクラスは2つのメソッドを提供します:1つはドキュメントを埋め込むメソッド、もう1つはクエリを埋め込むメソッドです。前者は複数のテキストを入力とし、後者は単一のテキストを入力とします。なぜ2つのメソッドを用意したかというと、埋め込みプロバイダによっては、ドキュメント(検索対象)とクエリ(検索クエリそのもの)の埋め込み方法が異なるからです。

https://python.langchain.com/docs/modules/data_connection/text_embedding/

リトリーバーは、構造化されていないクエリを指定するとドキュメントを返すインターフェースである。ベクターストアよりも一般的である。リトリーバはドキュメントを格納する必要はなく、ドキュメントを返す(取り出す)だけでよい。ベクターストアはリトリーバーのバックボーンとして使用できますが、他のタイプのリトリーバーもあります。

https://python.langchain.com/docs/modules/data_connection/retrievers/


お願い致します