ãã£ããã€ããïŒLangChainã®ã¡ã³ã¿ã«ã¢ãã«
ã¯ããã«
æšä»ã®æ¿ã¢ãChatGPTããŒã ãèŠããšããããã¢ããªãšããŠéçºããŠã¿ãããšæãæ¹ãå€ãã®ã§ã¯ãªãã§ãããããæ°ã«ãªã£ãŠèª¿ã¹ãŠã¿ããšLangChainãLlamaIndexãšããã©ã€ãã©ãªã«è¡ãçãæ¹ãå€ãã¯ãã§ãã
ãããŠããå£ã«çŽé¢ãããšæããŸãã
çµå±ãããã®ã©ã€ãã©ãªã
- äœã§
- ã©ãããæã«
- ã©ã䜿ãã°è¯ãã®ã
ããããªãïŒ
ããã§ããç§ã§ãã
ç¹ã«LangChainã¯åããŠLLMã¢ããªéçºãããæ¹ã«ã¯å°ãé£è§£ã§ããLangChainã¯éåžžã«ç©æ¥µçãªéçºããããŠããã©ã€ãã©ãªã§ã課é¡ãè¯ãæ¹æ³ãçºèŠãããã°ãããããå®è£
ïŒãšããã¹ããŒãæã§åããŠããŸãã
ãã®åãããã¥ã¡ã³ãããæŽåãããŠãããã®ã®èšå€§ãªæ
å ±éã«è¿·åã«ãªããããç¶æ³ã§ãã
ããã§ãä»åã¯LangChainã®ã¡ã³ã¿ã«ã¢ãã«ãç°¡åã«èª¬æããŠã¿ãããšã«ããŸããã
å
šäœæãæããããŠããã°ã³ã¢ãªæ
å ±ã远å ã§å¿
èŠãšãªãæ©èœãªã©ã®åå¥ãã€ãããããªãã¯ãã§ããReactã¯UI=f(state)ã®èããæãããšã¹ããšé ã«å
¥ã£ãŠããŸãã
ãŸããå®éã«åãããããTypeScriptã®ãµã³ãã«ã³ãŒããçšæããŠããŸãããããèªãŸããæ¹ã¯ããã³ããšã³ãçµéšããæ¹ãå€ãããªããšæãTypeScriptã«ããŸããã
èšäºãèªã¿çµãã£ããNext.js API Routesãªã©ã«çªã£èŸŒãã§LLMã¢ããªãäœã£ãŠã¿ãŠãã ãããçµæ§ãæè»œãªã®ã«ãããããšãå€ããŠæ¥œããã§ããïŒ
åæç¥è
LangChainã®èª¬æãããäžã§å°ãªãããLLM(å€§èŠæš¡èšèªã¢ãã«)ã®ç¥èãå¿
èŠãšãªããŸãããšãã£ãŠããçµã¿èŸŒã¿ã ãã§ããã°å
éšã®ä»çµã¿ã詳ããç¥ãå¿
èŠã¯ãããŸããã
倧äºãªã®ããšã¯LLMãText to Textãã€ãŸãæç« ãå
¥åãããŠæ°ããªæç« ãåºåããã颿°ã§ãããšããããšã§ãã
TypeScriptçã«èãããšä»¥äžã®ããã«ãªããŸãã

Pythonã¯åæåŠçã¡ã€ã³ãªããšãå€ãã®ã§ãããä»åã¯TypeScriptã§APIã³ãŒã«ããŸãã®ã§Promise<string>ãæ£ç¢ºã§ããã
stringãå
¥ãããstringãåºãŠããâŠïŒãšãŠãã·ã³ãã«ã§ãã
LangChainã®æ§æèŠçŽ
ãã£ããLangChainãæŽãã§ãããŸãããã
å
šäœåã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã

Models, Prompts, Chains, Agents, Memory, Indexesã®ïŒã€ã§ããã
å
ã»ã©ãäŒãããããã«ãããããã®æ©èœã«éçºãããçç±ãšã¢ãããŒã·ã§ã³ãååšããŸãã
æå°ã®æ§æèŠçŽ ããŸãModelsããå§ãåŸã
ã«çç±ãšãã®æ©èœãæããŠãããŸãããã
ãµã³ãã«ã³ãŒãã¯ä»¥äžã®ãªããžããªã«ãããŸãã
Models
ã¢ãããŒã·ã§ã³ïŒLLMãç°¡åã«åãããã
ãªã«ã¯ãšããããŸãåããããã§ãããã®éã«ã¯Modelsãå©çšããŸãããã

// src/01_model.ts
import { OpenAI } from "langchain/llms/openai";
require("dotenv").config();
export const run = async () => {
const model = new OpenAI();
const res = await model.call(
"ã«ã©ãã«ãªéŽäžãäœãäŒç€Ÿã®è¯ãååãèããŠãã ããã"
);
console.log(res);
};
run();
modelãå®çŸ©ããŠstringãå
¥ããŠcallããïŒãããã·ã³ãã«ã§ããããã ãã§ãLLMãåããããšãã§ããŸãã(å°ãå¥é.envã«APIããŒãèšå®ããŠãã ãã)
Modelsã¯ããŸããŸãªLLMç³»APIã®æå°ã®Wrapperã§ããOpenAI APIãæãæåããšæããŸãããHuggingFaceãClaudeãªã©ã®ä»ã®ãµãŒãã¹ãšé£æºããããšãã§ããŸãã
Prompts - Prompt Template
ã¢ãããŒã·ã§ã³ïŒLLMãžã®å ¥åãå¹ççã«åãåããã
ChatGPTãå©çšããŠãããšè€æ°ååããããªå ¥åãããã±ãŒã¹ããããšæããŸãã翻蚳ãªã©ã¯ç¹ã«
ããã®ç¿»èš³å®¶ã®ããã«æ¯ãèã£ãŠãã ããã
ã§ããã ãåæã®ãã¥ã¢ã³ã¹ãä¿æãã€ã€{targetLanguage}ã«ç¿»èš³ããŠãã ããã
ãšããããã«ããã¬ãŒã¹ãã«ããçšããŠå¹ççã«æ±ãããã§ãããã
ãã®å¹ççãªããã³ããã®éçšããŸãåŸè¿°ããChainsãšé£æºããããã«ååšããæ©èœãšãªããŸãã
// src/02_prompt_template01.ts
import { PromptTemplate } from "langchain/prompts";
require("dotenv").config();
export const run = async () => {
const prompt = new PromptTemplate({
inputVariables: ["product"],
template: "ã«ã©ãã«ãª{product}ãäœãäŒç€Ÿã®è¯ãååãèããŠãã ããã",
});
console.log(await prompt.format({ product: "éŽäž" }));
};
run();
Chains - LLMChain
ã¢ãããŒã·ã§ã³ïŒLLMã®å ¥åã䟿å©ã«ãæ±çšæ§ãæãããã
äžèšã®ModelãšPrompt Templateãããã«Wrapã以äžã®ããã«æ±ããŸãã

