十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在 LangChain.js 中使用 Ollama:@langchain/ollama 集成包完整实战指南

在 LangChain.js 中使用 Ollama:@langchain/ollama 集成包完整实战指南 在 LangChain.js 中使用 Ollamalangchain/ollama 集成包完整实战指南【免费下载链接】langchainjsThe agent engineering platform项目地址: https://gitcode.com/GitHub_Trending/la/langchainjs导读langchain/ollama是 LangChain.js 官方提供的 Ollama 集成包基于官方ollamaTypeScript SDK 构建让开发者可以在本地直接运行并调用 Llama、Mistral、Qwen 等开源模型无需任何云端 API Key。本文从安装与环境准备出发完整讲解ChatOllama聊天模型、Ollama文本补全模型与OllamaEmbeddings嵌入模型三大核心类的配置参数、工具调用与结构化输出用法并深入对应源码说明其底层调用链与消息转换机制最后给出该包自身的本地开发与测试流程。一、包定位与整体结构langchain/ollama位于仓库的 libs/providers/langchain-ollama 目录其核心代码集中在src/下从源码结构看共暴露四大类 APIChatOllama对话模型集成BaseChatModel子类推荐首选Ollama传统文本补全LLM子类OllamaEmbeddings嵌入向量生成Embeddings子类消息转换工具utils.ts与类型定义types.ts。所有导出统一从 src/index.ts 汇总。当前包版本为 1.3.0要求 Node.js 20运行时依赖ollamaSDK^0.6.3并以langchain/core^1.0.0作为 peer dependency具体可见 package.json。二、安装与环境准备1. 安装依赖包在项目中使用时需要同时安装集成包与核心包npm install langchain/ollama langchain/core2. 本地运行 Ollama 服务本包的一切能力都建立在本地 Ollama 服务之上需要按以下步骤准备从 Ollama 官网下载并安装 Ollama安装包默认自带服务端与 CLI拉取要使用的模型例如ollama pull llama3确认 Ollama 服务已启动安装完成后一般会自动在后台运行。默认情况下包会连接http://localhost:11434。如果服务运行在非默认地址可以在实例化模型时通过baseUrl选项自定义。3. baseUrl 的解析优先级从 chat_models.ts 的构造函数源码可以确认其优先级规则fields.baseUrl 环境变量 OLLAMA_BASE_URL 默认值 http://127.0.0.1:11434也就是说除了在代码中传入baseUrl也可以直接设置环境变量例如.env文件或命令行导出export OLLAMA_BASE_URLhttp://127.0.0.1:11434在Ollama与OllamaEmbeddings中同样遵循该优先级见 llms.ts 与 embeddings.ts。另外注意Ollama类会对以/结尾的baseUrl做去尾斜杠处理避免拼接出错。三、Chat ModelsChatOllama 快速上手1. 最小示例import { ChatOllama } from langchain/ollama; const model new ChatOllama({ model: llama3, // 默认值。 }); const result await model.invoke([human, Hello, how are you?]);其中model的默认值就是llama3。invoke的入参既可以是字符串也可以是一组 LangChain 消息对象如HumanMessage、SystemMessage等。返回结果是标准AIMessage包含content、response_metadata、usage_metadata等字段。2. 构造函数支持的两种写法从 chat_models.test.ts 的单元测试可以确认ChatOllama构造函数支持两种等价形式// 形式一直接传模型名字符串 const modelFromString new ChatOllama(llama3); // 形式二传完整配置对象 const modelFromObject new ChatOllama({ model: llama3 }); // 也可以把字符串与其余参数混用 const model new ChatOllama(llama3, { baseUrl: http://127.0.0.1:11435 });3. 核心构造参数ChatOllamaInput以下参数均可在new ChatOllama({...})时传入出处为 chat_models.ts 的接口定义参数类型默认值说明modelstringllama3要调用的模型名若本地不存在且开启自动拉取则会先下载baseUrlstringhttp://127.0.0.1:11434Ollama 服务地址其次读OLLAMA_BASE_URL环境变量headersHeaders \| Recordstring, string无附加到请求的自定义 HTTP 头checkOrPullModelbooleanfalse调用前是否检查模型本地是否存在不存在则自动pullstreamingboolean无是否流式输出formatstring \| Recordstring, any无指定 JSON 输出json或完整 JSON Schemafetchtypeof fetch全局fetch自定义 fetch 实现代理、鉴权等场景thinkboolean无是否启用思考模型如 DeepSeek-R1 等 reasoning 模型的输出内容4. 运行时调用参数ChatOllamaCallOptions除构造参数外还可以把参数作为第二个参数传给.invoke、.stream、.batch等 Runnable 方法或通过.withConfig、.bindTools绑定出处为 chat_models.ts参数类型说明stopstring[]遇到这些字符串即停止生成toolsBindToolsInput[]绑定给模型的工具定义formatstring \| Recordstring, any覆盖构造时的formatstreamUsageboolean是否在流式响应中聚合输出 token 用量默认truetool_choicenever已废弃ChatOllama 不支持指定工具选择5. 底层生成调用链ChatOllama的调用链非常清晰见 chat_models.ts_generate内部委托给_streamResponseChunks逐个消费流式 chunk再通过concat聚合为完整AIMessage_streamResponseChunks调用client.chat({ ...params, messages, stream: true })逐 chunk 累计prompt_eval_count与eval_count得到usage_metadata并在最后一个空内容 chunk 中携带完整response_metadata包含model_provider: ollama请求参数由invocationParams统一组装model、format、keep_alive、think、options所有模型采样参数与tools支持通过options.signalAbortSignal在流式过程中中断调用中断时会调用client.abort()取消底层请求。四、模型采样参数OllamaCamelCaseOptionsChatOllama、Ollama、OllamaEmbeddings三者的构造参数都扩展自 types.ts 中定义的OllamaCamelCaseOptions。该接口把 Ollama 原生 snake_case 参数映射为 TypeScript 风格的 camelCase并在invocationParams中重新转为 snake_case 发送给服务端。常用参数如下camelCase 参数转交 Ollama 的字段含义numCtxnum_ctx上下文窗口大小token 数numPredictnum_predict最多生成的 token 数temperaturetemperature采样温度topK/topPtop_k/top_p采样裁剪参数repeatPenaltyrepeat_penalty重复惩罚presencePenalty/frequencyPenaltypresence_penalty/frequency_penalty存在/频率惩罚seedseed随机种子固定后结果可复现numGpu/mainGpunum_gpu/main_gpuGPU 层数 / 主 GPU 编号numThreadnum_thread线程数useMmap/useMlockuse_mmap/use_mlock内存映射 / 内存锁定keepAlivekeep_alive模型驻留内存时间默认5mstopstop停止序列列表例如一个更贴近生产的配置const model new ChatOllama({ model: llama3.1:8b, temperature: 0, numCtx: 8192, numPredict: 512, topP: 0.9, keepAlive: 30m, });五、工具调用Tool CallingChatOllama.bindTools会把 LangChain 工具转换为 OpenAI 兼容的工具格式后传给 Ollama见 chat_models.tsimport { z } from zod; const GetWeather { name: GetWeather, description: Get the current weather in a given location, schema: z.object({ location: z.string().describe(The city and state, e.g. San Francisco, CA), }), }; const llmWithTools model.bindTools([GetWeather]); const aiMsg await llmWithTools.invoke( Which city is hotter today and which is bigger: LA or NY? ); console.log(aiMsg.tool_calls);模型返回的tool_calls包含工具名、参数与唯一 id可直接交给 Agent 框架执行并回填ToolMessage继续多轮对话。在消息转换层utils.tsLangChain 的AIMessage.tool_calls会被转换为 Ollama 的tool_calls数组而 Ollama 返回的 tool call 则会转回 LangChain 的tool_call_chunks并补齐 uuid。六、结构化输出Structured OutputwithStructuredOutput支持三种模式底层实现在 chat_models.tsfunctionCalling把 JSON Schema 包装成单一工具让模型调用再用createFunctionCallingParser解析jsonMode设置format: json强制 JSON 输出再解析为 schema 结构jsonSchema默认直接把完整 JSON Schema 作为format传给 Ollama由服务端约束输出再解析。import { z } from zod; const Joke z.object({ setup: z.string().describe(The setup of the joke), punchline: z.string().describe(The punchline to the joke), rating: z.number().optional().describe(How funny the joke is, from 1 to 10), }); const structuredLlm model.withStructuredOutput(Joke, { name: Joke }); const jokeResult await structuredLlm.invoke(Tell me a joke about cats); console.log(jokeResult);单元测试 chat_models.test.ts 覆盖了三种模式的合法输出解析、非法输出抛OutputParserException、自定义工具名name: GetName以及includeRaw: true时返回{ raw, parsed }等场景。集成测试见 chat_models_structured_output.int.test.ts。七、流式输出与用量元数据流式调用会逐 token 返回AIMessageChunkfor await (const chunk of await model.stream(input)) { console.log(chunk); }最后一个空内容 chunk 会携带response_metadatamodel、done_reason、total_duration、load_duration、prompt_eval_count、eval_count等 Ollama 统计与usage_metadataconst aiMsg await model.invoke(input); console.log(aiMsg.usage_metadata); // { input_tokens: 19, output_tokens: 20, total_tokens: 39 }流式 chunk 的转换逻辑封装在 utils/stream_events.ts并有独立的 stream_events 测试 与 chat_models_stream_events.test.ts 验证。八、Thinking 模型reasoning支持对于带思维链的模型ChatOllama与Ollama都支持think参数。开启后流式输出的 token 优先取responseMessage.thinking思考内容再取content正式回答见 chat_models.ts同时 Ollama 返回的thinking字段会被写入additional_kwargs.reasoning_content见 utils.ts。对应集成测试为 chat_models_think.int.test.ts 与 llms_think.int.test.ts。九、LLMOllama 文本补全模型对于无需对话上下文的补全场景可使用Ollama类llms.ts默认模型同样是llama3import { Ollama } from langchain/ollama; const ollama new Ollama({ baseUrl: http://localhost:11434, model: llama3, }); const stream await ollama.stream(Translate I love programming into German.); const chunks []; for await (const chunk of stream) { chunks.push(chunk); } console.log(chunks.join());它支持与ChatOllama相同的采样参数numCtx、temperature、topK等另外还支持多模态通过运行时参数images传入 base64 图片列表即可调用 Llava 等视觉模型见 llms.ts 的OllamaCallOptions。其_call同样是基于_streamResponseChunks聚合实现。十、EmbeddingsOllamaEmbeddingsOllamaEmbeddingsembeddings.ts用于把文本转为向量默认模型为mxbai-embed-largeimport { OllamaEmbeddings } from langchain/ollama; const embeddings new OllamaEmbeddings({ model: mxbai-embed-large, }); const vectors await embeddings.embedDocuments([Hello world, 你好世界]); const queryVec await embeddings.embedQuery(搜索关键词);核心参数参数默认值说明modelmxbai-embed-large嵌入模型名baseUrlhttp://localhost:11434服务地址其次读OLLAMA_BASE_URLdimensions无输出向量维度按模型支持情况keepAlive5m模型驻留时间truncatefalse是否截断超出上下文窗口的输入requestOptions无camelCase 的 Ollama 采样参数内部通过_convertOptions转为 snake_case见 embeddings.tsheaders/fetch无自定义请求头与 fetch 实现内部通过this.caller带maxConcurrency: 1的并发限制器调用client.embed并支持失败重试见 embeddings.ts。集成测试见 embeddings.int.test.ts。十一、消息转换机制utils.ts 负责 LangChain 消息与 Ollama 消息的双向转换convertToOllamaMessages按消息类型分发——human/generic转user支持image_url内容提取 base64 作为多模态images、ai转assistant携带tool_calls、system转system、tool转tool不支持的类型会抛错convertOllamaMessagesToLangChain把 Ollama 消息转回AIMessageChunk并把thinking写入additional_kwargs.reasoning_content。这部分逻辑有对应的 utils.test.ts 单元测试保障。十二、本地开发安装、构建与测试如果你想在 langchainjs 仓库内直接开发该包按照 README 的 Development 章节进行1. 安装依赖pnpm install仓库使用 pnpm workspace 管理根目录的 pnpm-workspace.yaml 与 package.json 定义了 monorepo 结构。2. 构建包在包目录内pnpm build或从仓库根目录按 filter 构建pnpm build --filter langchain/ollama构建工具为 tsdown产物输出到dist/同时生成 ESMindex.jsindex.d.ts与 CJSindex.cjsindex.d.cts双格式。3. 运行测试测试文件应放在src/下的tests/目录内。单元测试以.test.ts结尾集成测试以.int.test.ts结尾集成测试需要本地真实 Ollama 服务与已拉取的模型pnpm test # 运行全部单元测试 pnpm test:int # 运行集成测试需要本地 Ollama除此之外该包还接入 LangChain 官方标准测试套件依赖 internal/standard-tests 包通过以下命令运行pnpm test:standard # 标准单元 标准集成 pnpm test:standard:unit # 仅标准单元测试 pnpm test:standard:int # 仅标准集成测试对应测试文件为 chat_models.standard.test.ts 与 chat_models.standard.int.test.ts。4. 代码检查与格式化pnpm lint pnpm format5. 新增导出入口如需导出新文件要么在 src/index.ts 中 import 并 re-export要么把新入口加入 package.json 的exports字段然后运行pnpm build重新生成入口文件。十三、结合 LangChain 生态使用由于ChatOllama、Ollama、OllamaEmbeddings分别实现BaseChatModel、LLM、Embeddings接口因此可以直接用于 LangChain 生态的各类组合件——RunnableSequence管道、Agent如 examples/src/createAgent 中的createAgent示例、提示模板、向量存储检索等。仓库的 examples 目录提供了大量可直接参考的实战示例代码。总结langchain/ollama让本地大模型 LangChain.js 应用的开箱即用成为现实。掌握ChatOllama的构造参数与运行时参数、bindTools工具调用、三种结构化输出模式、think思维链支持再配合OllamaEmbeddings的向量化能力即可在完全离线、无 API 费用的前提下搭建完整的 RAG、Agent 与结构化抽取应用。【免费下载链接】langchainjsThe agent engineering platform项目地址: https://gitcode.com/GitHub_Trending/la/langchainjs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表