オープンソースフレームワークLangChainで知識ロボットを実現

ここに画像の説明を挿入

序文

大規模言語モデル (LLM) は、2020 年の OpenAI の GPT-3 のリリースにより世界の舞台に参入しました。それ以来、彼らは着実に世間の注目を集めるようになりました。
ご存知のとおり、OpenAI の API はインターネットに接続できません。そのため、その API を使用してオンライン検索と回答、PDF ドキュメントの要約、Youtube ビデオに基づく質疑応答などを実現したい場合は、間違いなく不可能です。そこで、非常に強力なサードパーティのオープンソース ライブラリである LangChain を紹介しましょう。
LangChain は、言語モデルによって駆動されるアプリケーションを開発するためのフレームワークです。彼には主に 2 つの機能があります。LLM モデルを外部データ ソースに接続できることと、LLM モデルとの対話を可能にすることです。

プロジェクトアドレス: https://github.com/langchain-ai/langchain
ここに画像の説明を挿入

LangChain は、言語モデルによって駆動されるアプリケーションを開発するためのフレームワークです。

フレームワークは設計原則です。
データ認識: 言語モデルを他のデータ ソースに接続します。
プロキシ: 言語モデルがその環境と対話できるようにします。

Langchain の核となるアイデア

さまざまなコンポーネントを「チェーン」して、LLM を中心としたより高度なユースケースを作成します。

LangChain コアモジュールのサポート

モデル: LangChain によってサポートされるさまざまなモデル タイプとモデル統合。
プロンプト (プロンプト): プロンプト管理、プロンプトの最適化、およびプロンプトのシリアル化を含みます。
メモリ: メモリは、チェーン/プロキシ呼び出し間の状態を維持する概念です。LangChain は、標準メモリ インターフェイス、一連のメモリ実装、メモリを使用したチェーン/ブローカーの例を提供します。
インデックス: 言語モデルは、多くの場合、独自のテキスト データと組み合わせるとより強力になります。このモジュールでは、これを行うためのベスト プラクティスについて説明します。
チェーン: チェーンは、単一の LLM 呼び出しではなく、一連の呼び出し (LLM または別のユーティリティーの呼び出し) です。LangChain は、標準のチェーン インターフェイスと他のツールとの多くの統合を提供します。LangChain は、一般的なアプリケーションにエンドツーエンドのチェーン呼び出しを提供します。
エージェント: エージェントは、アクションの決定、そのアクションの実行、観察の確認、および完了までのプロセスの繰り返しに LLM を関与させます。LangChain は、標準のプロキシ インターフェイス、一連のプロキシ オプション、およびエンドツーエンドのプロキシの例を提供します。

###LangChain の動作原理
LangChain は、LLM ができるだけ少ない計算能力で簡単に参照できるように、大量のデータを結合することです。その動作原理は、50 ページの PDF ファイルなどの大規模なデータ ソースを断片に分割し、それらをベクトル ストア (Vector Store) に埋め込むことです。
ここに画像の説明を挿入
ベクター ストアの作成の簡単な図

大きなドキュメントのベクトル化された表現が得られたので、それを使用して LLM と連携し、プロンプトと完了のペアを作成するために参照する必要がある情報のみを取得できます。

新しいチャットボットにプロンプ​​トを入力すると、LangChain はベクター ストレージに関連情報を問い合わせます。ドキュメント専用の小さな Google と考えることができます。関連する情報を見つけたら、それを使用して、回答を生成するためのヒントとともに LLM にフィードしました。

ここに画像の説明を挿入

ここに画像の説明を挿入

使用事例

ここに画像の説明を挿入

自律型エージェント

長時間実行されるエージェントは、目標を達成するために複数の手順を実行します。AutoGPT や BabyAGI が代表的なものです。

エージェントシミュレーション

エージェントを閉鎖環境に配置し、エージェントがどのように相互作用し、イベントに反応するかを観察することは、エージェントの長期記憶能力を観察する興味深い方法です。

パーソナルアシスタント

LangChain の主な使用例。パーソナル アシスタントはアクションを実行し、やり取りを記憶し、データに関する知識を持っています。

質疑応答

LangChain の 2 番目の主要な使用例。これらの文書内の情報のみを使用して、特定の文書内の質問に答える回答を作成します。

チャットボット

言語モデルはテキストの生成に優れているため、チャットボットの作成に最適です。

表形式データのクエリ (表形式)

LLM を使用して表形式 (csv、SQL、データフレームなど) で保存されたデータをクエリする方法を学びたい場合は、このページをお読みください。

コードの理解 (コード): LLM を使用して GitHub からソース コードをクエリする方法を学びたい場合は、このページを読んでください。

API (API) と対話する

LLM が API と連携して、よりリアルタイムの情報を提供し、アクションを実行できるようにすることは、非常に強力です。