// src/03_chains01_llmchain.ts
import { OpenAI } from "langchain/llms/openai";
import { PromptTemplate } from "langchain/prompts";
import { LLMChain } from "langchain/chains";
require("dotenv").config();
export const run = async () => {
const prompt = new PromptTemplate({
inputVariables: ["product"],
template: "ã«ã©ãã«ãª{product}ãäœãäŒç€Ÿã®è¯ãååãèããŠãã ããã",
});
const model = new OpenAI();
const chain = new LLMChain({ llm: model, prompt });
const res = await chain.call({ product: "éŽäž" });
console.log(res);
};
run();
LLMChainãšããclassãåŒã³åºãpromptãšmodelãæž¡ãã°OKã§ãã
ååãŸã§PromptTemplateã¯æ¯åæååã«ããå¿
èŠããããŸãããLLMChainãå©çšãããšå®çŸ©ããåŒæ°ãLLMãžã®åŒæ°ã«ãªããããããå¹ççã«æ±ãããšãã§ããŸãã
ããããLangChainãåãçºæ®ããŸãããã®Chainãšããåäœã§LangChainã¯ããŸããŸã«äŸ¿å©ãªæ©èœãæäŸããŸãã
Chains - Simple Sequential Chain
ã¢ãããŒã·ã§ã³ïŒLLMãçšããå ¥åºåã®å€æãé£ç¶ã§è¡ããã
ChatGPTãçšããŠæç« ã®å€æããããªã£ãŠãããšã翻蚳âèŠçŽãšããããã«äœæ¥ãé£éçã«è¡ãããã±ãŒã¹ããããšæããŸãããã®éã«äœ¿ãããã®ãSequential Chainã§ãã
å
ã»ã©ãããLLMChainãè€æ°åãããã«äžæ®µéã©ããããããšã«ãã£ãŠäœ¿çšããŸãã

// src/03_chains02_sequentialchain.ts
import { OpenAI } from "langchain/llms/openai";
import { PromptTemplate } from "langchain/prompts";
import { LLMChain, SimpleSequentialChain } from "langchain/chains";
require("dotenv").config();
export const run = async () => {
//1ã€ç®ã®Chain
const outlinePromptTemplate = new PromptTemplate({
inputVariables: ["title"],
template: `ããªãã¯èæ¬å®¶ã§ããåã®ã¿ã€ãã«ãäžãããããããã®ã¿ã€ãã«ã®æŠèŠãæžãã®ãããªãã®ä»äºã§ãã
ã¿ã€ãã«: {title}
æŠèŠ:`,
});
const outlineModel = new OpenAI();
const outlineChain = new LLMChain({
llm: outlineModel,
prompt: outlinePromptTemplate,
});
//ïŒã€ç®ã®Chain
const reviewPromptTemplate = new PromptTemplate({
inputVariables: ["outline"],
template: `ããªãã¯ãã¥ãŒãšãŒã¯ã»ã¿ã€ã ãºã®æ¹è©å®¶ã§ããåã®ãããããèããŠããã®åã®æ¹è©ãæžãã®ãããªãã®ä»äºã§ãã
åã®æŠèŠ: {outline}
æ¹è©:`,
});
const reviewModel = new OpenAI();
const reviewChain = new LLMChain({
llm: reviewModel,
prompt: reviewPromptTemplate,
});
const overallChain = new SimpleSequentialChain({
chains: [outlineChain, reviewChain],
verbose: true,
});
const review = await overallChain.run("倿®ãæã®ããŒãã§èµ·ããæ²å");
console.log(review);
};
run();
äžèšã¯ãåäœå®¶ãæŠèŠãæžããæ¬¡æ®µã§ãæ¹è©å®¶ãæ¹è©ãäœãããšããSequentialChainãšãªããŸãã(å
¬åŒexampleããåŒçš)
SimpleSequentialChainãã€ã³ã¹ã¿ã³ã¹åããéã«ãå®è¡ãããé åºã«LLMChainãæž¡ããŸãããã
ãã®éãè€æ°ã®ã€ã³ããã/ã¢ãŠãããããæ¬²ãããšããã±ãŒã¹ãããã§ãããããã®éã¯SequentialChainãå©çšãããšå®çŸãå¯èœãšãªããŸãã
Memory
ã¢ãããŒã·ã§ã³ïŒæèãç¶æãããŸãŸããåããè¡ããã
ãããŸã§ã¯stringâ(LLM)âstringãšãã£ã圢ã§LangChainãæ±ã£ãŠããŸãããããããããã¯ç¶æ
ãä¿æãããŠãããChatGPTã®ãããª"以åã®ããåããåæ ããåºåâãã§ããŸãããããã解決ããã®ãMemoryã§ãã
以äžã®ããã«å°çšã®Chainãçšæãmodelãšèšæ¶é åã§ããmemoryãäžããŸãã

