LangChain の実践: 大規模言語モデルのコードベースの理解

LangChain の実践: 大規模言語モデルのコードベースの理解

著者 | 崔昊

レビュー | Chonglou

まとめ

LLM(大規模言語モデル)の開発に伴い、ソースコードの解析に LLM を使用する傾向がありますオンラインブロガーは、 GitHub Co-Pilot Code Interpreter Codium Codeium上のコードを分析しました。ぜひOpenAIを使って楽しんでください GPT -3.5- Turbo と LangChain は LangChain のソースコードを分析します。

導入

ご存知のとおり、プログラマーはソースコードを頻繁に扱います。多くの場合、プログラマーは新しいコード ベースやレガシー プロジェクトのコード ベースに遭遇すると、途方に暮れてしまいます。特に、既存のコード ベースに変更を加える場合はさらに困難であり、永遠に後悔することにつながる誤ったステップを踏むことを恐れます。たとえば、クラスとメソッドの関係が明確ではなく、関数間のビジネス ロジックが明確ではありません。しかし、今では心配する必要はありません。大規模な言語モデルのサポートにより、コードを読むことは難しくなく、コードベースの全体的な分析も簡単です。

要約すると、大規模言語モデルを使用すると、次の操作を実行できます。

1. コードベースに関する Q&A を実施して、その動作を理解します。

2. LLM を使用してリファクタリングまたは改善の提案を行います。

3. LLM を使用してコードを文書化します。

今日は、コード ベースの Q&A から始めて、コード ベースの Q&A プログラムの作成について説明します。

全体紹介

まず図1に示すように、いくつかのアイデアを整理してみましょう。 表示されます。まずLangChainのソースコードをダウンロードし、 コード ディレクトリとそのディレクトリの下にあるすべてのソース コード ファイルがディスクに保存されます。次に、図の赤い部分が読み込まれて変換されます。これらのコード ファイルを埋め込み操作用の小さなファイル ブロックに分割します。つまり、図のオレンジ色の部分であるベクターデータベースに埋め込みます。次に、画像の右端のユーザーが大きなモデルを要求します。ここでは、GPT -3.5- Turbo を使用し、モデルに「 LangChain でReAct エージェントを初期化する方法」など、LangChain ソースコードに関連する質問をするように依頼します。この時点で、GPT -3.5- Turbo の大規模言語モデルはベクトル データベースから関連情報を取得し、ユーザーに返します。

図1. ソースコードライブラリのアイデアの疑問

具体的には、次のステップで構成されるメカニズムを持つセグメンテーション戦略を採用できます。

1. コード内の各トップレベルの関数とクラスを個別のドキュメントに読み込みます。

2. 残りを別のドキュメントに読み込みます。

3. 各セグメンテーションの取得元に関するメタデータ情報を保存します。

ただしこれらのステップはすべて LangChain の内部メカニズムによって実装されており、完了するには簡単なコードを呼び出すだけで済みます。

コード全体の構築と処理プロセスは、上の図1に示されています。 示されているように、コードを記述できます。これはおそらく次の手順に分割されます。

  1. LangChainコードをダウンロード
  2. VSでは コードコードのインポート
  3. 関連する依存関係をインストールする
  4. LangChainソースコードファイルを読み込む
  5. カッティングファイル
  6. ベクターデータベースに埋め込まれている
  7. 大規模モデルによるクエリ
  8. クエリ結果を返す

では、順を追って紹介していきます。

LangChainコードをダウンロード

まず最初に私たちの主役であるLangChainのソースコードを紹介しましょう。 図2 示されているように、アドレス https://github.com/langchain-ai/langchain にアクセスすると、ソース コード ライブラリを表示できます

図2 LangChainソースコードライブラリ

もちろん、Clone メソッドを使用してコードをダウンロードすることも、図 3 に示す方法を使用して zip パッケージを直接ダウンロードしてから解凍することもできます。

図3 LangChainソースコードのダウンロード

ダウンロード後、解凍してください。解凍したディレクトリは後ほど使用しますので、ご注意ください。

VS Code でコードをインポートする

LangChainソースコードリポジトリを解凍したら、VSにインポートします。 コード。 図3 VSでは、 コード、LANGCHAIN - MASTERディレクトリの下 /libs / langchain / langchain がターゲット ディレクトリです。 LangChain のソースコードはここに保存されています。次に、このディレクトリ内のファイルをリーダーでスキャンする必要があります。

