基于 LangChain 的意图识别实践
引言:大语言模型的局限性
大型语言模型(LLM)在处理自然语言任务时表现出色,例如摘要新闻、提取文档细节或进行创意写作。然而,LLM 的设计原则并非基于确定性计算。正如 Andrej Karpathy 所言,它们更像是'梦境机器'。这意味着对于简单的数学运算,如 456 * 4343,LLM 往往无法通过预测下一个 token 给出精确答案。
当面对包含众多数值和符号的复杂方程时,即便是最先进的模型也可能力不从心。因此,在构建生产级应用时,我们需要引入外部工具来弥补 LLM 在逻辑推理和精确计算方面的不足。
核心方案:工具调用与意图分类
为了解决上述问题,我们采用了一种结合本地 LLM 与工具调用的架构。本方案的核心在于让应用程序能够自动识别用户意图,并在无需明确指令的情况下独立执行相应工具(如计算器)。
1. 利用 Ollama 进行提示分类
为了判断用户输入是否需要调用特定工具(例如计算器),我们可以使用轻量级的本地模型进行意图分类。Ollama 是一个优秀的本地 LLM 运行环境,适合此类低延迟场景。
实现逻辑
我们定义一个异步函数 isArithmeticExpression,它接收基础 URL、模型名称和用户提示。首先检查是否存在显式的触发指令(如前缀 calculate:),如果没有,则调用 Ollama 对提示进行分类。
const isArithmeticExpression = async (
baseURL: string,
model: string,
prompt: string,
): Promise<boolean> => {
// 检查开头的触发指令
if (prompt.trim().toLowerCase().startsWith("calculate:")) {
return new Promise((resolve) => resolve(true));
}
// 否则,尝试分类当前提示
const ollama = new Ollama({
baseUrl: baseURL,
model: model,
temperature: 0,
stop: [".", ","]
});
question = ;
ollama.(question).( {
.();
answer = response.().()[].();
answer.();
});
};