// src/04_memory01.ts
import { OpenAI } from "langchain/llms/openai";
import { BufferMemory } from "langchain/memory";
import { ConversationChain } from "langchain/chains";
require("dotenv").config();
export const run = async () => {
const model = new OpenAI({});
const memory = new BufferMemory();
const chain = new ConversationChain({ llm: model, memory: memory });
const res1 = await chain.call({ input: "ããã«ã¡ã¯ïŒ ãµã¬ã¯ã§ãã" });
console.log({ res1 });
const res2 = await chain.call({ input: "ç§ã®ååã¯ãªãã§ããïŒ" });
console.log({ res2 });
};
run();
äžèšãå®è¡ãããšã2åç®ã®ãªã¯ãšã¹ãæã«1åç®ã®ãããšããåæ ãããŠããããšã確èªã§ããŸãã
ã³ã³ãœãŒã«ã§å®è¡ã§ãããµã³ãã«ãçšæãããã詊ããŠã¿ãŠãã ããã
// src/04_memory02_chatdemo.ts
import { OpenAI } from "langchain/llms/openai";
import { BufferMemory } from "langchain/memory";
import { ConversationChain } from "langchain/chains";
import readline from "readline";
require("dotenv").config();
//äŒè©±èšé²ä¿æã®ãã颿°ã®å€åºã
const model = new OpenAI({});
const memory = new BufferMemory();
const chain = new ConversationChain({ llm: model, memory: memory });
const run = async (input: string) => {
const res = await chain.call({ input: input });
console.log({ res });
};
//æšæºå
¥åºåã®å®çŸ©
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
//å
¥åã®åŸ
æ©é¢æ°ã®å®çŸ©
const waitForUserInput = () => {
rl.question("ããªãã®å
¥åãåŸ
ã£ãŠããŸã: ", (input) => {
run(input).then(() => waitForUserInput()); //ååž°çã«åŒã³åºã
});
};
//äŒè©±ã®éå§
waitForUserInput();
Indexes - ãã¯ãã«ã¹ãã¢ã®å©çš
ã¢ãããŒã·ã§ã³ïŒå¿ èŠãªæ å ±ãåç §ãåçãäœæããã
äŸãã°OpenAIã®ã¢ãã«ã§ããgpt-3.5-turboãgpt-4ã¯2021幎9æãŸã§ã®ç¥èããæã¡ãŸãããããã¯ææ°ã®æ å ±ãèæ ®ãåçããããå Žåã«äžéœåã§ãããŸããQAbotãäœæãããéã«ã¯ãããç¹å®ã®æ å ±ãåç §ããã®æ å ±ã«åºã¥ããåçãäœæããããšããã±ãŒã¹ããããŸãã
ãããã解決ããã®ãIndexesã§ãã
å°çšã®chainãçšæãããã«modelãšæ
å ±ã®æ ŒçŽå Žæã§ããvectoreStoreãäžããŸãã