図3: LangChainコードベースの場所

関連する依存関係をインストールする

コード ライブラリをロードする前にまず対応するJ upyter Notebookファイルを作成します図4 図に示すように、便宜上、ソース コードのルート ディレクトリにchat_with_code.ipynbファイルを作成します

図4 ソースコードファイルの構造

次のようにいくつかの依存パッケージをファイルに追加し、 GPT -3.5- Turbo モデルを適用するために使用されるOpen AIパッケージ読み込みます。ティックトック これは、単語の分割、埋め込み、テキストの長さの計算などの NLP (自然言語処理) タスクを処理するために使用されます。クロムDB これはベクター データベースのパッケージです。ソース コード ファイルは、後続のクエリのためにここに保存されます。また、 Lang Cチェーンパッケージは、いくつかの操作を実行するための足場であり、これがないとプログラムは使用できません。

 #引入依赖包#openai gpt 模型#tiktoken NLP 处理#chromadb 向量数据库#langchain llm 脚手架pip install openai tiktoken chromadb langchain

依存パッケージをインストールした後、環境変数の設定を取得する必要があります大規模モデルを呼び出すにはOpen AI API を使用する必要があるため、次のコードを追加する必要があります。

 #通过环境配置的方式获取openai 访问api的key import dotenv dotenv.load_dotenv()

ソースコードのルートディレクトリに「.env」ファイルを作成し、そのファイルに次のコードを記述したことに注意してください

 OPENAI_API_KEY= openaikey

O pen AIのキーを保存するために使用されます

LangChainソースコードファイルを読み込む

依存パッケージを導入したら、LangChainのソースコードファイルを読み込むことができます。 次のコードに示すように、まずコードの読み込みに役立ついくつかの LangChain クラスを導入します。

 #基于编程语言的字符切割from langchain.text_splitter import Language #大文件的装载from langchain.document_loaders.generic import GenericLoader #解析编程语言的语法from langchain.document_loaders.parsers import LanguageParser
  • langchain 。text_splitter言語はプログラミング言語に基づいてファイルを分割するのに役立ちます。
  • クラス ファイルが比較的大きい状況が発生する可能性があるため、 langchain.document_loaders.generiGenericLoader大きなファイルロードできます
  • langchain.document_loaders.parsersLanguageParser は、クラスとメソッドを解析するために使用されます

次に、ソースコードが配置されているパスを定義します

 #定义源代码所在的目录repo_path ="/Users/cuihao/doc/39 - GPT/langchain-master"

その後、 Pythonファイルの読み込みを開始できます

 #加载文件(s)多个文件loader = GenericLoader.from_filesystem( repo_path+"/libs/langchain/langchain", #加载所有目录下的所有文件glob="**/*", #针对.py的文件进行加载suffixes=[".py"], #激活解析所需的最小行数parser=LanguageParser(language=Language.PYTHON, parser_threshold=500) ) documents = loader.load() len(documents)

上記のコードから、 GenericLoaderfrom_filesystemメソッドが複数のディレクトリからファイルをロードするために使用されていることがわかります。まずソース コードが配置されているルート ディレクトリを渡します。次に globパラメータを使用して、すべてのディレクトリ内のすべてのファイルをターゲット ファイルとして定義します次に、処理されたファイルのサフィックスを「.py」として定義します最後に、 LanguageParserメソッドを使用してPython を解析し、解析を毎回アクティブにするコード行数を500指定します

カッティングファイル

読み込まれたファイルをDocuments変数に渡し Documents を切り取ります一般的に、大規模なモデルには、次のコードに示すように入力制限があります

 #对加载好的py 文件进行切割#ChatGPT 最大的输入是2048 from langchain.text_splitter import RecursiveCharacterTextSplitter python_splitter = RecursiveCharacterTextSplitter.from_language( language=Language.PYTHON, #每个切割之后的文件的大小chunk_size=2000, #文件与文件之间的重合部分是200 chunk_overlap=200) #将所有源代码文件切割成小的文件块,以便llm 能够进行嵌入texts = python_splitter.split_documents(documents) len(texts)

