LLMSを搭載したTypeScriptの構造化された抽出は、シンプルさ、透明性、および制御のために設計されています。
TypeScriptベースの構造化された抽出の世界に飛び込みます。APIとZODを呼び出すOpenAIの関数、静的型推論を備えたTypeScript-Firstスキーマ検証。インストラクターは、そのシンプルさ、透明性、ユーザー中心のデザインで際立っています。あなたがベテランの開発者であろうと、始めたばかりであろうと、インストラクターのアプローチは直感的で操縦可能になります。
bun add @instructor-ai/instructor zod openainpm i @instructor-ai/instructor zod openaipnpm add @instructor-ai/instructor zod openaiデータをプロンプトして抽出するためのすべてのヒントとトリックを確認するには、ドキュメントをチェックしてください。
import Instructor from "@instructor-ai/instructor" ;
import OpenAI from "openai"
import { z } from "zod"
const oai = new OpenAI ( {
apiKey : process . env . OPENAI_API_KEY ?? undefined ,
organization : process . env . OPENAI_ORG_ID ?? undefined
} )
const client = Instructor ( {
client : oai ,
mode : "TOOLS"
} )
const UserSchema = z . object ( {
// Description will be used in the prompt
age : z . number ( ) . describe ( "The age of the user" ) ,
name : z . string ( )
} )
// User will be of type z.infer<typeof UserSchema>
const user = await client . chat . completions . create ( {
messages : [ { role : "user" , content : "Jason Liu is 30 years old" } ] ,
model : "gpt-3.5-turbo" ,
response_model : {
schema : UserSchema ,
name : "User"
}
} )
console . log ( user )
// { age: 30, name: "Jason Liu" } インストラクタークライアントを作成するためのメインクラス。
CreateInstructor
function createInstructor < C extends GenericClient | OpenAI > ( args : {
client : OpenAILikeClient < C > ;
mode : Mode ;
debug ?: boolean ;
} ) : InstructorClient < C >インストラクタークラスのインスタンスを作成します。
拡張されたOpenaiのようなクライアントを返します。
chat.completions.create
chat . completions . create <
T extends z . AnyZodObject ,
P extends T extends z . AnyZodObject ? ChatCompletionCreateParamsWithModel < T >
: ClientTypeChatCompletionParams < OpenAILikeClient < C > > & { response_model : never }
> (
params : P
) : Promise < ReturnTypeBasedOnParams < typeof this . client , P > >Response_ModelがParamsに存在する場合、提供されたスキーマに基づいて構造化された抽出を使用してチャット完了を作成します。
インストラクターは、言語モデルからの応答の構造と形式を定義するためのさまざまなモードをサポートしています。これらのモードはzod-streamパッケージで定義されており、次のとおりです。
FUNCTIONS (非推奨):APIを呼び出すOpenAIの関数を使用して応答を生成します。 function_callやfunctionsプロパティを含む、APIを呼び出す関数に必要なパラメーターをマップします。
TOOLS :OpenAIのツール仕様を使用して応答を生成します。 tool_choiceやtoolsプロパティなど、ツール仕様に必要なパラメーターを構築します。
JSON : response_format json_objectに設定し、システムメッセージにJSONスキーマを含めて、応答生成をガイドします。 (一緒に&Anyscale)
MD_JSON :MarkDownコードブロック内に埋め込まれたJSON形式で応答を生成します。これには、システムメッセージにJSONスキーマが含まれており、応答がマークダウンコードブロックにラップされた有効なJSONオブジェクトであることを期待しています。
JSON_SCHEMA :提供されたJSONスキーマに適合する「JSONモード」を使用して応答を生成します。提供されたスキーマを使用してjson_objectにresponse_formatを設定し、システムメッセージにスキーマの説明を含めます。
インストラクターは部分的なストリーミングの完了をサポートし、モデルが応答を生成するにつれて抽出されたデータをリアルタイムで受信できるようにします。これは、よりインタラクティブなユーザーエクスペリエンスを提供したり、大量のデータを段階的に処理するのに役立ちます。
import Instructor from "@instructor-ai/instructor"
import OpenAI from "openai"
import { z } from "zod"
const textBlock = `
In our recent online meeting, participants from various backgrounds joined to discuss the upcoming tech conference.
The names and contact details of the participants were as follows:
- Name: John Doe, Email: [email protected], Twitter: @TechGuru44
- Name: Jane Smith, Email: [email protected], Twitter: @DigitalDiva88
- Name: Alex Johnson, Email: [email protected], Twitter: @CodeMaster2023
During the meeting, we agreed on several key points. The conference will be held on March 15th, 2024, at the Grand Tech Arena located at 4521 Innovation Drive. Dr. Emily Johnson, a renowned AI researcher, will be our keynote speaker. The budget for the event is set at $50,000, covering venue costs, speaker fees, and promotional activities.
Each participant is expected to contribute an article to the conference blog by February 20th. A follow-up meeting is scheduled for January 25th at 3 PM GMT to finalize the agenda and confirm the list of speakers.
`
async function extractData ( ) {
const ExtractionSchema = z . object ( {
users : z . array (
z . object ( {
name : z . string ( ) ,
handle : z . string ( ) ,
twitter : z . string ( )
} )
) . min ( 3 ) ,
location : z . string ( ) ,
budget : z . number ( )
} )
const oai = new OpenAI ( {
apiKey : process . env . OPENAI_API_KEY ?? undefined ,
organization : process . env . OPENAI_ORG_ID ?? undefined
} )
const client = Instructor ( {
client : oai ,
mode : "TOOLS"
} )
const extractionStream = await client . chat . completions . create ( {
messages : [ { role : "user" , content : textBlock } ] ,
model : "gpt-3.5-turbo" ,
response_model : {
schema : ExtractionSchema ,
name : "Extraction"
} ,
max_retries : 3 ,
stream : true
} )
let extractedData = { }
for await ( const result of extractionStream ) {
extractedData = result
console . log ( "Partial extraction:" , result )
}
console . log ( "Final extraction:" , extractedData )
}
extractData ( )この例では、ZODを使用して抽出機を定義して、抽出するデータの構造を指定します。次に、ストリーミングを有効にしてインストラクタークライアントを作成し、SchemaをResponse_Modelパラメーターに渡します。
抽出変数には、使用可能になると部分的な抽出結果が得られる非同期ジェネレーターが保持されます。 Loopを待ち望んでいるAを使用してストリームを反復し、各部分結果で抽出されたDataオブジェクトを更新し、コンソールにログに記録します。
最後に、ストリームが使い果たされると、完全な抽出データを記録します。
インストラクターは、Openai API仕様を順守するさまざまなプロバイダーをサポートしています。適切なクライアントを構成し、目的のモデルとモードを指定することにより、プロバイダーを簡単に切り替えることができます。
任意のスケール
import Instructor from "@instructor-ai/instructor"
import OpenAI from "openai"
import { z } from "zod"
const UserSchema = z . object ( {
age : z . number ( ) ,
name : z . string ( ) . refine ( name => name . includes ( " " ) , {
message : "Name must contain a space"
} )
} )
async function extractUser ( ) {
const client = new OpenAI ( {
baseURL : "https://api.endpoints.anyscale.com/v1" ,
apiKey : process . env . ANYSCALE_API_KEY
} )
const instructor = Instructor ( {
client : client ,
mode : "TOOLS"
} )
const user = await instructor . chat . completions . create ( {
messages : [ { role : "user" , content : "Jason Liu is 30 years old" } ] ,
model : "mistralai/Mixtral-8x7B-Instruct-v0.1" ,
response_model : {
schema : UserSchema ,
name : "User"
} ,
max_retries : 4
} )
return user
}
const anyscaleUser = await extractUser ( )
console . log ( "Anyscale user:" , anyscaleUser )一緒に
import Instructor from "@instructor-ai/instructor"
import OpenAI from "openai"
import { z } from "zod"
const UserSchema = z . object ( {
age : z . number ( ) ,
name : z . string ( ) . refine ( name => name . includes ( " " ) , {
message : "Name must contain a space"
} )
} )
async function extractUser ( ) {
const client = new OpenAI ( {
baseURL : "https://api.together.xyz/v1" ,
apiKey : process . env . TOGETHER_API_KEY
} )
const instructor = Instructor ( {
client : client ,
mode : "TOOLS"
} )
const user = await instructor . chat . completions . create ( {
messages : [ { role : "user" , content : "Jason Liu is 30 years old" } ] ,
model : "mistralai/Mixtral-8x7B-Instruct-v0.1" ,
response_model : {
schema : UserSchema ,
name : "User"
} ,
max_retries : 4
} )
return user
}
const togetherUser = await extractUser ( )
console . log ( "Together user:" , togetherUser )これらの例では、任意のスケールから、そして一緒に特定のベースURLとAPIキーを指定します。
Extractuser関数は、モデル、モード、およびプロバイダーをパラメーターとして使用します。対応するプロバイダー構成を取得し、OpenAIクライアントを作成し、指定されたモードでインストラクターインスタンスを初期化します。
次に、instructor.chat.completions.createに電話して、ユーザー情報を抽出するための希望のモデル、応答スキーマ、およびその他のパラメーターを作成します。
Extractuserを呼び出すときにプロバイダー、モデル、およびモードの引数を変更することにより、異なるプロバイダーと構成を簡単に切り替えることができます。
インストラクターは、 @Dimitrikennedyが維持したllm-polyglotライブラリを通じて、Anthropic、Azure、Cohereなど、Openai SDKに従わないプロバイダーとの統合をサポートしています。このライブラリは、さまざまなプロバイダーでさまざまな言語モデルと対話するための統一されたインターフェイスを提供します。
import { createLLMClient } from "llm-polyglot"
import Instructor from "@instructor-ai/instructor"
import { z } from "zod"
const anthropicClient = createLLMClient ( {
provider : "anthropic" ,
apiKey : process . env . ANTHROPIC_API_KEY
} )
const UserSchema = z . object ( {
age : z . number ( ) ,
name : z . string ( )
} )
const instructor = Instructor < typeof anthropicClient > ( {
client : anthropicClient ,
mode : "TOOLS"
} )
async function extractUser ( ) {
const user = await instructor . chat . completions . create ( {
model : "claude-3-opus-20240229" ,
max_tokens : 1000 ,
messages : [
{
role : "user" ,
content : "My name is Dimitri Kennedy."
}
] ,
response_model : {
name : "extract_name" ,
schema : UserSchema
}
} )
return user
}
// Example usage
const extractedUser = await extractUser ( )
console . log ( "Extracted user:" , extractedUser )この例では、LLM-PolyglotライブラリのCreatEllMClient関数を使用して、人類プロバイダー用のクライアントを作成します。プロバイダー名(「人類」)と、関数に対応するAPIキーを渡します。
次に、ZODを使用してユーザー制を定義して、抽出するユーザーデータの構造を指定します。
人類のクライアントと希望のモードをインストラクター機能に渡すことにより、インストラクターインスタンスを作成します。インストラクターを使用してクライアントタイプを明示的に指定することに注意してください。
Extractuser関数は、インストラクターインスタンスを使用して特定の入力からユーザー情報を抽出する方法を示しています。 instructor.chat.completions.createを適切なモデル(この場合は "claude-3-opus-20240229")、パラメーター、およびユーザー制を含むResponse_modelを使用してCreateを呼び出します。
最後に、抽出されたユーザー情報を記録します。
LLM-Polyglot Libraryを活用することにより、インストラクターは、Openai SDKに続くものを超えて、幅広いプロバイダーとのシームレスな統合を可能にします。これにより、インストラクターの構造化された抽出および検証機能の恩恵を受けながら、さまざまなプロバイダーが提供するユニークな機能とモデルを利用できます。
LLM-Polyglotで他のプロバイダーを使用することに関する追加のサポートと情報については、図書館のドキュメントと例を参照してください。
詳細をご覧になりたい場合は、料理本をご覧ください。
インストラクターのインストールは簡単です。
インストラクターは、Dimitri Kennedyによって開発および維持されているIsland AI Toolkitのいくつかの強力なパッケージの上に建てられています。これらのパッケージは、大規模な言語モデルで構造化されたデータ処理とストリーミングに不可欠な機能を提供します。
Zod-Streamは、LLMストリームと直接インターフェイスするクライアントモジュールです。効率的な解析にスキーマストリームを利用し、OpenAIから生の応答を処理し、モード(機能、ツール、JSONなど)で分類し、適切なエラー処理とストリーム変換を確保するためのツールを装備しています。構造化されたLLM応答ストリームを提供するAPI統合に最適です。
Schema-Streamは、ZODスキーマに基づいて応答モデルを段階的に構築および更新するJSONストリーミングパーサーです。リアルタイムのデータ処理と増分モデルの水分補給のために設計されています。
LLM-Polyglotは、OpenAI、人類、紺ure、azureなどのさまざまなプロバイダーでさまざまな言語モデルと対話するための統一されたインターフェイスを提供するライブラリです。複数のLLMプロバイダーとの作業プロセスを簡素化し、インストラクターとのシームレスな統合を可能にします。
インストラクターは、これらの島AIパッケージのパワーを活用して、LLMSを使用した構造化されたデータ抽出とストリーミングのためのシームレスで効率的なエクスペリエンスを提供します。 Island AIの作成者であるDimitri Kennedyと、元のインストラクターPythonパッケージの著者であるJason Liuとのコラボレーションにより、LLMからの部分的なJSONストリーミングの概念を紹介するインストラクターのタイプスクリプトバージョンの開発につながりました。
Island AIとそのパッケージの詳細については、Island AIリポジトリを参照してください。
インストラクターを使用するという問題は、基本的にZODを使用する理由の問題です。
Openai SDKで動作します- インストラクターはOpenaiのAPIに従います。これは、OpenAI APIをサポートする複数のプロバイダーでプロンプトと抽出の両方に同じAPIを使用できることを意味します。
カスタマイズ可能- ZODは高度にカスタマイズ可能です。独自のバリデーター、カスタムエラーメッセージなどを定義できます。
Ecosystem ZODは、TypeScriptで最も広く使用されているデータ検証ライブラリです。
バトルテスト- ZODは1か月に24Mを超えてダウンロードされ、貢献者の大規模なコミュニティによってサポートされています。
手伝いたい場合は、 good-first-issueまたはhelp-wantedを借りてマークされた問題のいくつかをチェックアウトしてください。ここにあります。それらは、コードの改善、ゲストブログ投稿、または新しい料理の本などのものである可能性があります。
物事のセットアップ、テスト、チェンジセット、ガイドラインのセットアップ方法の詳細については、貢献ガイドをチェックアウトしてください。
ヒント:他の言語でのサポート
Check out ports to other languages below:
- [Python](https://www.github.com/jxnl/instructor)
- [Elixir](https://github.com/thmsmlr/instructor_ex/)
If you want to port Instructor to another language, please reach out to us on [Twitter](https://twitter.com/jxnlco) we'd love to help you get started!
このプロジェクトは、MITライセンスの条件に基づいてライセンスされています。