每当工程师开发基于人工智能的应用程序时,如何处理敏感数据始终是首要考虑的问题。你肯定不希望将用户的数据发送到自己无法控制的第三方API中。

就我而言,在开发FinanceGPT这个个人开源项目时,我就遇到了这个问题。这个应用程序可以帮助我管理财务事务——用户可以上传银行对账单、1099表格等文件,然后用简单的英语提出问题,比如“我这个月在食品杂货上花了多少钱?”或“我去年的实际税率是多少?”

问题是,要回答这些问题,就必须将所有的敏感交易记录、W-2表格以及收入数据发送给OpenAI、Anthropic或Google,而这是我无法接受的。即使从这些文件中删除了个人身份信息,我还是觉得这种做法存在很大的风险。

这时Ollama应运而生。Ollama允许你在自己的笔记本电脑上独立运行大型语言模型。你不需要任何API密钥或云基础设施,而且数据也不会离开你的设备。

在这个教程中,我会向你详细介绍Ollama是什么、如何开始使用它,以及如何在实际的Python应用程序中运用它,这样应用程序的用户就可以选择将他们的数据完全保留在本地。

目录

先决条件

你至少需要满足以下要求:

  • Python 3.10或更高版本

  • 一台内存至少为8GB的电脑(对于运行大型模型,建议使用16GB内存)

  • 对Python和pip有基本的了解

什么是Ollama?

Ollama是一款开源工具,它使得在本地运行大型语言模型变得非常简单。你可以把它看作是专门为AI模型设计的Docker。只需一条命令,你就可以下载模型文件,而Ollama会负责处理后续的所有工作,包括内存管理以及通过本地REST API提供模型服务。

这个本地REST API与OpenAI的API格式兼容,这意味着任何能够与OpenAI交互的应用程序都可以直接切换到使用Ollama,而无需修改任何代码。

安装

首先,你需要从ollama.com下载安装程序。安装完成后,你可以验证它是否已经正常运行:

ollama --version

上述命令会检查Ollama是否已正确安装,并显示当前版本信息。

拉取并使用你的第一个模型进行聊天

Ollama在ollama.com/library上提供了多种模型。如果你想立即使用其中一个模型进行聊天,只需执行以下命令:

ollama run llama3.2

这条命令会从Ollama服务器下载相应的模型,并启动与模型的交互式聊天会话。注意:根据所选择的模型不同,其文件大小可能会有几GB。另外,如果你只想下载某个特定的模型,也可以使用:

ollama pull mistral

这条命令会将指定模型下载到你的机器上,而不会启动聊天会话,因此当你需要提前准备模型时,这个选项非常有用。

你可以运行以下命令来查看已安装的模型列表:

ollama list

这条命令会显示你本地下载的所有模型及其大小信息。

我使用过以下这些模型,它们在完成特定任务时表现非常出色:

模型名称 文件大小 适用场景
llama3.2 约2GB 速度快,通用性高
mistral 约4GB 指令执行能力较强
qwen2.5:7b 约4GB 多语言处理,具备推理能力
deepseek-r1:7b 约4GB 适用于复杂推理任务

Ollama的API工作原理

一旦Ollama开始运行,它就会在localhost:11434这个地址上提供服务。你可以使用curl直接调用它的API:

curl http://localhost:11434/api/chat -d '{
  "model": "llama3.2",
  "messages": [{ "role": "user", "content": "什么是复利?" }],
  "stream": false
}'

这条命令会通过命令行向Ollama的REST API发送聊天请求,由于禁用了实时流式传输功能,因此你会一次性收到完整的响应结果。上述端点主要用于与模型进行简单对话;而更实用的端点是http://localhost:11434/v1,因为这个端点兼容OpenAI的标准接口,这使得它能够轻松地集成到那些使用OpenAI或其他大语言模型的应用程序中。

如何从Python中调用Ollama

如何使用Ollama的Python库

Ollama提供了自己的Python库,使用起来非常方便:

pip install ollama
from ollama import chat

response = chat(
    model='llama3.2',
    messages=[
        {'role': 'user', 'content': '用简单的语言解释一下Roth IRA是什么。'}
    ]
)

print(response.message.content)

上述代码使用了 Ollama 的原生 Python SDK 来发送消息并打印模型的回复,这是从 Python 调用 Ollama 最直接的方法。

如何使用以 Ollama 作为后端的 OpenAI SDK

