Bootstrap

本地运行开源大语言模型:ChatOllama 实战指南

## 技术背景介绍
近年来,AI大语言模型(LLMs)的应用变得日益广泛,但高性能模型的运行通常需要依赖云端。Ollama是一个工具,可以帮助开发者在本地运行诸如Llama 2等开源大语言模型。它不仅可以减少对云服务的依赖,还有助于在本地实现更好的数据隐私控制。

Ollama通过一个称为Modelfile的统一包式架构,将模型权重、配置和数据打包。同时,它优化了与GPU相关的设置。这篇文章将通过实例代码,展示如何使用Ollama与LangChain集成来运行聊天模型,并介绍如何利用其多模态能力。

---

## 核心原理解析
Ollama的设计理念是在本地环境中通过轻量级架构运行大模型,尽量减少依赖复杂的设置:
1. **模型管理**:支持从Ollama模型库拉取多种模型。
2. **便捷运行**:提供命令行工具和API实现与模型交互。
3. **多模态支持**:支持文本、图片、音频等多模态输入(例如使用`bakllava`模型)。

通过与LangChain集成,我们可以高效地实现模型调用和自定义提示生成。

---

## 代码实现演示

### 1. 安装和设置
首先,请确保您的环境已安装Ollama,运行以下命令拉取所需模型:
```bash
# 安装 Ollama 服务端
sudo apt install ollama  # Linux / WSL 环境下
# 拉取模型
ollama pull bakllava  # 下载多模态支持模型

拉取完成后,检查模型列表:

ollama list

安装LangChain与Ollama集成库:

%pip install -qU langchain-ollama

2. 基本模型调用

以下示例展示使用LangChain-Ollama接口进行基本聊天任务。

import base64
from io import BytesIO
from PIL import Image
from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage
from langchain_core.output_parsers import StrOutputParser

# 转换图片为Base64格式
def convert_to_base64(pil_image):
    buffered = BytesIO()
    pil_image.save(buffered, format="JPEG")
    img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
    return img_str

# 示例图片路径
file_path = "example.jpg"
pil_image = Image.open(file_path)
image_b64 = convert_to_base64(pil_image)

# 初始化模型
llm = ChatOllama(model="bakllava", temperature=0)

# 定义多模态提示生成函数
def prompt_func(data):
    text = data["text"]
    image = data["image"]

    image_part = {
        "type": "image_url",
        "image_url": f"data:image/jpeg;base64,{image}",
    }

    content_parts = []

    text_part = {"type": "text", "text": text}

    content_parts.append(image_part)
    content_parts.append(text_part)

    return [HumanMessage(content=content_parts)]

chain = prompt_func | llm | StrOutputParser()

# 输入问题和图片
response = chain.invoke(
    {"text": "What is the Dollar-based gross retention rate?", "image": image_b64}
)
print(response)
输出:
This metric assesses how well a company retains its customers and revenue over a period of time...

应用场景分析

  1. 私有领域聊天模型:可以定制Llama模型以更好地支持企业内部知识问答。
  2. 多模态任务:通过bakllava结合文本输入与图片信息回答问题(如财务表格分析、图片描述)。
  3. 本地数据隐私:在医疗、法律等场景中可避免数据上传到云端。

实践建议

  1. 硬件优化:尽量使用支持CUDA的GPU来加速推理。
  2. 使用小模型:在资源有限的情况下,选择具有较少参数的模型,比如llama2:7b
  3. 批量任务处理:如需处理多个问题,建议搭建异步任务队列以提升效率。

如果在实践中遇到问题,欢迎在评论区交流。

---END---
;