添加依赖

pnpm add langchain @langchain/core   #添加langchain核心库
pnpm add @langchain/openai #这边的示例使用openai的作为展示
pnpm add dotenv #添加dotenv作为配置库

设置环境变量

创建一个.env文件,写入

API_KEY=...
BASE_URL=...

对应的openai的apikey,以及如果使用代理的话,对应的代理地址。当然如果没有使用代理的话,就不需要这一项。

调用大语言模型进行对话

import { ChatOpenAI } from '@langchain/openai'
import { HumanMessage, SystemMessage } from '@langchain/core/messages'
import 'dotenv/config'

//创建符合OpenAI接口的模型实例
const model = new ChatOpenAI({
modelName: 'o3-mini', //模型名称
openAIApiKey: process.env.API_KEY, //从配置中获取api_key
configuration: {
baseURL: process.env.BASE_URL, //从配置中获取代理URL
},
})


//创建对话
const messages = [
new SystemMessage('将下面的话从中文翻译成英语'), //系统Message
new HumanMessage('PHP是世界上最好的编程语言'), //用户输入Message
]

const result = await model.invoke(messages)

console.log(result.content)

输出

使用其他的方式构建对话Message

//原先的
const messages = [
new SystemMessage('将下面的话从中文翻译成英语'),
new HumanMessage('PHP是世界上最好的编程语言'),
]

//现在的
const messages = [
{ role: 'system', content: '将下面的话从中文翻译成英语' },
{ role: 'user', content: 'PHP是世界上最好的编程语言' },
]

上面这两种写法是等价的,将对应的Message对象简化为包含role和content的对象。

Message对象分为:

  • SystemMessage: 对应的system这种role
  • HumanMessage: 对应的user这种role
  • AIMessage: 对应assistant这种role
  • AIMessageChunk: 对应assistant这种role,用于stream模式下的回复
  • ToolMessage: 对应tool这种role

进一步简化,可以将对象换成数组,数组的第一个元素就是role,第二个元素就是content

const messages = [
['system', '将下面的话从中文翻译成英语'],
['user', 'PHP是世界上最好的编程语言'],
]

这样也是一样的。

Streaming 流式传输

chat model的运行是异步的,提供了一个streaming模式调用。这样返回的内容可以一段一段返回,而不是等到完全生成之后,在一次性返回。

const stream = await model.stream(messages)

for await (const chunk of stream) {
process.stdout.write(chunk.content)
}

为了演示的更加明显这里使用了deepseek-r1模型(deepseek-r1模型带长思考)

Prompt Templates 提示词模板

为了更好的去复用一些提示词,比如我们想让用户输入的内容从中文翻译成英文,下次的时候想要从中文翻译成日文,再下次可能是法文等等,其中变化的其实只有一小部分,这一小部分我们可以抽离出来作为变量。

import { ChatPromptTemplate } from '@langchain/core/prompts'

const systemTemplate = '将下面的内容从中文翻译成{language}'

//有可能进行变更的部分都可以用{变量名}的形式提出去,方便修改
const promptTemplate = ChatPromptTemplate.fromMessages([
['system', systemTemplate],
['user', '{text}'],
])

//生成提示词,传入变量对应的内容
const promptValue = await promptTemplate.invoke({
language: '日文',
text: '好好学习,天天向上',
})

//执行
const stream = await model.stream(promptValue)

for await (const chunk of stream) {
process.stdout.write(chunk.content)
}

效果

总结

这样一个简单的LLM应用就完成了,在langchain的帮助下,我们仅需要关心使用的模型,一些提示词之类的,将调用和解析模型返回之间的过程都省去了。