LangChain模型链

166 阅读3分钟

单独使用 LLM 对于简单的应用程序来说是可以的,但是更复杂的应用程序需要将 LLM 链接起来——要么彼此链接起来,要么与其他组件链接起来。 LangChain 为这种“链式”应用程序提供了 Chain 接口。我们通常将 Chain 定义为对组件的一系列调用,这些调用可以包括其他链。

调试链

verbose设置为 true 将在运行 Chain 对象时打印出它的一些内部状态。

const chat = new ChatOpenAI({
    modelName: "gpt-3.5-turbo",
    openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
});

const chain = new ConversationChain({ llm: chat, verbose: true });
const res = await chain.call({ input: "ChatGPT是什么?" });

console.log({ res });

添加内存(LLM + Memory)

const chat = new ChatOpenAI({
    modelName: "gpt-3.5-turbo",
    openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
});

const memory = new BufferMemory();

// 如果未提供 BufferMemory 实例,此特定链条将自动初始化一个,但在这里我们显式传递它。它还具有默认提示。
const chain = new ConversationChain({ llm: chat, memory });

const res1 = await chain.run("简要回答。彩虹的前三种颜色是什么?");
console.log(res1); // 彩虹的前三种颜色是红色、橙色和黄色。

const res2 = await chain.run("接下来的四种颜色呢?");
console.log(res2); // 彩虹的接下来四种颜色是绿色、蓝色、靛蓝色和紫色。

大语言模型链(LLM Chain)

大语言模型链(LLM Chain):最简单的链,直接将LLM和Prompt组合在一起。

// 我们可以从 PromptTemplate 和 LLM 构建 LLMChain。
const model = new OpenAI({
    modelName: "gpt-3.5-turbo",
    openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
    temperature: 0
});
const prompt = PromptTemplate.fromTemplate(
    "给一个制造{product}的公司起个好名字是什么?"
);
const chainA = new LLMChain({ llm: model, prompt });

// 结果是一个带有 `text` 属性的对象。
const resA = await chainA.call({ product: "多彩袜子" });
console.log({ resA });
// {"resA": {"text": "彩缤纷袜业"}

// 由于这个 LLMChain 是单输入、单输出的链条,我们也可以使用 `run` 方法。
// 这个便捷方法接受一个字符串,并返回链条响应中输出键字段的值。
// 对于 LLMChains,默认为 "text"。
const resA2 = await chainA.run("多彩袜子");
console.log({ resA2 });
// {"resA2": "彩缤纷袜业"}

顺序链(Sequential Chain)

顺序链(Sequential Chain):按照预定义顺序执行多个链,一个链的输出作为下一个链的输入。

// 这是一个用于根据戏剧标题撰写摘要的 LLMChain。
const llm = new OpenAI({
    modelName: "gpt-3.5-turbo",
    openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
    temperature: 0
});
const template = `你是一名剧作家。根据戏剧标题,你的任务是为该标题写一个摘要。

标题:{title}
剧作家:这是上述戏剧的摘要:`;
const promptTemplate = new PromptTemplate({
    template,
    inputVariables: ["title"],
});
const synopsisChain = new LLMChain({ llm, prompt: promptTemplate });

// 这是一个用于根据摘要撰写戏剧评论的 LLMChain。
const reviewLLM = new OpenAI({
    modelName: "gpt-3.5-turbo",
    openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
    temperature: 0
});
const reviewTemplate = `你是《纽约时报》的戏剧评论家。根据戏剧摘要,你的任务是为该戏剧写一篇评论。

戏剧摘要:
{synopsis}
《纽约时报》戏剧评论家对上述戏剧的评论:`;
const reviewPromptTemplate = new PromptTemplate({
    template: reviewTemplate,
    inputVariables: ["synopsis"],
});
const reviewChain = new LLMChain({
    llm: reviewLLM,
    prompt: reviewPromptTemplate,
});

const overallChain = new SimpleSequentialChain({
    chains: [synopsisChain, reviewChain],
    verbose: true,
});
const review = await overallChain.run("日落海滩上的悲剧");
console.log(review);
/*
《日落海滩上的悲剧》是一部令人心碎的戏剧,它以其对爱与失去的深刻描绘而引起观众的共鸣。故事发生在一个美丽的海滩上,男主角是一个富有才华的艺术家,女主角则是一个热情而自由的灵魂。他们在日落时相遇,并迅速陷入了热烈的爱情之中。

然而,他们的爱情之旅并不顺利。社会和家庭的压力,以及彼此之间的误解和矛盾,使得他们的关系逐渐破裂。观众将目睹他们的爱情走向悲剧的结局,这是一种令人心痛的体验。

这部戏剧通过展现人性的脆弱和爱情的复杂性,深入探讨了人们在追求自由和幸福时所面临的挑战。观众将被戏剧中的角色所触动,他们的痛苦和挣扎将引发对生活和爱情的深思。

《日落海滩上的悲剧》提醒我们珍惜当下,勇敢面对困难,并在逆境中寻找希望和力量。这部戏剧将引发观众的情感共鸣,让他们思考自己的生活和爱情。它是一部令人难忘的作品,值得观众们去体验和品味。
*/