news 2026/4/18 5:22:26

用 LangChain 驱动本地 Ollama 模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用 LangChain 驱动本地 Ollama 模型

这两年,大模型几乎成了开发者的“标配工具”:
写代码、查资料、做总结、当智能助手。

但你有没有认真想过一个问题:

我们真的必须把所有请求都发到云端 API 吗?

随着模型体积持续下降、硬件性能快速提升,以及 Ollama 这类工具逐渐成熟,
本地运行大模型,已经从早期的“极客尝鲜”,演进为一种可以在真实项目中落地的工程方案

这篇文章,我们就来完整走一遍:

如何使用 LangChain,基于最新 Runnable API,调用本地启动的 Ollama 模型,构建一个真正可用的本地大模型应用。


一、为什么选择 LangChain + Ollama?

先给结论:

Ollama 解决“模型怎么跑”,LangChain 解决“能力怎么用”。

这是目前本地大模型场景中,最自然、最稳定的一种组合方式


1️⃣ Ollama:本地大模型的“Docker”

你可以把 Ollama 理解为:
专门为大模型设计的一层运行时基础设施。

它解决的问题非常聚焦:

  • 统一模型的下载、管理与启动
  • 对外提供标准化 HTTP API(默认端口11434
  • 支持 LLaMA、Qwen、Mistral、DeepSeek 等主流模型
  • Mac / Linux / Windows 全平台可用
  • 天然适合 Docker / 私有化部署

一句话总结:

Ollama 把“跑模型”这件事,做成了基础设施能力。


2️⃣ LangChain:AI 应用的“控制中心”

如果你只是想“问一句、回一句”,直接调 Ollama API 当然也没问题。
但一旦进入真实工程场景,需求会迅速复杂化:

  • Prompt 如何复用、版本化?
  • 对话上下文如何管理?
  • 如何组合多步推理?
  • 后续怎么接 RAG、Agent、工具调用?

这些正是 LangChain 擅长的事情:

  • Prompt 模板与结构化输入
  • Runnable / LCEL 编排能力
  • 对话历史(Memory)管理
  • Tool、RAG、Agent 的统一抽象
  • 可自然演进到 LangGraph

所以一个非常自然的分工是:

LangChain 负责“编排与逻辑”,Ollama 负责“模型与算力”。


二、准备工作:本地启动 Ollama 模型

1️⃣ 使用 Docker 部署 Ollama(推荐)

/* by yours.tools - online tools website : yours.tools/zh/blood.html */ docker run \ -d \ --restart=always \ --name ollama \ --gpus=all \ -p 11434:11434 \ -v /home/data/ollama:/root/.ollama \ ollama/ollama

如果你对部署细节感兴趣,可以参考我之前的文章:

  • 《如何使用 Ollama 打造你的本地 AI 助手》
  • 《为本地部署的大模型添加 API Key 认证:Nginx 实现方案》

2️⃣ 拉取并运行模型

qwen3:8b为例:

/* by yours.tools - online tools website : yours.tools/zh/blood.html */ ollama pull qwen3:8b

简单测试:

ollama run qwen3:8b

如果可以正常对话,说明模型已经在本地成功运行。


三、LangChain 接入本地 Ollama(OpenAI 协议)

接下来进入核心部分:
如何用 LangChain 调用本地 Ollama?


1️⃣ 安装依赖

pip install langchain langchain-openai

这里我们使用OpenAI 兼容协议,这是目前最稳定、生态最完整的一种方式。


2️⃣ 创建 Ollama LLM(ChatOpenAI)

from langchain_openai import ChatOpenAI llm = ChatOpenAI( name="ollama-ai", model="qwen3:8b", base_url="http://localhost:11434/v1", api_key="your api key", temperature=0.7, timeout=300, )

几个关键点说明:

  • model必须与 Ollama 中的模型名称一致
  • base_url指向 Ollama,并注意使用/v1后缀
  • 这里使用的是OpenAI 标准协议,不是 Ollama 私有 API

3️⃣ 最简单的一次调用

response = llm.invoke("用一句话解释什么是 LangChain") print(response)

到这里,你已经完成了:

LangChain → 本地 Ollama → 本地大模型

这条完整调用链。


四、进阶用法:Prompt + Runnable(LCEL)

在真实项目中,几乎不会直接“裸调”模型。


1️⃣ PromptTemplate

from langchain_core.prompts import PromptTemplate prompt = PromptTemplate( input_variables=["question"], template="你是一个资深后端工程师,请用简洁、专业的语言回答:{question}", )

2️⃣ 输出解析(StrOutputParser)

from langchain_core.output_parsers import StrOutputParser parser = StrOutputParser()

显式的输出解析,是 LangChain 新 API 的重要特征:

  • 输出类型清晰
  • 便于后续切换为 JSON / Pydantic
  • 更适合工程化

3️⃣ Runnable 组合(推荐写法)

chain = prompt | llm | parser response = chain.invoke({ "question": "为什么本地部署大模型越来越流行?" }) print(response)

这就是 LangChain 当前主推的LCEL(表达式)写法
比早期的LLMChain更透明、也更可组合。


五、加入 Memory:真正的本地对话能力

⚠️一个非常重要的变化

在新的 Runnable 体系中,
Memory 不再是 Chain 的“隐藏参数”,而是显式的状态管理。


1️⃣ 定义对话历史存储

from langchain_core.chat_history import InMemoryChatMessageHistory store = {} def get_session_history(session_id: str): if session_id not in store: store[session_id] = InMemoryChatMessageHistory() return store[session_id]

2️⃣ Prompt 显式消费 history(关键)

from langchain_core.prompts import PromptTemplate prompt = PromptTemplate( input_variables=["history", "question"], template=""" 你是一个资深后端工程师。 以下是之前的对话历史: {history} 当前用户问题: {question} 请基于上下文给出连贯、准确的回答。 """.strip() )

这是很多人第一次使用 RunnableWithMessageHistory 时最容易忽略的一点:
历史是否生效,取决于 Prompt 是否显式使用{history}


3️⃣ 构建带记忆的 Runnable

from langchain_core.runnables.history import RunnableWithMessageHistory chain = prompt | llm | parser chat_chain = RunnableWithMessageHistory( chain, get_session_history, input_messages_key="question", history_messages_key="history", )

4️⃣ 调用(带 session_id)

config = {"configurable": {"session_id": "local-chat"}} print(chat_chain.invoke( {"question": "什么是 Ollama?"}, config=config )) print(chat_chain.invoke( {"question": "它和 LangChain 有什么关系?"}, config=config ))

到这里,你已经拥有了一个:

  • 支持上下文
  • 完全本地
  • 状态可控

的对话系统。

而且所有数据都只存在你的本地机器上


六、这套方案适合谁?

非常适合:

  • ✅ 本地工具 / 桌面应用
  • ✅ 内部知识库 / 私有 RAG
  • ✅ 研发辅助工具(代码、文档、SQL)
  • ✅ 对数据安全敏感的企业场景
  • ✅ 学习大模型工程化的开发者

不太适合:

  • ❌ 超大并发场景
  • ❌ 极限性能 / 超大模型
  • ❌ 面向公网的 C 端产品

七、一些来自实践的工程建议

最后分享几点真实踩坑后的经验:

  1. 模型别贪大

    • 7B / 8B 是当前本地部署的性价比甜点位
  2. Prompt 比模型更重要

    • 本地模型对 Prompt 非常敏感
  3. LangChain 要“模块化使用”

    • Prompt / LLM / Parser / Memory 明确分层
  4. Memory 要可演进

    • InMemory → Redis → 数据库 → Checkpointer
  5. Ollama 非常适合私有化场景

    • Docker + 内网 + 权限控制,工程成本极低

结语

过去一年,我们讨论最多的问题是:

“该用哪个云端大模型?”

而现在,越来越多开发者开始认真思考:

“哪些能力,其实可以放回本地?”

LangChain + Ollama 并不是为了“替代云”,
而是为我们提供了一个:

真正可控、可组合、可落地的本地大模型方案。

如果你正在做:

  • 本地 AI 工具
  • 私有化大模型
  • Agent / RAG 工程实践

那么这套组合,非常值得一试。


如果你觉得这篇文章对你有帮助,欢迎点赞 / 转发 / 收藏
下一篇,我会继续分享LangGraph 在本地大模型场景下的实战用法

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 0:19:54

WeKnora+RAG强强联合:打造企业专属知识大脑全解析

WeKnoraRAG强强联合:打造企业专属知识大脑全解析 1. 引言:当企业知识遇上智能问答 想象一下这个场景:公司新来的同事需要了解一款三年前发布的产品,产品手册有200多页;法务部门需要从堆积如山的合同里快速找到某个特…

作者头像 李华
网站建设 2026/4/18 2:03:22

DeepSeek-OCR效果展示:看AI如何精准识别文档结构

DeepSeek-OCR效果展示:看AI如何精准识别文档结构 1. 为什么文档识别不再只是“认字”? 你有没有遇到过这样的场景:扫描一份带表格的财务报表,PDF转Word后表格全乱了;拍下一页手写笔记,OCR只输出一堆错别字…

作者头像 李华
网站建设 2026/4/18 2:04:44

CVSS 10.0致命暴击!SandboxJS四大漏洞击穿沙箱,宿主系统无一生还

在云原生、低代码、Serverless 浪潮席卷的当下,JavaScript 沙箱早已成为守护宿主系统安全的“核心屏障”——无论是在线IDE的代码运行、插件市场的第三方脚本执行,还是云函数的多租户隔离,SandboxJS 这类沙箱工具都承担着“隔离危险、管控权限…

作者头像 李华
网站建设 2026/4/18 2:00:37

RexUniNLU在客服系统中的应用:智能问答实战

RexUniNLU在客服系统中的应用:智能问答实战 1. 引言:当客服遇到AI,会发生什么? 想象一下,你是一家电商公司的客服主管。每天,你的团队要处理成千上万条用户咨询:“这个衣服有黑色吗&#xff1…

作者头像 李华
网站建设 2026/4/18 2:04:13

开箱即用!Pi0具身智能镜像的三大核心功能体验

开箱即用!Pi0具身智能镜像的三大核心功能体验 关键词:Pi0、具身智能、机器人、动作预测、视觉-语言-动作模型、开箱即用、功能体验 摘要:本文带你快速上手体验Pi0具身智能镜像的三大核心功能。无需复杂的机器人硬件,也无需深度学习…

作者头像 李华
网站建设 2026/4/18 2:07:21

DeepSeek-OCR-2在学术研究中的应用:古籍数字化

DeepSeek-OCR-2在学术研究中的应用:古籍数字化 1. 引言:当古籍遇见AI,一场跨越时空的对话 想象一下,你是一位历史学者,面前摆着一本泛黄的明代古籍。纸张脆弱,墨迹斑驳,有些字迹已经模糊不清。…

作者头像 李华