抽出

テキストから構造化された情報を抽出します。

まとめ

長い文書をより短く簡潔な情報の塊に要約します。データ拡張生成の一種。

評価

生成モデルは、従来の指標を使用して評価するのが非常に困難です。新しい評価方法は、言語モデル自体を評価に使用することです。LangChain は、評価を支援するためにいくつかのヒント/チェーンを提供します。

ランチアン生態学

ここに画像の説明を挿入

実践例

モデル (LLM ラッパー)

ヒント

埋め込みとベクトルストレージ

演技

LangChain がどのように機能するかを高度に理解できるように、各部分を個別に紹介します。次に、これらの概念を適用して、独自のユースケースの設計と独自のアプリケーションの作成を開始できるようになります。

次に、Rabbitmetrics (Github) からいくつかの短いコード スニペットを紹介します。彼はこのトピックに関する素晴らしいチュートリアルを提供しています。これらのコード スニペットにより、LangChain を使用する準備が整います。

まず、環境をセットアップしましょう。pip を使用して必要な 3 つのライブラリをインストールできます。

pip install -r requirements.txt
python-dotenv==1.0.0 langchain==0.0.137 pinecone-client==2.2.1

Pinecone は、LangChain で使用する Vector ストアです。ここでは、OpenAI、Pinecone 環境、および Pinecone API の API キーを環境構成ファイルに保存します。この情報は、それぞれの Web サイトでご覧いただけます。次に、次のコードを使用してその環境ファイルをロードします。

さあ、始める準備が整いました!

# 加载环境变量
from dotenv import loaddotenv,finddotenv loaddotenv(finddotenv())

3.1. モデル (LLM ラッパー)
LLM と対話するには、OpenAI の GPT モデルのラッパーをインスタンス化する必要があります。ここでは、最も安価な OpenAI の GPT-3.5-turbo を使用します。ただし、許可があれば、より強力な GPT4 を自由に使用できます。

これらをインポートするには、次のコードを使用できます。

# 为了查询聊天模型GPT-3.5-turbo或GPT-4,导入聊天消息和ChatOpenAI的模式(schema)。
from langchain.schema import (    AIMessage,    HumanMessage,    SystemMessage)
from langchain.chat_models import ChatOpenAI 
chat = ChatOpenAI(model_name="gpt-3.5-turbo",temperature=0.3)
messages = [    SystemMessage(content="你是一个专业的数据科学家"),    HumanMessage(content="写一个Python脚本,用模拟数据训练一个神经网络")]
response=chat(messages)print(response.content,end='\n')

実際、SystemMessage は、ヒントと補完の各ペアのコンテキスト情報を GPT-3.5-turbo モジュールに提供します。HumanMessage は、ChatGPT インターフェイスに入力した内容、つまりプロンプトを指します。

しかし、カスタム知識を持つチャットボットの場合、通常、プロンプトの繰り返し部分を抽象化します。たとえば、ツイート生成アプリを作成している場合、「...に関するツイートを書いてください」と入力し続ける必要はありません。

それでは、PromptTemplates を使用してこれを抽象化する方法を見てみましょう。

3.2. プロンプト
LangChain は、正規表現 (regex) の使用と同様に、ユーザー入力に応じてプロンプトを動的に変更できる PromptTemplate を提供します。

# 导入提示并定义
PromptTemplatefrom langchain 
import PromptTemplatetemplate = """您是一位专业的数据科学家,擅长构建深度学习模型。用几行话解释{concept}的概念"""
prompt = PromptTemplate(    input_variables=["concept"],    template=template,)
# 用PromptTemplate运行LLM
llm(prompt.format(concept="autoencoder"))
llm(prompt.format(concept="regularization"))

これらのプロンプト テンプレートをさまざまな方法で変更して、アプリケーション シナリオに適したものにすることができます。ChatGPT に慣れている場合は、これは簡単なはずです。

3.3. チェーン
チェーンを使用すると、単純なプロンプト テンプレートに関数を構築できます。基本的に、チェーンは複合関数のようなもので、キュー テンプレートと LLM を組み合わせることができます。

前のラッパーとプロンプト テンプレートを使用すると、プロンプト テンプレートを取得して LLM と組み合わせる単一のチェーンで同じプロンプトを実行できます。

# 导入LLMChain并定义一个链,用语言模型和提示作为参数。
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
# 只指定输入变量来运行链。
print(chain.run("autoencoder"))

さらに、名前が示すように、これらのチェーンを接続して、より大きな組み合わせを作成することもできます。

たとえば、あるチェーンの結果を別のチェーンに渡すことができます。このコード スニペットでは、Rabbitmetrics は最初のチェーンの完成した結果を 2 番目のチェーンに渡しますが、それを 5 歳児に説明するには 500 語かかります。

