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(如 llama3mistral)生成文本。它适合本地化场景,无需云 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 构建一个简单问答系统,回答关于人工智能的问题。示例使用 invokestream 方法。

准备 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 方法:
人工智能的应用包括自动驾驶、语音识别和医疗诊断。
代码说明
  1. LLM 初始化
    • OllamaLLM 调用 llama3,配置 temperature=0.7max_tokens=512stop=["\n"]
  2. 提示模板
    • PromptTemplate 格式化人工智能问题。
  3. 问答链
    • LCEL 链组合 promptllmStrOutputParser
    • 使用 invoke(同步)和 stream(流式)生成答案。

运行要求

  • Ollama 服务运行且 llama3 模型已拉取:
    ollama serve
    ollama pull llama3
    
  • 安装依赖:
    pip install --upgrade langchain langchain-ollama
    
  • 硬件支持:llama3:8b 需 8GB+ RAM,GPU 可加速(Ollama 支持 NVIDIA GPU)。

注意事项

  1. Ollama 服务
    • 验证服务:
      curl http://localhost:11434
      
    • 确保模型已拉取:
      ollama list
      
    • 远程服务:
      llm = OllamaLLM(base_url="http://your-ollama-server:11434")
      
  2. 模型选择
    • llama3:8B 或 70B,适合问答。
    • mistral:轻量,推理快。
    • phi3:小型,资源占用低。
    • 验证模型:
      ollama run llama3
      
  3. 硬件要求
    • CPUllama3:8b 需 8GB+ RAM,推理较慢。
    • GPU:Ollama 支持 NVIDIA GPU,需 CUDA:
      nvidia-smi
      
    • 配置 GPU:在 Ollama 配置文件(~/.ollama/config)中启用 GPU。
  4. 性能优化
    • 推理速度
      • 启用 GPU(Ollama 自动检测 NVIDIA GPU)。
      • 使用轻量模型(如 phi3)。
      • 优化 Ollama 配置:
        export OLLAMA_NUM_PARALLEL=4
        
    • 输出
      • 降低 temperature(如 0.5)提高确定性。
      • 设置 stop=["\n", "###"] 控制终止。
    • 上下文
      • 增加 max_tokens(如 1024)支持长输出。
  5. 错误调试
    • 服务不可用
      • 检查 Ollama 服务:
        ollama serve
        
      • 验证 base_url
        import requests
        requests.get("http://localhost:11434")
        
    • 模型未找到
      • 拉取模型:
        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)。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