ここでは、 LangChain.text_splitter パッケージのRecursiveCharacterTextSplitter関数を使用しソース コードを分割します。ファイルブロックサイズは2,000バイト、ファイル間の重複は 200バイトです。切り取ったファイル ブロックを texts 変数に割り当てます。ここで、texts は実際にはファイル ブロックの配列であり、後でベクター データベース chroma に埋め込まれます。

ここで、ファイル ブロック カットの2 つのパラメータ、 chunk_sizechunk_overlapについて説明する必要があります図5 図に示すように、ファイルを長さで切り取ると、切り取られたテキストのコンテキストが失われる可能性があります。たとえば、「天気が良ければ公園に行きましょうか?」のような文は明らかに不完全であり、大規模なモデルでは学習や推論の際に一部の情報が失われます。これは自然言語にも当てはまり、コード解析にも当てはまります。

図5: 自然言語テキストのセグメンテーション

したがって、切り取るときにテキスト ブロックのコンテキスト情報の一部を保存します。図中の「そう言えば行きます」というのは、この情報同士が重なり合う部分、つまり「オーバーラップ」のことを指します。この方法では、各テキスト ブロックは隣接するテキスト ブロックの情報を保持できるため、コンテキスト情報の整合性が最大限に高まります。コード解析でもこのアプローチを採用します。

ベクターデータベースに埋め込まれている

ファイルがセグメント化された後これらのコードによって形成されたファイル ブロックがベクター データベースに埋め込まれます。埋め込まれた後でのみ、後続のユーザークエリが容易になります。次のコードに示すように、 OpenAI のOpenAIEmbeddings関数を使用して、テキスト、つまりカット コード ファイルをクロマ ベクトル データベースに保存します。

 from langchain.vectorstores import Chroma from langchain.embeddings.openai import OpenAIEmbeddings #将切割好的文件块嵌入到向量数据库中, chroma db db = Chroma.from_documents(texts, OpenAIEmbeddings(disallowed_special=())) #定义如何查询代码retriever = db.as_retriever( #Maximal Marginal Relevance (最大边际相关性)= 相关性+ 多样性search_type="mmr",# Also test "similarity" #控制在检索中返回的文档数量search_kwargs={"k":8}, )

さらに、ベクター データベース用に新しいR etriever が作成されました。 後続の検索を支援するインデックス作成者として機能します。パラメータは 2 つあります最初の search_type はMaximum Marginal Relevanceの略である mmrを定義しますクエリ対象の関連性と多様性の両方を考慮した関連性クエリ方式です kを定義するパラメータsearch_kwargsもある。 8、一致する関連文書の数です。

大規模モデルによるクエリ

上記の手順を実行すれば、目標達成までそう遠くはありません。 GPT -3.5- Turbo モデルのクエリを作成することが最優先事項です。次のコードに示すように、ChatOpenAI 関数が導入され、GPT -3.5- Turbo モデル エンティティが作成されます。次に、 ConversationSummaryMemoryを使用して、記憶された会話を作成します。最も重要なのは、 ConversationalRetrievalChainを使用することです。名前が示すように、これはチェーンの形で存在する会話ベースのインデクサーです。チェーンはLangChainのコアコンポーネントであり、モデルなどの他のコンポーネントを接続するために使用されます。 I/O、DataConnection、Agent などを組み合わせて使用​​します。ここでは、質問と回答の応答のために、大規模モデル (LLM)、インデクサー ( Retriever )、およびメモリ コンポーネント (Memory)を統合します

 #调用llm gpt-3.5-turbo 进行查询from langchain.chat_models import ChatOpenAI from langchain.memory import ConversationSummaryMemory from langchain.chains import ConversationalRetrievalChain llm = ChatOpenAI(model_name="gpt-3.5-turbo") memory = ConversationSummaryMemory(llm=llm,memory_key="chat_history",return_messages=True) #定义大语言模型, 查询方式, 记忆方式qa = ConversationalRetrievalChain.from_llm(llm,retriever=retriever,memory=memory)

クエリ結果を返す

すべての準備が整いましたので、次のコードを通じて質問を開始します。

 question ="我如何处初始化ReAct agent?" result = qa(question) result['answer']

GPT -3.5- Turbo の応答は次のとおりです

