发布时间:2026/7/27 3:11:28
Embedding 基础使用:用 Ollama 和 LangChain.js 生成文本向量 前言Embedding 的基本使用流程并不复杂文本 ↓ Embedding 模型 向量本文会完成以下内容使用 Ollama 在本地运行 Embedding 模型通过 Ollama HTTP API 生成向量使用 LangChain.js 调用 Embedding 模型理解embedQuery()和embedDocuments()。本文只关注最基础的向量生成过程暂时不展示相似度计算和语义搜索的具体实现也不引入向量数据库和完整 RAG 项目。一、Embedding 的输入和输出Embedding 模型接收文本返回一个固定长度的数字数组。例如“如何重置密码” ↓ Embedding 模型 [0.12, -0.35, 0.81, ..., 0.27]在 TypeScript 中一条文本生成的向量可以表示为const vector: number[] [0.12, -0.35, 0.81, 0.27];多条文本则会得到多个向量const vectors: number[][] [ [0.12, -0.35, 0.81, 0.27], [0.09, -0.31, 0.77, 0.30], ];真实模型输出的向量通常包含数百或数千个数字。为了便于阅读示例中只展示前几个值。向量中的单个数字通常不适合被单独解释。真正有用的是不同向量之间的整体关系语义相近的文本其向量通常也更接近。二、准备 Ollama 和 Embedding 模型1. Ollama 是什么Ollama 是一个本地模型运行工具。它负责下载、管理和运行模型并向应用程序提供 HTTP API。这里需要区分两个概念Ollama 运行模型的服务 nomic-embed-text 实际把文本转换成向量的模型Ollama 本身不是 Embedding 模型。2. 下载模型安装并启动 Ollama 后下载本文使用的模型ollama pull nomic-embed-text查看已经下载的模型ollama list正常情况下可以在列表中看到nomic-embed-text。3. 确认 Ollama 服务地址Ollama 默认提供本地服务http://localhost:11434如果 Ollama 桌面程序没有自动启动服务可以执行ollama serve三、通过 Ollama HTTP API 生成向量在使用 LangChain.js 之前可以先直接调用 Ollama API观察 Embedding 模型的原始返回结果。执行curl http://localhost:11434/api/embed \ -H Content-Type: application/json \ -d { model: nomic-embed-text, input: 如何重置密码 }返回结果的结构类似{ model: nomic-embed-text, embeddings: [ [0.012, -0.035, 0.081, 0.027] ] }其中model表示使用的模型input是需要转换的文本embeddings是模型生成的向量列表。即使只传入一条文本embeddings仍然是二维数组因为接口也支持批量输入curl http://localhost:11434/api/embed \ -H Content-Type: application/json \ -d { model: nomic-embed-text, input: [ 如何重置密码, 忘记密码后怎样重新设置, 今天天气怎么样 ] }三条文本会按输入顺序得到三个向量。至此我们已经完成了最基础的调用文本 → Ollama API → nomic-embed-text → 向量四、使用 LangChain.js 调用 Embedding 模型直接调用 HTTP API 没有问题但在 LangChain.js 应用中通常会使用OllamaEmbeddings。它是 LangChain 对 Ollama Embedding API 的客户端封装。调用关系如下TypeScript 程序 ↓ OllamaEmbeddings ↓ HTTP Ollama 服务 ↓ nomic-embed-text ↓ 数值向量1. 安装依赖在 TypeScript 或 Node.js 项目中安装npm install langchain/ollama2. 创建 Embedding 客户端import { OllamaEmbeddings } from langchain/ollama; const embeddings new OllamaEmbeddings({ model: nomic-embed-text, baseUrl: http://localhost:11434, });两个主要参数分别是参数作用model指定 Ollama 中使用的 Embedding 模型baseUrl指定 Ollama 服务地址创建OllamaEmbeddings对象时主要是在保存客户端配置。真正调用向量生成方法时才会向 Ollama 发出请求。五、使用embedQuery()生成单个向量embedQuery()接收一条文本返回一个向量const vector await embeddings.embedQuery(如何重置密码); console.log(vector.length); console.log(vector.slice(0, 5));返回值类型可以理解为number[]完整示例import { OllamaEmbeddings } from langchain/ollama; const embeddings new OllamaEmbeddings({ model: nomic-embed-text, baseUrl: http://localhost:11434, }); const vector await embeddings.embedQuery(如何重置密码); console.log(向量维度, vector.length); console.log(前 5 个值, vector.slice(0, 5));embedQuery()通常用于查询阶段例如把用户输入的问题转换成查询向量。需要注意它只负责生成向量不会自动搜索文档也不会生成自然语言回答。六、使用embedDocuments()批量生成向量embedDocuments()接收多条文本返回多个向量const vectors await embeddings.embedDocuments([ 如何重置密码, 忘记密码后怎样重新设置, 今天天气怎么样, ]);返回值类型可以理解为number[][]可以检查返回数量和向量维度console.log(向量数量, vectors.length); console.log(每个向量的维度, vectors[0].length);输入文本与输出向量按顺序对应texts[0] → vectors[0] texts[1] → vectors[1] texts[2] → vectors[2]embedDocuments()通常用于索引阶段为多个文档片段批量生成向量。两个方法可以这样记忆embedQuery(text) → 一条文本 → 一个向量 embedDocuments(texts) → 多条文本 → 多个向量它们的区别主要体现在调用语义和输入数量上。部分模型还会针对“查询”和“文档”使用不同的编码方式因此在实际项目中应按照用途选择正确的方法。七、基础使用中的重要规则1. 文档和查询必须使用同一个模型正确方式文档 → nomic-embed-text → 文档向量 问题 → nomic-embed-text → 查询向量错误方式文档 → 模型 A → 文档向量 问题 → 模型 B → 查询向量不同模型生成的向量通常不在同一个语义空间中。即使两个模型输出的维度相同也不代表它们可以直接比较。因此更换 Embedding 模型后通常需要重新生成所有文档向量。2. 向量维度必须一致计算余弦相似度时两个向量必须具有相同维度。如果一个向量是 768 维另一个是 1024 维就不能直接进行对应位置的计算。3. 相似度高不等于事实正确Embedding 判断的是“语义是否接近”而不是“内容是否真实”。两段内容可能表达相似但同时包含错误信息。因此语义相似度不能代替事实校验。4. 不要直接照搬固定阈值不能简单认为相似度大于 0.8 就一定相关不同模型、文本长度、语言和业务数据的分数分布都可能不同。阈值应该使用真实样本进行评估后再确定。5. 长文档通常需要先分块虽然部分模型支持较长输入但不建议把包含多个主题的整篇文档直接生成一个向量。例如一篇文档同时包含用户注册密码重置权限管理订单支付。如果整篇文档只生成一个向量具体主题可能被稀释。实际检索系统通常先把文档切成多个语义相对完整的片段再分别生成向量。6. 索引时尽量批量生成向量为大量文档建立索引时应优先使用embedDocuments()批量处理而不是对每条文本单独调用一次embedQuery()。批量调用通常可以减少请求次数提高索引效率。具体批次大小需要根据模型服务的输入限制和机器资源进行调整。八、常见问题1. 为什么提示连接不到 Ollama先确认 Ollama 服务正在运行并检查地址是否正确http://localhost:11434可以使用以下命令启动服务ollama serve如果应用运行在 Docker 容器或另一台机器中localhost指向的是应用自身所在的环境需要改成应用能够访问的 Ollama 地址。2. 为什么提示模型不存在通常是因为模型尚未下载。执行ollama pull nomic-embed-text然后通过ollama list确认模型名称与代码中的model配置一致。3.OllamaEmbeddings会保存向量吗不会。它只负责请求模型并返回向量。向量需要由应用程序自行保存或者交给向量数据库管理。4.OllamaEmbeddings能生成自然语言回答吗不能。它调用的是 Embedding 模型输出是数值向量。生成自然语言回答需要聊天模型或其他大语言模型客户端。5. 为什么相似文本的分数没有想象中高可能原因包括模型对当前语言支持有限文本过短缺少足够上下文两段文本属于特定专业领域使用了不适合当前任务的模型固定阈值并不适合当前模型的分数分布。判断效果时不要只检查一组文本。更可靠的方式是准备一批相关和不相关样本观察整体排序表现。6. 可以把向量打印出来直接分析吗可以打印但通常很难从单个数字中直接理解模型学到了什么。更有意义的检查方式是比较相似度查看检索排序检查正确结果是否出现在 Top-K 中使用真实问题构建评估集。