如前所述,Ollama 提供了一个与 OpenAI 兼容的接口端点,因此你也可以使用 OpenAI 的 Python SDK,并将其配置为指向你的本地服务器:

pip install openai
from openai import OpenAI

client = OpenAI(
    base_url='http://localhost:11434/v1',
    api_key='ollama',  # SDK 需要这个参数,但 Ollama 会忽略它
)

response = client.chat.completions.create(
    model='llama3.2',
    messages=[
        {'role': 'user', 'content': '用简单的语言解释一下什么是 Roth IRA。'}
    ]
)

print(response.choices[0].message.content)

这种方法使用了标准的 OpenAI Python SDK,但将其请求路径重定向到了你的本地 Ollama 服务器。`api_key` 这个参数是 SDK 所需要的,但 Ollama 会忽略它。这样的设计使得现有的应用程序能够无缝地使用 Ollama。这段代码与用于调用 OpenAI 的代码几乎完全相同。

如何将 Ollama 集成到 LangChain 应用程序中

大多数生产环境中的应用程序都是使用像 LangChain 这样的编排框架构建的,而这些框架都内置了对 Ollama 的支持。这意味着更换所使用的模型提供商只需要修改一行代码而已。

安装相应的集成模块:

pip install langchain-ollama

如何创建聊天模型

from langchain_ollama import ChatOllama

llm = ChatOllama(model="llama3.2")

response = llm.invoke("W-2 和 1099 有什么区别?")
print(response.content)

这段代码创建了一个与 LangChain 兼容的聊天模型,该模型实际上是基于本地的 Ollama 模型运行的。与使用 `ChatOpenAI` 创建模型的方式相比,只需要修改一行代码即可。

将这个例子与使用 OpenAI 构建的聊天模型进行比较,你会发现它们的接口几乎完全相同:

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o")

如何构建一个不依赖于特定 LLM 提供商的应用程序

应用程序的真正强大之处在于它能够抽象出对不同 LLM 提供商的支持。像 Perplexity 这样的工具允许用户根据自己的需求选择使用哪种 LLM。下面是一个简单的工厂模式示例,它可以根据配置自动选择合适的 LLM 并返回给应用程序:

from langchain_openai import ChatOpenAI
from langchain_ollama import ChatOllama
from langchain_anthropic import ChatAnthropic

def get_llm/provider: str, model: str):
    """
    根据提供的提供商名称,返回相应的 LangChain 聊天模型。

    参数:
        provider: 可以是 "openai", "ollama" 或 "anthropic"
        model: 模型的名称,例如 "gpt-4o", "llama3.2" 等

    返回值:
    一个可以直接使用的 LangChain 聊天模型对象
    """

    if provider == "openai":
        return ChatOpenAI(model=model)
    elif provider == "ollama":
        return ChatOllama(model=model)
    elif provider == "anthropic":
        return ChatAnthropic(model=model)
    else:
        raise ValueError(f"未知的提供商:{provider}")

上述代码片段展示了一个辅助函数,该函数会根据提供的提供商字符串来选择合适的LangChain模型,因此你的应用程序的其他部分根本不需要知道底层实际运行的是哪个大语言模型。
现在,你的其他代码完全无需了解底层使用的是哪家公司提供的大语言模型。无论是你的链式处理系统、代理程序还是工具,都只需使用llm这个接口即可正常工作。

如何将Ollama与LangGraph结合使用

如果你正在使用LangGraph来构建代理程序(正如我在之前关于AI代理程序的文章中介绍的那样),那么将Ollama集成进去也会非常顺利:

from langgraph.prebuilt import create_react_agent
from langchain_ollama import ChatOllama
from langchain_core.tools import tool

@tool
def get_spending_summary(category: str) -> str:
    """获取本月某个类别的总支出金额。"""
    # 在实际应用中,这部分代码会查询数据库
    return f“你本月在{category}上花费了342.50美元。”

llm = ChatOllama(model="llama3.2")

agent = create_react_agent(
    model=llm,
    tools=[get_spending_summary]
)

response = agent.invoke({
    "messages": [{"role": "user", "content": "我在食品杂货上花了多少钱?"}]
})

print(response["messages"][-1].content)

这段代码创建了一个ReAct代理程序,该程序会使用本地运行的模型来决定何时调用相应的工具函数,并且在整个代理工作流程中,所有数据都保留在本地设备上。
当需要时,这个代理程序会调用get_spending_summary工具函数,并利用本地运行的模型获取结果,而不会将任何数据发送到互联网上的OpenAI服务器。

