556 字
3 分钟
LangChain.js学习笔记第二课

向量对比#

在智能体开发中,使用向量对比,可以使相似度高的两个提示词,调用缓存来进行回答,这样可以减少token和资源的消耗

初始化项目这里我使用的是pnpm

pnpm init

需要安装以下两个包

@langchain/ollama用于调用大模型

pnpm add @langchain/ollama

cosine-similarity用于进行余弦比较

pnpm add cosine-similarity

先引入两个包,创建问题回答模型和向量转换模型

import { Ollama, OllamaEmbeddings } from '@langchain/ollama'
// 余弦比较用于比较向量
import cosineSimilarity from 'cosine-similarity'
// 问题回答模型
const chatModel = new Ollama({
model: "llama3.2",
stream: true
})
// 向量转换模型
const embedder = new OllamaEmbeddings({
model: "nomic-embed-text-v2-moe"
})

创建缓存,并且编写向量对比函数,函数接收两个参数

  1. 用户的提示词
  2. 向量对比的阈值,如果大于等于阈值则使用缓存里面的回复,如果小于阈值,调用模型并且把用户提示词、向量、回复存入缓存。
import { Ollama, OllamaEmbeddings } from '@langchain/ollama'
// 余弦比较用于比较向量
import cosineSimilarity from 'cosine-similarity'
// 问题回答模型
const chatModel = new Ollama({
model: "llama3.2",
stream: true
})
// 向量转换模型
const embedder = new OllamaEmbeddings({
model: "nomic-embed-text-v2-moe"
})
/**
* 存储缓存
* item结构为
* {
input: textInput, // 用户的原始提示词
embedding: queryEmbedder, // 该提示词的向量
response: fullRes // 大模型的回复
}
*/
let cache = []
async function callLLM (textInput, threshold = 0.6) {
// 先吧用户问题转换为向量
const queryEmbedder = await embedder.embedQuery(textInput)
// 比较用户和缓存的每一项
for (const item of cache) {
const score = cosineSimilarity(queryEmbedder, item.embedding)
// 得到的分数和阈值做比较
if (score >= threshold) {
// 大于等于阈值就使用缓存里面的回答
console.log(`命中缓存\n`)
process.stdout.write(item.response)
return
}
}
// 如果缓存没命中调用模型,并且吧结果存储到缓存中
let fullRes = ''
const res = await chatModel.stream(textInput)
console.log(`未命中缓存\n`)
for await (const chunk of res) {
process.stdout.write(chunk)
fullRes += chunk
}
console.log(`\n`)
// 存入缓存
cache.push({
input: textInput, // 用户的原始提示词
embedding: queryEmbedder, // 该提示词的向量
response: fullRes // 大模型的回复
})
return
}
await callLLM('请你说一下muv-luv这部作品')
await callLLM('我想了解一下muv-luv这部作品')
LangChain.js学习笔记第二课
https://mizuki.mysqil.com/posts/langchainlession2/
作者
Larryhyc
发布于
2026-07-16
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00