相关新闻

2026/7/27 3:06:28

Solana实现750 TPS的技术原理与高性能DApp开发实践

如果你最近关注区块链性能优化,可能会注意到一个让人惊讶的数字:Solana 网络在 7 月有望达到 750 token/秒的处理速度。这个数字背后不仅仅是技术参数的提升,更意味着区块链基础设施正在经历从"够用"到"实用"的关键转折点…

2026/7/27 3:06:28

深入解析C++ std::list:双向链表的迭代器稳定性与实战应用

1. 项目概述:为什么我们需要再次审视std::list?在C的日常开发中,std::vector因其连续内存和缓存友好性,几乎成了默认的“首选容器”。但作为一名有经验的C开发者,我常常发现,当新手甚至一些中级开发者遇到需…

2026/7/27 3:06:28

C/C++实现LU分解:从算法原理到高性能工程实践

1. 项目概述:为什么LU分解是数值计算的基石如果你写过C或C程序来处理线性方程组,比如在图形学里做坐标变换,或者在物理模拟中求解受力平衡,那你大概率绕不开一个核心算法:LU分解。我第一次接触它是在大学的一门数值分析…

2026/7/27 6:07:09

智能体技能开发实战:从天气查询到多模态输出

1. 什么是Agent Skills?Agent Skills(智能体技能)本质上是一组可复用的功能模块,让AI智能体具备完成特定任务的能力。就像给机器人安装不同的工具包——拧螺丝需要电动起子,切割金属需要激光刀,每个技能都对…