FinanceGPT在实际应用中是如何使用这一技术的

FinanceGPT被设计为能够支持OpenAI、Anthropic、Google以及Ollama这些大语言模型提供商。用户可以在用户界面或配置文件中指定自己的偏好,而应用程序会使用与上述“工厂模式”非常相似的机制来实例化相应的模型。
当用户选择使用Ollama时,具体流程如下:

  1. 用户的银行对账单和其他敏感文档会在本地被解析处理。

  2. 在调用任何大语言模型之前,像社会安全号码这样的敏感信息会被屏蔽掉。

  3. 经过屏蔽处理后的数据以及查询请求会发送到用户自己机器上运行的Ollama服务器中。

  4. 响应结果也会在本地返回,没有任何数据会离开用户的网络环境。

如果想要在本地环境中使用Ollama来运行FinanceGPT,设置步骤如下:

# 1. 下载合适的模型
ollama pull llama3.2

# 2. 克隆并配置FinanceGPT项目
git clone https://github.com/manojag115/FinanceGPT.git
cd FinanceGPT
cp .env.example .env

# 3> 在.env文件中,将大语言模型提供商设置为Ollama
# LLM_PROVIDER=ollama
# LLM_MODEL=llama3.2

# 4> 启动整个应用程序栈
docker compose -f docker-compose.quickstart.yml up -d

通过这样的设置,包括前端、后端以及大语言模型在内的整个应用程序都会在用户的本地硬件上运行。

需要注意的权衡因素

Ollama是替代云端大语言模型的优秀本地解决方案,但它也存在一些自身的问题。

响应质量

Ollama模型本质上是运行在本地、参数量为70亿的模型,因此从设计上来说,在复杂的推理任务中,它们的表现无法与GPT-4o相媲美。对于简单的问答和总结任务,其结果倒是相当接近的;但在进行多步骤推理或需要做出细致判断的任务时,两者之间的差距就会变得明显。

速度

模型的推理速度取决于运行它的硬件设备。如果没有GPU,Ollama模型可能需要几秒钟才能给出响应。而在苹果自家的M1/M2/M3芯片上,即使没有专用GPU,其性能也依然相当不错。

硬件要求

参数量较小的模型(70亿个参数)大约需要8GB的RAM,而参数量较大的模型(超过130亿个参数)则需要16GB或更多的内存。如果你要为最终用户开发应用程序,就无法保证他们具备这样的硬件配置。

工具使用与函数调用

并非所有的本地模型都能可靠地支持函数调用功能。如果你的应用大量依赖这些功能,那么就需要仔细测试所选择的模型。像qwen2.5mistral这样的模型,在处理这类问题时表现得相对更好。

正确的使用方式是:在需要最强性能的时候使用云端模型;而当隐私或成本方面的限制使得使用云端模型不可行时,就选择本地模型。

总结

通过本教程,你了解了Ollama是什么、如何安装它以及如何获取模型,并学习了三种通过Python调用它的方法:原生的Ollama库、兼容OpenAI的SDK,以及LangChain。你还学会了如何构建一种与具体提供者无关的通用框架,这样你的应用程序就可以仅通过修改配置文件就能在云端模型和本地模型之间进行切换。

Ollama确实让本地大语言模型在实际生产环境中得到了广泛应用。由于它提供了兼容OpenAI的API,因此集成过程几乎没有任何障碍;而LangChain对它的原生支持也意味着你可以从一开始就构建与特定提供者无关的应用程序。

金融领域显然是适合使用Ollama的领域——但只要涉及到敏感数据,这一原则同样适用:医疗保健、法律科技、人力资源管理、个人生产力工具等等。如果你的应用程序处理的数据用户不希望存储在别人的服务器上,那么为他们提供本地使用选项就不仅仅是一种便利功能,更是一种体现信任的措施。

推荐了解一下FinanceGPT

这里所有的代码示例都来自FinanceGPT项目。如果你想看到这些功能在完整的应用程序中的实现,可以去这个仓库看看。那里有文档处理、投资组合管理、税务优化等功能,所有这些都是使用LangGraph构建的。

如果你觉得这些内容有帮助,请在GitHub上给该项目点个星——这样就能帮助其他开发者发现它。

资源链接

Comments are closed.