// src/05_indexes03_retrievalqa.ts
import { OpenAI } from "langchain/llms/openai";
import { RetrievalQAChain } from "langchain/chains";
import { HNSWLib } from "langchain/vectorstores/hnswlib";
import { OpenAIEmbeddings } from "langchain/embeddings/openai";
require("dotenv").config();
const run = async () => {
const vectorStore = await HNSWLib.load("store", new OpenAIEmbeddings());
const model = new OpenAI({});
const chain = RetrievalQAChain.fromLLM(model, vectorStore.asRetriever());
const res = await chain.call({
query: "ã¢ã¬ãã¯ã¹ã¯äœè
ïŒ",
});
console.log({ res });
};
run();
ããã§QABotã®ãããªã¢ããªãäœæã§ããã®ã§ãããæ¬¡ã®3ç¹ãçåã«ãªããšæããŸãã
- ããããã©ããªãªãœãŒã¹ãèªã¿èŸŒãã§ããã®ã
- ãã¯ãã«ã¹ãã¢ãšã¯äœã
-
RetrievalQAChainãšã¯äœã
å®ã¯ããã®äžé£ã®æµãã§ãã ããªãœãŒã¹ãçšæããŠãã¯ã¿ãŒåãretrieve(ååŸ)ããã ãšããè¡çºãããçŸåšã®LLMãçšããQABotã§éèŠãªä»çµã¿ã§ããæ°ããæŠå¿µã§ãã®ã§ã以äžã§èª¬æããŸãã
1. ã³ã³ããã¹ãé·ãšã®æŠã
è²ã ãªã¹ã¿ãŒãå°ç¹ãããã®ã§ãããçè ã¯LLMã®ã³ã³ããã¹ãé·ã«ç®ãåãããšèª²é¡ããããããããªããšæããŠããŸãã
ãŸããLLMã«ãªã«ãå¶éããªãã®ã§ããã°ä»¥äžã®ãããªããã³ããã§QABotãäœããã¯ãã§ãã
ããªãã¯QABotã§ãããŠãŒã¶ãŒããã®å
¥åãåãä»ã質åã«åçããŸãã
以äžã®ããã¥ã¡ã³ããåèã«åçãäœæããŠãã ããã
(--ããã¥ã¡ã³ãå
šããŒãž20äžæå--)
Q:{User Input}
A:
ãããããã¯ããŸããããŸãããLLMã«ã¯åºæ¬çã«æ±ããæååé·ã«å¶éãããããã§ãã
äŸãã°gpt-3.5-turboã ãšæ¥æ¬èªæç®ã§2500åååŸãgpt-4ã ãšãã®åçšåºŠã§ãã
ãŸããããã¯åœä»€æ(prompt)ã ãã§ã¯ãªãåºåé·ã«ã圱é¿ããããŸããã€ãŸããå
¥åºååèšã§2500å(5000å)以å
ã§ãªããŠã¯ãããªããšããããšã§ãã
ãããã£ãŠãå¶éã®äžã©ãã«ãããŠé¢é£ããæèãLLMã«æž¡ãè¿çããŠãããå¿ èŠããããŸãã
2. ãã¯ãã«æ€çŽ¢
ããã§ãæ€çŽ¢ãã䜿çšããŸããæ€çŽ¢ãšãããšããŒã¯ãŒãæ€çŽ¢ãæãæµ®ãã¹ããããããŸããããLLMã¢ããªã§ã¯ãããã¯ãã«æ€çŽ¢ã䜿çšãããŸããããã¯ããŒã¯ãŒããå«ãŸããªãã£ããšããŠããæèãæå³çãªé¡äŒŒæ§ãããšã«çµæãè¿ããä»çµã¿ãLLMãšçžæ§ãè¯ãããã§ãããã
ã©ããã£ããã®ãå°ãã ã解説ããŸãã
ãã¯ãã«æ€çŽ¢ã¯ã¯ãšãªãšã¿ãŒã²ããæç« ã®æå³çãªæ¹åæ§ãæ¯èŒãã䌌ãŠããã°è¿ããšããä»çµã¿ã®æ€çŽ¢ææ³ã§ãã
äŸãã°ä»¥äžã®ãããªæç« ãããŒã¿ããŒã¹ã«ä¿åãããŠãããšããŸãã
1. Next.jsã¯Reactã®ãã¬ãŒã ã¯ãŒã¯ã§ãã
2. TypeScriptãçšããããšã§JavaScriptã«åãå°å
¥ã§ããŸãã
3. ç§ã¯ãã¶ã奜ãã§ãã
次ã«ã以äžã®ãããªæååãã¯ãšãªãšãããšâŠ
ããã³ããšã³ãéçºã®ç°å¢
çµæãšããŠ1, 2ãè¿åŽãããŸãã
æç« ã«ã¯ãªããšãªããã®ãæ¹åæ§ãããããŸãããã¯ãã«æ€çŽ¢ã¯ãã®æ¹åæ§ãå©çšãã䌌ãç¢å°ã®åããé·ããã¿ãŠè¿äŒŒããŠããæç« ãè¿åŽããä»çµã¿ãšãªããŸãã
ããã«ãããããŒã¯ãŒããå«ãŸããŠããªããŠãæå³çã«è¿ãæç« ãè¿åŽã§ããŸãã
3. Word Embedding
ã§ã¯ãã®ãæç« ããšã®æ¹åæ§ã»ãã¯ãã«ãã©ã®ããã«å®çŸ©ããã®ãããšãããšããã§å©çšãããã®ã Word Embedding(åèªã®åã蟌ã¿) ã§ãã
詳现ã¯å²æããŸãããããå©çšããã°ããã¹ãããã¯ãã«ã«ããã£ãšè©³çްã«ãããšæ°åã®é
åã«ããããšãã§ããŸãã
| Embedding | Sentence |
|---|---|
| [0.12, 0.75, 0.33] | Next.jsã¯Reactã®ãã¬ãŒã ã¯ãŒã¯ã§ãã |
| [0.15, 0.72, 0.35] | TypeScriptãçšããããšã§JavaScriptã«åãå°å ¥ã§ããŸãã |
| [0.67, 0.89, 0.01] | ç§ã¯ãã¶ã奜ãã§ãã |
ãã®ãããã§å ã»ã©ã®çåã解決ã§ããã®ã§ã¯ãªãããšæããŸãã
- ããããã©ããªãªãœãŒã¹ãèªã¿èŸŒãã§ããã®ã
- ãã¯ãã«ã¹ãã¢ãšã¯äœã
- RetrievalQAChainãšã¯äœã
ããããã©ããªãªãœãŒã¹ãèªã¿èŸŒãã§ããã®ã
ããã¯ã¿ãŒã²ãããšãªãæç« ãæååã§ãã
ãã¯ãã«ã¹ãã¢ãšã¯äœã
ã¿ãŒã²ããã®æç« ããã¯ãã«åããå
ã»ã©ã®ããŒãã«ã®ããã«ãã¯ãã«ãšæç« ã®ãã¢ãšããŠä¿åãããã®ã§ãã
RetrievalQAChainãšã¯äœã
ãã¯ãã«æ€çŽ¢ãå
éšã«çµã¿èŸŒãã Chainã§ããäž»ãªæé ãšããŠã¯
- ã¯ãšãªèªäœãEmbeddingã§ãã¯ãã«åãã
ããã³ããšã³ãéçºã®ç°å¢â(Word Embedding)â[0.13, 0.76, 0.32]
- ãã¯ãã«ã¹ãã¢ã§ã¯ãšãªã®ãã¯ãã«ãšé¡äŒŒããã¿ãŒã²ããã®ãã¯ãã«ãæ¢ã
- äŸïŒ
[0.13, 0.76, 0.32]ãšé¡äŒŒãã[0.12, 0.75, 0.33],[0.15, 0.72, 0.35]
- äŸïŒ
- ãã¯ãã«ãkeyãšããŠã¿ãŒã²ããæç« ãååŸãã
- äŸïŒ
[0.12, 0.75, 0.33]âNext.jsã¯Reactã®ãã¬ãŒã ã¯ãŒã¯ã§ãã - äŸïŒ
[0.15, 0.72, 0.35]âTypeScriptãçšããããšã§JavaScriptã«åãå°å ¥ã§ããŸãã
- äŸïŒ
- ååŸããæç« ãããã³ããã«å ¥åãåçãåŸã
// äŸ
ããªãã¯QABotã§ãããŠãŒã¶ãŒããã®å
¥åãåãä»ã質åã«åçããŸãã
以äžã®ããã¥ã¡ã³ããåèã«åçãäœæããŠãã ããã
(æ¿å
¥éš)
Next.jsã¯Reactã®ãã¬ãŒã ã¯ãŒã¯ã§ãã
TypeScriptãçšããããšã§JavaScriptã«åãå°å
¥ã§ããŸãã
(ããã«è¿œå ã§retrieveãããããã¥ã¡ã³ãã®æç« ...)
Q:{User Input}
A:
Indexes - ãã¯ãã«ã¹ãã¢ã®äœæ
以äžã§ãã¹ãã¢ããå¿
èŠæ
å ±ãæãåºããŠåçãäœããããã«ãªããŸããã
æåŸã«ãŸã æ±ã£ãŠããªãããã¯ãã«ã¹ãã¢ã®äœææ¹æ³ãã«ã€ããŠããã®äœæããŒã«ãLangChainã¯çšæããŠããŸãããããã©ã€ãã©ãªã§ãã
å
·äœçã«ã¯Document Loaders, Text SplittersãšããããŒã«ã§ããããããçšããŠæåŸã«åçš®Vector Storesã§ãã¯ãã«ã¹ãã¢ãä¿åã§ããŸãã
ããããããšã¯
- ããã¹ããçšæãã
- ããã¹ããã¡ããã©è¯ãé·ãã«ããïŒé·ããããšã³ã³ããã¹ãé·ã«åãŸããªãããïŒ
- ã¡ããã©è¯ãé·ãã®æç« ããã¯ãã«ã«ãã
ã®3ã€ã§ããããã§ããããã®ããŒã«ã䜿ããŸãã
äŸãã°ä»¥äžã®ã¢ãžã¥ãŒã«ãå©çšããã°GitHubã®æ
å ±ãèªã¿èŸŒããŸãã
import { GithubRepoLoader } from "langchain/document_loaders/web/github";
export const run = async () => {
const loader = new GithubRepoLoader(
"https://github.com/hwchase17/langchainjs",
{ branch: "main", recursive: false, unknown: "warn" }
);
const docs = await loader.load();
console.log(docs);
};
run();
ãã®ããã«ããŠçšæããããã¹ããText SplittersãšVectore Storeã«æž¡ãããšã§ãã¯ãã«ã¹ãã¢ãäœæã§ããŸãã
import { HNSWLib } from "langchain/vectorstores/hnswlib";
import { OpenAIEmbeddings } from "langchain/embeddings/openai";
import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";
import * as fs from "fs";
require("dotenv").config();
export const run = async () => {
const text = fs.readFileSync("materials/story_by_gpt.txt", "utf8");
// ããã¹ãã®åå²
const textSplitter = new RecursiveCharacterTextSplitter({ chunkSize: 500 });
const docs = await textSplitter.createDocuments([text]);
//ãã¯ãã«ã¹ãã¢ã®äœæ
const vectorStore = await HNSWLib.fromDocuments(docs, new OpenAIEmbeddings());
vectorStore.save("store");
};
run();
ãã®ããã«ããŠãã¯ãã«ã¹ãã¢ã®äœæãšããããçšããIndexã«é¢é£ããChainãäœæã§ããŸãã
å°ã é·ã説æã«ãªã£ãŠããŸããŸããããVectorStoreãçšããããšãå éšã§ãã¯ãã«æ€çŽ¢ãåããŠããã³ãããäœæãããŠãããšããæŠå¿µãã€ããã§ãããšå šäœéãææ¡ãããããªãã¯ãã§ãã
Agents
ã¢ãããŒã·ã§ã³ïŒã¿ã¹ã¯èšèšããAIã«èããŠå®è¡ããŠã»ãã
Agentãå®çŸ©ããããã«modelãštoolsãæž¡ããŠå®è¡ããŸãã
æ§é ãšããŠã¯ã·ã³ãã«ã§Chainã®ä»£ããã«AgentãçšæãããŠãããæ°ãã«toolsãšããæŠå¿µãç»å ŽããŠããŸãã