要初始化ReAct agent,您可以使用以下代码: from langchain.agents.react_agent import ReActDocstoreAgent from langchain.tools import LookupTool, SearchTool # 创建LookupTool 和SearchTool lookup_tool = LookupTool() search_tool = SearchTool() # 创建ReAct agent react_agent =ReActDocstoreAgent(tools=[lookup_tool, search_tool])在上述代码中,我们首先导入ReActDocstoreAgent 类和所需的工具类LookupTool 和SearchTool。然后,我们创建了这些工具的实例,并将它们作为参数传递给ReActDocstoreAgent 的构造函数,从而初始化了ReAct agent。

返信でどのクラスをインポートしてReActするか教えてください エージェントが初期化のために依存する必要があるクラスと関数、およびクラスと関数間の依存関係が明確に示されます。

要約する

この記事では、LangChain と GPT-3.5-Turbo を活用して大規模なコード ベースを理解する方法について説明します。まず、LangChain コードベースをダウンロードし、VS Code にインポートしました。次に、OpenAI、 Tiktoken Chroma DB Lang Chainなどの必要な依存パッケージをインストールして後続の操作の準備をします次に、LanguageParser を使用して解析するなど、LangChain ソース コード ファイルを読み込みます。次に、より大きなモデルの入力要件を満たすために、コード ファイルを小さな部分に分割します。これらのスライスされたコード ブロックは Chroma ベクトル データベースに埋め込まれ、クエリ用の Retriever が作成されます。Retrieverは関連性クエリに Maximal Marginal Relevance を使用し、返されるドキュメントの数を制限します。最後に、GPT-3.5-Turbo を使用してコードベースをクエリし、質問への回答とコードの説明を可能にして、コードベースを理解しやすくしました。

著者について

51CTO コミュニティ エディター兼シニア アーキテクトの Cui Hao 氏は、ソフトウェア開発とアーキテクチャで 18 年の経験があり、分散アーキテクチャでは 10 年の経験があります。

<<:  NetEase Fuxi Game AI Botの擬人化と様式化:AIGAはゲーム探索を強化

>>:  百度、中国初の「工業用」医療用モデル「霊益大モデル」を発売

推薦する

5Gベアラネットワークの運用は難しいが、機械学習技術で解決できる

5G の商用化が近づいており、通信事業者が 5G ベアラ ネットワークを構築するための時間はあまり残...

グラフなしの ICLR'24 のための新しいアイデア! LaneSegNet: 車線セグメンテーションを考慮したマップ学習

序文と著者の個人的な理解自動運転システムの下流アプリケーションにとって重要な情報である地図は、通常、...

人工知能は労働力不足の重要な解決策とみられる

セリディアンは、無限の労働力を動員する力に焦点を当てた年次経営者調査の結果を発表しました。調査では、...

Excelを使用してPIDアルゴリズムを学習する

1. PIDの紹介モーター制御この方法ではフィードバックはありません。つまり、入力数値を完全に信じて...

2019年中国インテリジェント製造業のトップ10の発展トレンド!

2018年、中国政府による関連支援政策の導入とインテリジェント製造プロセスの推進により、わが国のイ...

AI搭載マシンが製造業の産業自動化を加速させる方法

今日、人工知能と機械学習は製造業界における変化の重要な原動力となっています。人工知能と機械学習により...

...

自動化ロボットのHMI設計の詳細な説明

[[260977]] [51CTO.com クイック翻訳] ロボットの操作インターフェースをカスタマ...

...

教室への人工知能の導入は論争を巻き起こしています。それは教育に役立つのでしょうか?境界はどこにあるのでしょうか?

「人工知能+スマート教育」が人気を集めています。しかし、生徒の表情を捉える「スマートアイ」や「顔ス...

...

AI人材の競争は軍拡競争となっている。AIの創造性競争に賭けるAI大手の中で、勝利のポイントを獲得するのはどれだろうか?

世界中の人工知能の人材が徐々に量産モードに入りつつあります。今年6月、百度と浙江大学は、潜在的な人工...

PULSE: 暗黙の空間に基づく画像超解像アルゴリズム

CVPR 2020 に採択された論文「PULSE: 生成モデルの潜在空間探索による自己教師あり写真ア...

人工知能の開発を加速するための9つのヒント

現在、多くの企業が AI テクノロジーで一定の成功を収めており、IT チームは AI プロジェクトを...

...