5月28日 07:03

如何在 Python、JavaScript 等编程语言中集成 Ollama?

Python 集成 Ollama

Python 是 Ollama 生态中最成熟的集成语言,官方提供了 ollama 库,同时也兼容 LangChain、LlamaIndex 等主流框架。

安装与基础调用

bash
pip install ollama

最简单的文本生成方式:

python
import ollama response = ollama.generate(model='llama3.1', prompt='用一句话解释什么是递归') print(response['response'])

generate 方法适用于单轮补全场景,直接传入 prompt 即可。

多轮对话

对话场景使用 chat 方法,通过 messages 数组维护上下文:

python
import ollama messages = [ {'role': 'user', 'content': 'Python 的 GIL 是什么?'}, {'role': 'assistant', 'content': 'GIL 是全局解释器锁,它确保同一时刻只有一个线程执行 Python 字节码。'}, {'role': 'user', 'content': '那多线程还有意义吗?'} ] response = ollama.chat(model='llama3.1', messages=messages) print(response['message']['content'])

每轮对话都需要把完整的消息历史传入,模型本身不保存状态。

流式响应

对于长文本生成,流式输出可以显著改善用户体验:

python
import ollama stream = ollama.chat( model='llama3.1', messages=[{'role': 'user', 'content': '写一篇关于量子计算的科普文章'}], stream=True ) for chunk in stream: print(chunk['message']['content'], end='', flush=True)

流式模式下,chat 返回的是一个生成器,每次 yield 一个 token 片段。

结构化输出

当你需要模型返回 JSON 格式的数据时,可以用 format 参数约束输出:

python
import ollama response = ollama.chat( model='llama3.1', messages=[{'role': 'user', 'content': '列出三个编程语言及其主要用途'}], format='json' ) import json data = json.loads(response['message']['content']) print(data)

这在构建 API 服务或数据抽取管线时特别有用。

LangChain 集成

如果项目已经使用 LangChain,Ollama 可以直接作为 LLM 后端:

python
from langchain_community.llms import Ollama from langchain.prompts import ChatPromptTemplate from langchain.schema import StrOutputParser llm = Ollama(model="llama3.1") # 链式调用 prompt = ChatPromptTemplate.from_template("用{style}风格解释{concept}") chain = prompt | llm | StrOutputParser() result = chain.invoke({"style": "通俗易懂", "concept": "分布式系统"}) print(result)

LangChain 的 Agent、RAG 等高级能力都可以基于 Ollama 后端运行,无需 OpenAI API Key。

JavaScript / Node.js 集成 Ollama

前端和 Node.js 项目通过 ollama npm 包接入,API 风格与 Python 库保持一致。

安装与基础调用

bash
npm install ollama
javascript
import ollama from 'ollama' // 文本生成 const response = await ollama.generate({ model: 'llama3.1', prompt: '用一句话解释什么是闭包' }) console.log(response.response) // 多轮对话 const chat = await ollama.chat({ model: 'llama3.1', messages: [ { role: 'user', content: 'Node.js 适合做什么?' }, { role: 'assistant', content: 'Node.js 适合 I/O 密集型应用,比如 Web 服务、实时通信。' }, { role: 'user', content: '那 CPU 密集型任务呢?' } ] }) console.log(chat.message.content)

流式响应

javascript
import ollama from 'ollama' const stream = await ollama.chat({ model: 'llama3.1', messages: [{ role: 'user', content: '详细解释 JavaScript 的事件循环' }], stream: true }) for await (const chunk of stream) { process.stdout.write(chunk.message.content) }

浏览器端调用

Ollama 默认只监听 localhost,浏览器页面跨域调用需要配置 OLLAMA_ORIGINS 环境变量:

bash
OLLAMA_ORIGINS="http://localhost:3000" ollama serve

配置后即可在前端代码中直接调用:

javascript
const response = await fetch('http://localhost:11434/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'llama3.1', messages: [{ role: 'user', content: 'Hello' }] }) })

Go 集成 Ollama

Go 生态目前没有官方封装库,直接调用 REST API 即可,Ollama 的 API 设计简洁,手动调用并不复杂。

HTTP 调用示例

go
package main import ( "bytes" "encoding/json" "fmt" "io" "net/http" ) func main() { payload := map[string]interface{}{ "model": "llama3.1", "prompt": "Go 语言的协程和线程有什么区别?", "stream": false, } body, _ := json.Marshal(payload) resp, err := http.Post( "http://localhost:11434/api/generate", "application/json", bytes.NewBuffer(body), ) if err != nil { fmt.Println("请求失败:", err) return } defer resp.Body.Close() data, _ := io.ReadAll(resp.Body) fmt.Println(string(data)) }

流式响应处理

Go 处理流式响应需要逐行读取 NDJSON:

go
resp, _ := http.Post( "http://localhost:11434/api/generate", "application/json", bytes.NewBuffer(streamPayload), ) defer resp.Body.Close() decoder := json.NewDecoder(resp.Body) for { var chunk map[string]interface{} if err := decoder.Decode(&chunk); err != nil { break } if content, ok := chunk["response"].(string); ok { fmt.Print(content) } }

REST API 通用集成

任何支持 HTTP 请求的语言都能直接调用 Ollama REST API,核心端点只有两个:

文本生成 /api/generate

bash
curl http://localhost:11434/api/generate -d '{ "model": "llama3.1", "prompt": "解释什么是微服务架构", "stream": false }'

对话 /api/chat

bash
curl http://localhost:11434/api/chat -d '{ "model": "llama3.1", "messages": [ {"role": "user", "content": "Redis 和 Memcached 怎么选?"} ], "stream": false }'

OpenAI 兼容接口

Ollama 还提供了 OpenAI 兼容的 API 端点 /v1/chat/completions,已有 OpenAI SDK 的项目只需修改 base_url 即可切换:

python
from openai import OpenAI client = OpenAI( base_url="http://localhost:11434/v1", api_key="ollama" # 任意值,本地不校验 ) response = client.chat.completions.create( model="llama3.1", messages=[{"role": "user", "content": "用 Python 写一个快速排序"}] ) print(response.choices[0].message.content)

这个兼容层意味着所有使用 OpenAI SDK 的项目(包括 LangChain 的 OpenAI 集成)几乎零改动就能迁移到本地模型。

生产环境注意事项

  • 网络暴露:默认仅监听 localhost,对外服务需设置 OLLAMA_HOST=0.0.0.0:11434,同时做好鉴权
  • 模型管理:通过 ollama pull 预下载模型,避免首次请求时冷启动耗时过长
  • 并发处理:Ollama 会按请求顺序处理,高并发场景建议配合消息队列
  • GPU 资源:显存不足时模型会自动卸载到内存,响应延迟会显著上升,可通过 OLLAMA_KEEP_ALIVE 调整模型驻留时间
标签:Ollama