TypeScript版LangChain試行錯誤記録
Schema
Models
new OpenAI() と new ChatOpenAI() の違いは?
- LangChainのサンプルを読むとどちらも見かける
- より対話的、文脈把握特化を重視するなら
ChatOpenAI
とのこと - ただ「過去情報を元にユーザからの質問に対して返答するchatbot」は
OpenAI
で良いのでは?との指摘(LangChain内Mendableより)
ただそもそも OpenAI インスタンスと ChatOpenAI インスタンスは型情報が異なっており、後者をそのまま .fromLLM()
メソッドなどに渡すと型エラーで怒られる。 OpenChatAI
という名前と呼び出し方が微妙に異なるクラスであれば問題なく動く…までは確認したがこのあたりの区分けがよくわかっていない。
// import先の違い
import { OpenAI, OpenAIChat } from "langchain/llms/openai"
import { ChatOpenAI } from "langchain/chat_models/openai"
// それぞれの.d.tsファイル参照
class OpenAI extends BaseLLM implements OpenAIInput
// -> BaseLLM extends BaseLanguageModel
class ChatOpenAI extends BaseChatModel implements OpenAIInput
// -> BaseChatModel extends BaseLanguageModel
class OpenAIChat extends LLM implements OpenAIInput
// -> LLM extends BaseLLM
// -> BaseLLM extends BaseLanguageModel
// ChatQAサイド
static fromLLM(llm: BaseLLM, retriever: BaseRetriever, options?: {
inputKey?: string;
outputKey?: string;
returnSourceDocuments?: boolean;
questionGeneratorTemplate?: string;
qaTemplate?: string;
}): ConversationalRetrievalQAChain;
Prompts
- document別にvector storeを作成し保存しておく
- 「○○特化型チャット」がたくさん作れる
-
<Select />
のvalueに応じて vector storeやprompt, prompt templateなどの形式を揃えれば挿し替えが容易に
Indexes
Document Loaders何にするか問題
結局作成される Document[]
オブジェクトはシンプルな構造。
下記で検討した通り、思ったような形式にならないのであれば自前の処理でも全然問題無さそうに見える。
Text Splittersよくわからん問題
- 過去記事データをjson出力
- 各種splitterを適用
出力結果を逐一確認したわけではなく、console.log()
で出力された範囲での確認だが、区切り方は異なるものの出力形式が異なるということでもなく、型を辿るといずれもclass TextSplitter
に行き着く。
しかし不適切な? Text Splitters で分割すると 404 error
が返ってくる。エラー詳細も不明のためここで数日沼る。
vector store 要吟味
今のところ動作を確認したのは HNSWLib のみだが、 web app だからといって Node.js 環境に対応した vector store を選定する必要もない。
vector store × NextJs詰み問題
- ChatGPT API利用チャットはNextJsのAPI Routesで構築
- LangChainベースで構築する場合vector storeの実行結果を保存する手段がない
-> 何かしらの拡張が必要そう
- LangChainベースで構築する場合vector storeの実行結果を保存する手段がない
- 別途APIを立てれば済む話
- pythonベースで構築し
.save_local()
で実行結果を保存しておく - メモリ上で保持する(手段は色々)
-> langchainjsでも save localが使えれば…
- pythonベースで構築し
2023/5/21 更新
いつの間にか種別が増えている & save localの項が増えている!
Chains
Chainsの関係性よくわからん問題
公式 -> deepl
「読み込んだIndexesを元に回答してくれるbot」は2番目で良さそうではある。
ただちょくちょく採用事例を見かける loadQAChain(llm: BaseLanguageModel, params: QAChainParams = ...)
はどういう位置づけにあるのか。
Index-related chains
でも qaTemplate という PromptTemplate 的なものを利用できたが、 LLMChains
との差異は何なのか、etc...
Index Related Chains の違いよくわからん問題
こちらの記事を参考にさせていただいた。 loadQAChain
(python版だが)についても言及頂いている。
というか今回の実装でこの方の記事をだいぶ参考にさせていただいた。網羅性が高すぎてびっくり。
Agents