556 字
3 分钟
LangChain.js学习笔记第二课
向量对比
在智能体开发中,使用向量对比,可以使相似度高的两个提示词,调用缓存来进行回答,这样可以减少token和资源的消耗
初始化项目这里我使用的是pnpm
pnpm init需要安装以下两个包
@langchain/ollama用于调用大模型
pnpm add @langchain/ollamacosine-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"})创建缓存,并且编写向量对比函数,函数接收两个参数
- 用户的提示词
- 向量对比的阈值,如果大于等于阈值则使用缓存里面的回复,如果小于阈值,调用模型并且把用户提示词、向量、回复存入缓存。
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/ 部分信息可能已经过时