2026/7/27 6:07:09

央企合同治理新规:穿透式监管与智能合同管理实践

1. 央企合同治理新规深度解读最近一份编号46的监管文件在央企系统内引发广泛讨论,这份关于合同治理的新规最引人注目的就是提出了"穿透式监管"这一创新理念。作为在央企法务部门工作十余年的从业者,我深刻感受到这不仅是简单的流程调整&#x…

2026/7/27 6:07:09

整理infrared热点(二)

#long-distance-relationship #突然很确信我们有些地方有点像蜘蛛侠与格温 三、具有尺度和位置敏感性的红外小目标检测Infrared Small Target Detection with Scale and Location Sensitivity 插曲 去了解一下特征融合-发现是深度学习里的 【极致中配】Stanford CS231N 计算…

2026/7/27 6:07:09

TMS320F28xx硬件设计实战:从电源、时钟到PCB布局的可靠性指南

1. 项目概述:从芯片到稳定系统,硬件设计的挑战与应对在嵌入式控制领域,尤其是电机驱动、数字电源和新能源逆变器这些对实时性和可靠性要求极高的场景,德州仪器(TI)的TMS320F28xx/F28xxx系列数字信号控制器&…

2026/7/27 6:07:09

基于Transformer的多变量时间序列预测系统设计与实践

1. 项目概述与背景在当今数据驱动的时代,多变量时间序列预测已成为金融、工业、医疗等众多领域的关键技术需求。传统的时间序列预测方法如ARIMA、VAR等线性模型在处理复杂非线性关系和高维变量交互时表现有限,而RNN/LSTM等递归神经网络又面临长距离依赖捕…

2026/7/27 6:02:09

Golang调用Windows API实现ARP扫描与网络探测

1. 项目概述:为什么要在Golang里调用Windows API发ARP?如果你做过网络运维或者安全渗透测试,对arp -a这个命令肯定不陌生。它列出了本地ARP缓存表,告诉你哪个IP对应哪个MAC地址。但有时候,你需要更主动一点——不是被动…

2026/7/26 0:03:36

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/7/27 0:01:12

xcku5p-ffvb676-2-i 设计 RoCEv2 时 constraints.xdc 配置依据核查记录

constraints.xdc 配置依据核查记录 被核查文件:fpga/vitis/xcku5p/build/constraints/constraints.xdc 目标板卡:RK-XCKU5P-F V1.2(搭载 xcku5p-ffvb676-2-i) 移植母本:fpga/pynq/rfsoc-pynq/build/constraints/constraints.xdc(NVIDIA Holoscan Sensor Bridge 参考工程)…

2026/7/27 0:01:12

TMS320C54x DSP内存映射与I/O模拟配置实战指南

1. 项目概述与核心价值在嵌入式系统开发,尤其是DSP这类资源受限、架构独特的处理器上,内存映射配置和I/O模拟是每个开发者都必须跨越的一道坎。这不仅仅是调试器里的几个菜单选项或命令行参数,它直接关系到你的程序能否在目标板上正确运行、能…

2026/7/27 3:13:33

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…