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はゲーム探索を強化

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

ブログ    
ブログ    

推薦する

地球外文明の探査における人工知能技術の応用

近年、人工知能(AI)は急速に発展し、さまざまな分野で画期的な進歩を遂げています。中国の著名な学者、...

...

AI顔認識:スマート監視を開発する方法

顔認識技術は継続的に発展しており、スマート監視システムの開発に貢献しています。これらのシステムにより...

Dianping.com における検索関連性技術の探求と実践

著者: Xiaoya、Shen Yuan、Judy など1. 背景レビュー検索は、Dianping ...

...

AIソリューションがビジネスの成長にどのように役立つか

企業はどのように AI ソリューションを使用して効率性を向上させ、プロセスを合理化できるのでしょうか...

なぜAIは東京オリンピックでバレーボールの試合を無料で観戦できるのか?

[[416801]]ビッグデータダイジェスト制作出典: Wired 8月8日の夜、第32回夏季オリ...

GPT-4Vがロボットの頭脳として機能すると、AIで計画を立てることができなくなる可能性があります

GPT-4V はすでに、Web サイトのコード設計やブラウザの制御に役立っています。これらのアプリケ...

5G悪報セキュリティ管理プラットフォームにおけるディープラーニングに基づくテキスト感情認識技術の応用

著者: Sun Yue、所属部署: 中国移動 (杭州) 情報技術有限公司 | 中国移動杭州 R&am...

ファーウェイのロボット犬が公開:AI技術を使用して動的なマルチターゲット追跡と追従を実現

ロボット界のインターネット有名人といえば、ボストン・ロボット・ドッグを挙げなければなりません。そして...

もう一つの「無人工場」が誕生。残された労働者たちは何をするのでしょうか?

最近、ZTEの南京浜江インテリジェント製造基地が設立されたのを見たとき、私はまったく喜びを感じません...

Google AIロボットトレーナーが秘密を暴露:低賃金と厳しい納期に不満を述べた後に解雇

6月15日、グーグルの新しいAIチャットボットのトレーニングを担当する契約労働者のグループは、低賃金...

多くのライターがChatGPTを著作権侵害で非難した。OpenAI: 著作権の範囲を誤解している

8月31日、OpenAIは今週、原告に数人の作家を含むほぼ同一の集団訴訟2件に応じた。彼らは、Cha...

ちょうど今、人工知能に関する大きなニュースが発表されました

中国における人工知能熱の高まりは、テクノロジーとビジネスによって推進されているだけでなく、政府の推進...