【LangChain】langchain_ollama.OllamaLLM:通过 Ollama 服务调用本地或远程 LLM 生成文本
langchain_ollama.OllamaLLM 是一个便捷的 LLM 类,通过 Ollama 服务调用本地或远程模型(如 llama3)。核心功能包括:方法:invoke(同步)、stream(流式)、ainvoke/astream(异步)。参数:model(模型选择)、base_url(服务地址)、temperature(随机性)。使用方式:连接 Ollama 服务,生成文本,结合提示模板
langchain_ollama.OllamaLLM是 LangChain 提供的一个大型语言模型(LLM)类,用于通过 Ollama 服务(一个轻量级工具,用于运行本地 LLM)进行文本生成。
本文基于 LangChain 0.3.x,详细介绍 langchain_ollama.OllamaLLM 的初始化、方法、参数和典型场景,并提供一个独立示例,展示如何使用 OllamaLLM 结合 langchain_core.prompts.PromptTemplate 构建一个简单的问答系统,示例使用 Ollama 的 llama3 模型。
OllamaLLM 简介
langchain_ollama.OllamaLLM 是 LangChain 的 LLM 类,继承自 langchain_core.language_models.llms.LLM,通过 Ollama 服务调用本地或远程 LLM(如 llama3、mistral)生成文本。它适合本地化场景,无需云 API,广泛用于对话、问答和 RAG 系统。
核心功能:
- 生成文本,支持对话、问答等任务。
- 通过 Ollama 服务运行本地 LLM,保护数据隐私。
- 支持同步、异步和流式生成,兼容 CPU 和 GPU。
- 集成 LangChain 链(如 LCEL),可与提示模板、向量存储结合。
适用场景:
- 本地问答或对话系统。
- 隐私敏感应用(如医疗、金融)。
- 快速部署,支持多模型切换。
- 开发测试,无需云服务。
与 LlamaCpp 对比:
- OllamaLLM:通过 Ollama 服务运行,部署简单,支持多模型,易于管理。
- LlamaCpp:直接加载 GGUF 模型,性能优化更灵活,但需手动配置。
初始化和配置
OllamaLLM 通过连接到 Ollama 服务(默认本地 http://localhost:11434)调用 LLM。以下是初始化和配置的关键点。
1. 安装依赖
pip install --upgrade langchain langchain-ollama
- Ollama 服务:安装并运行 Ollama:
# Linux/macOS curl -fsSL https://ollama.com/install.sh | sh # 启动 Ollama 服务 ollama serve # 拉取 LLM ollama pull llama3 - Windows:从 Ollama 官网 下载安装程序。
2. 准备 Ollama 模型
- 推荐模型:
llama3:Meta AI 的 LLaMA 3(8B 或 70B),性能强大,适合问答。mistral:Mistral AI 的开源模型,轻量高效。phi3:Microsoft 的小型模型,适合资源受限设备。
- 拉取模型:
ollama pull llama3 - 验证:确保模型可用:
ollama list
3. 初始化 OllamaLLM
常用初始化参数:
model(str,默认llama3):Ollama 模型名称。base_url(str,默认http://localhost:11434):Ollama 服务地址。temperature(float,默认 0.8):控制生成随机性,0~1。top_p(float,默认 1.0):Top-p 采样参数。top_k(int,默认 40):Top-k 采样参数。max_tokens(int,默认 None):最大输出 token 数。stop(List[str],默认 None):停止词列表。client_kwargs(dict,默认{}):Ollama 客户端配置,如超时时间。
示例初始化(本地服务):
from langchain_ollama import OllamaLLM
llm = OllamaLLM(
model="llama3",
base_url="http://localhost:11434",
temperature=0.7,
max_tokens=512,
stop=["\n"]
)
远程服务配置:
llm = OllamaLLM(
model="llama3",
base_url="http://your-ollama-server:11434",
temperature=0.7,
max_tokens=512
)
注意:
- 确保 Ollama 服务运行并模型已拉取:
curl http://localhost:11434/api/tags - 模型性能依赖硬件(如
llama3:8b需 8GB+ RAM)。
常用方法
以下是 OllamaLLM 的核心方法,基于源码(langchain_ollama/llms.py)和官方文档(OllamaLLM)。
invoke(input: str, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs) -> str
- 功能:同步调用模型,生成文本。
- 参数:
input:输入提示字符串。config:运行时配置,如max_tokens。stop:停止词列表。**kwargs:附加参数。
- 返回值:
str,生成的文本。 - 使用场景:
- 简单问答或文本生成。
- LCEL 链集成。
- 示例:
response = llm.invoke("什么是人工智能?") print(response)
stream(input: str, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs) -> Iterator[str]
- 功能:流式生成文本,逐块返回结果。
- 参数:同
invoke。 - 返回值:
Iterator[str],生成文本的迭代器。 - 使用场景:
- 实时显示生成结果(如聊天界面)。
- 处理长输出。
- 示例:
for chunk in llm.stream("人工智能有哪些应用?"): print(chunk, end="", flush=True)
ainvoke(input: str, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs) -> Awaitable[str]
- 功能:异步调用模型,生成文本。
- 参数:同
invoke。 - 返回值:
Awaitable[str],异步返回生成的文本。 - 使用场景:
- 异步应用(如 Web 服务)。
- 高并发场景。
- 示例:
import asyncio async def run(): response = await llm.ainvoke("什么是人工智能?") print(response) asyncio.run(run())
astream(input: str, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs) -> AsyncIterator[str]
- 功能:异步流式生成文本,逐块返回。
- 参数:同
stream。 - 返回值:
AsyncIterator[str],异步生成文本的迭代器。 - 使用场景:
- 异步实时输出(如 WebSocket 聊天)。
- 高并发流式处理。
- 示例:
async def run_stream(): async for chunk in llm.astream("人工智能有哪些应用?"): print(chunk, end="", flush=True) asyncio.run(run_stream())
方法总结
| 方法 | 功能 | 典型场景 |
|---|---|---|
invoke |
同步生成 | 简单问答 |
stream |
流式生成 | 实时输出 |
ainvoke |
异步生成 | 异步服务 |
astream |
异步流式 | Web 服务 |
推荐方法:
invoke:标准同步调用,适合 LCEL 链。stream:实时输出,适合交互应用。
使用 OllamaLLM 的问答示例
以下是一个独立示例,展示如何使用 OllamaLLM 结合 langchain_core.prompts.PromptTemplate 构建一个简单问答系统,回答关于人工智能的问题。示例使用 invoke 和 stream 方法。
准备 Ollama:
- 启动 Ollama 服务:
ollama serve - 拉取模型:
ollama pull llama3
代码:
from langchain_ollama import OllamaLLM
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# 初始化 OllamaLLM
llm = OllamaLLM(
model="llama3",
base_url="http://localhost:11434",
temperature=0.7,
max_tokens=512,
stop=["\n"]
)
# 定义 PromptTemplate
prompt = PromptTemplate(
template="""你是一个人工智能专家,回答以下问题:
问题:{question}
回答:""",
input_variables=["question"]
)
# 创建问答链
qa_chain = (
{"question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 使用 invoke 方法
print("使用 invoke 方法:")
response = qa_chain.invoke("什么是人工智能?")
print(response)
# 使用 stream 方法
print("\n使用 stream 方法:")
for chunk in qa_chain.stream("人工智能有哪些应用?"):
print(chunk, end="", flush=True)
print()
输出示例(取决于模型和硬件,实际输出可能略有不同):
使用 invoke 方法:
人工智能是计算机科学的一个分支,涉及开发智能机器。
使用 stream 方法:
人工智能的应用包括自动驾驶、语音识别和医疗诊断。
代码说明
- LLM 初始化:
OllamaLLM调用llama3,配置temperature=0.7、max_tokens=512、stop=["\n"]。
- 提示模板:
PromptTemplate格式化人工智能问题。
- 问答链:
- LCEL 链组合
prompt、llm和StrOutputParser。 - 使用
invoke(同步)和stream(流式)生成答案。
- LCEL 链组合
运行要求:
- Ollama 服务运行且
llama3模型已拉取:ollama serve ollama pull llama3 - 安装依赖:
pip install --upgrade langchain langchain-ollama - 硬件支持:
llama3:8b需 8GB+ RAM,GPU 可加速(Ollama 支持 NVIDIA GPU)。
注意事项
- Ollama 服务:
- 验证服务:
curl http://localhost:11434 - 确保模型已拉取:
ollama list - 远程服务:
llm = OllamaLLM(base_url="http://your-ollama-server:11434")
- 验证服务:
- 模型选择:
- llama3:8B 或 70B,适合问答。
- mistral:轻量,推理快。
- phi3:小型,资源占用低。
- 验证模型:
ollama run llama3
- 硬件要求:
- CPU:
llama3:8b需 8GB+ RAM,推理较慢。 - GPU:Ollama 支持 NVIDIA GPU,需 CUDA:
nvidia-smi - 配置 GPU:在 Ollama 配置文件(
~/.ollama/config)中启用 GPU。
- CPU:
- 性能优化:
- 推理速度:
- 启用 GPU(Ollama 自动检测 NVIDIA GPU)。
- 使用轻量模型(如
phi3)。 - 优化 Ollama 配置:
export OLLAMA_NUM_PARALLEL=4
- 输出:
- 降低
temperature(如 0.5)提高确定性。 - 设置
stop=["\n", "###"]控制终止。
- 降低
- 上下文:
- 增加
max_tokens(如 1024)支持长输出。
- 增加
- 推理速度:
- 错误调试:
- 服务不可用:
- 检查 Ollama 服务:
ollama serve - 验证
base_url:import requests requests.get("http://localhost:11434")
- 检查 Ollama 服务:
- 模型未找到:
- 拉取模型:
ollama pull llama3
- 拉取模型:
- 输出截断:
- 增加
max_tokens:llm = OllamaLLM(..., max_tokens=1024)
- 增加
- 服务不可用:
常见问题
Q1:如何选择合适的 Ollama 模型?
A:
- 通用:
llama3(8B,性能均衡)。 - 轻量:
phi3(资源占用低)。 - 高性能:
mistral(推理快)。 - 拉取模型:
ollama pull llama3
Q2:如何支持对话历史?
A:结合 RunnableWithMessageHistory:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
prompt = ChatPromptTemplate.from_messages([
MessagesPlaceholder(variable_name="chat_history"),
("human", "{question}")
])
chain = prompt | llm | StrOutputParser()
chain_with_history = RunnableWithMessageHistory(
chain,
lambda session_id: ChatMessageHistory(),
input_messages_key="question",
history_messages_key="chat_history"
)
Q3:可以结合 RAG 吗?
A:可以,使用 OllamaEmbeddings 生成嵌入,结合 OllamaLLM:
from langchain_ollama import OllamaEmbeddings
from langchain_milvus import Milvus
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Milvus(..., embedding_function=embeddings)
prompt = PromptTemplate(
template="上下文:{context}\n问题:{question}\n回答:",
input_variables=["context", "question"]
)
chain = (
{"context": vectorstore.as_retriever() | lambda docs: "\n".join(d.page_content for d in docs), "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
Q4:如何加速推理?
A:
- 启用 GPU(Ollama 自动检测 NVIDIA GPU)。
- 使用轻量模型(如
phi3)。 - 优化 Ollama 配置:
export OLLAMA_NUM_PARALLEL=4
总结
langchain_ollama.OllamaLLM 是一个便捷的 LLM 类,通过 Ollama 服务调用本地或远程模型(如 llama3)。核心功能包括:
- 方法:
invoke(同步)、stream(流式)、ainvoke/astream(异步)。 - 参数:
model(模型选择)、base_url(服务地址)、temperature(随机性)。 - 使用方式:连接 Ollama 服务,生成文本,结合提示模板(如
PromptTemplate)。
更多推荐

所有评论(0)