// src/06_agents.ts
import { initializeAgentExecutorWithOptions } from "langchain/agents";
import { ChatOpenAI } from "langchain/chat_models/openai";
import { SerpAPI } from "langchain/tools";
import { Calculator } from "langchain/tools/calculator";
require("dotenv").config();
export const run = async () => {
const model = new ChatOpenAI({ modelName: "gpt-4" });
const tools = [new SerpAPI(), new Calculator()];
const executor = await initializeAgentExecutorWithOptions(tools, model, {
agentType: "chat-zero-shot-react-description",
verbose: true,
});
const result = await executor.call({ `仿¥ã®æ±äº¬ã®æé«æ°æž©ãææ°ã§èª¿ã¹ãŠãã ããããŸããã®æ°å€ã2åããå€ã¯ããã€ã§ããïŒ` });
console.log(`Got output ${result.output}`);
};
run();
Agentã¯åœä»€ãåãåããšäžããããéå ·(ããŒã«)ãæé©ãªé çªã«äžŠã³æ¿ããåœä»€ãå®è¡ããŸãã
éåžžã«ææ§ãªæŠå¿µãªã®ã§å
éšãèŠããŠå
·äœåããŠã¿ãŸãã
ãŸãToolèªäœã¯éåžžã«ã·ã³ãã«ã§æ¬¡ã®ãããªæ§é ã§ãã