これらのチェーンを結合してより大きなチェーンを作成し、実行できます。

# 定义一个第二个提示
second_prompt = PromptTemplate(    input_variables=["ml_concept"],    template="把{ml_concept}的概念描述转换成用500字向我解释,就像我是一个五岁的孩子一样",)
chain_two = LLMChain(llm=llm, prompt=second_prompt)
# 用上面的两个链定义一个顺序链:第二个链把第一个链的输出作为输入
from langchain.chains import SimpleSequentialChain
overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)
# 只指定第一个链的输入变量来运行链。
explanation = overall_chain.run("autoencoder")print(explanation)

チェーンを使用すると、多くの関数を作成できるため、LangChain は非常に強力です。しかし、それが本当に重要になるのは、前述のベクター ストレージです。次にこの部分を紹介していきます。

3.4. 埋め込みとベクトルストレージ
ここでは、カスタムデータストレージとして LangChain を組み合わせます。前述したように、埋め込みとベクトル ストレージの考え方は、大きなデータを小さな部分に分割して保存することです。

LangChain にはこれを行うためのテキスト分割機能があります。

# 导入分割文本的工具,并把上面给出的解释分成文档块
from langchain.text_splitter import RecursiveCharacter
TextSplittertext_splitter = RecursiveCharacterTextSplitter(    chunk_size = 100,    chunk_overlap  = 0,)
texts = text_splitter.create_documents([explanation])

テキストの分割には、各チャンクの大きさ (チャンクサイズ) と各チャンクがどの程度オーバーラップするか (チャンクオーバーラップ) という 2 つのパラメーターが必要です。関連する隣接ブロックを識別しやすくするために、各ブロック間にオーバーラップがあることが重要です。

各ブロックは次のように取得できます。

texts[0].page_content
これらのチャンクを取得したので、それらを埋め込みに変換する必要があります。これにより、ベクトル ストアはクエリ時に各ブロックを検索して返すことができます。これを行うには、OpenAI の埋め込みモデルを使用します。

# 导入并实例化 OpenAI embeddingsfrom langchain.embeddings import OpenAIEmbeddingsembeddings = OpenAIEmbeddings(model_name="ada")     # 用嵌入把第一个文本块变成一个向量query_result = embeddings.embed_query(texts[0].page_content)print(query_result)

最後に、これらのベクトル化された埋め込みを保存する場所が必要です。前述したように、これには Pinecone を使用します。前の環境ファイルの API キーを使用して、Pinecone を初期化して埋め込みを保存できます。

# 导入并初始化Pinecone客户端
import osimport pineconefrom langchain.vectorstores 
import Pineconepinecone.init(    api_key=os.getenv('PINECONE_API_KEY'),      environment=os.getenv('PINECONE_ENV')  )     
# 上传向量到
Pineconeindex_name = "langchain-quickstart"
search = Pinecone.from_documents(texts, embeddings, index_name=index_name)    
 # 做一个简单的向量相似度搜索
 query = "What is magical about an autoencoder?"
 result = search.similarity_search(query)print(result)

これで、松ぼっくりベクトル ストアから関連情報をクエリできるようになりました。あとは、学んだことを組み合わせて特定のユースケースを作成し、特化した AI 「エージェント」を提供するだけです。

3.5. エージェント
インテリジェント エージェントは自律的に行​​動できる AI であり、入力に従って一連のタスクを最終目標に到達するまで順番に実行できます。これは、AI が他の API を使用して、電子メールの送信や数学の問題の実行などの一部の機能を実行できることを意味します。LLM+ のヒント チェーンを追加すると、ニーズに合った AI アプリケーションを作成できます。

この部分の原理は少し複雑かもしれないので、LangChain で Python エージェントを使用して簡単な数学問題を解決する方法を示す簡単な例を見てみましょう。このプロキシは、LLM を呼び出して Python コードを実行し、NumPy を使用して方程式の根を見つけます。

# 导入Python REPL工具并实例化Python代理
from langchain.agents.agent_toolkits 
import create_python_agent from langchain.tools.python.tool 
import PythonREPLToolfrom langchain.python 
import PythonREPLfrom langchain.llms.openai 
import OpenAI
agent_executor = create_python_agent(    llm=OpenAI(temperature=0, max_tokens=1000),    tool=PythonREPLTool(),    verbose=True)     
# 执行Python代理
agent_executor.run("找到二次函数3 * x ** 2 + 2 * x - 1的根(零点)。")

カスタマイズされた知識を持つチャットボットは、実際には質問とアクションを結び付けることができるインテリジェントなエージェントです。質問をベクトル化されたストレージに送信し、その結果を元の質問と組み合わせて答えを出します。

その他の参考文献

最も人気のある 10 のベクター データベース [AI]

おすすめ

転載: blog.csdn.net/Climbman/article/details/132003085