æååãå
¥åºåã®é¢æ°ãšãååã説ææã®ã¿ã§ãã
ããã«ãã®ToolãLLMã«æž¡ãããçŽåŸã©ã®ãããªåããããã®ãèŠãŠã¿ãŸãããã

ãã®æåŸã«çæããã['æ€çޢ颿°','é»å颿°']ã®ãããªããŒã«ã®é çªãç¹å®ã§ããåºåãèã§ãã(å®éã®æåãšã¯è¥å¹²ç°ãªããŸã)
ã€ãŸãAgentããã£ãŠããããšã¯ãã¿ã¹ã¯(ãŽãŒã«)ãštool矀ãåãåããtoolã®èª¬ææãLLMã«æž¡ããŠæé©ãªé çªãåºåããããšããä»äºã§ãã
ããã«ããå€éšãžã®æ€çŽ¢æ©èœã§ãã£ãããèšç®åé¡ã®æ©èœãä»äžãã€ã€ããã®æè»ãªå®è¡ãä»»ããããšãã§ããŸãã
é çªã決å®ãããã°å
éšã§ã¯((input:string)=>Promise<string>)ã§ãæåååãæž¡ãã®é¢æ°ãå®è¡ãããŠãããŸãã

ãããã«
以äžãLangChainã®ãã£ãããšããã¡ã³ã¿ã«ã¢ãã«ãšãªããŸããããããLLMã¢ããªéçºãå§ããæ¹ã®ç°¡åãªå°å³ã«ãªãã°å¬ãããªããšæããŸãã
ä»åã®æŠèŠãæŒãããŠãããšã
ãRetrievalãããå°ãæ¡åŒµãããããªâŠããLlamaIndex詊ããŠã¿ããïŒã
ãªã©ä»ã®ã©ã€ãã©ãªãåŸç¶ã®LLMã©ã€ãã©ãªã®çè§£ããããããªãã¯ãã§ãã
ãã³ãè¯ã説æããããšæã£ãã®ã§ããéäžã¡ãã£ãšé·ããªã£ãŠããŸããŸããããã£ãšè©±ããããã©æ·±æãããããšçްãããªãã®ã§âŠ
Embeddingã¯ãŸãå¥ã®æç®ãªã©ã§èª¿ã¹ãŠã¿ãŠãã ãããããã ãã§ãããããããããã§ãã
ããã§ã¯ãã®ãããã§ïŒãŸããäŒãããŸãããïŒ
Discussion
LangChainè§Šã£ãŠã¿ããã£ãã®ã§å ¥éãšããŠãšãŠãåèã«ãªããŸããïŒïŒïŒ
ãããã©ã€ãã©ãªã§ããïŒïŒïŒ