不想把数据发到 OpenAI 但想用大模型?Ollama 让你本地跑 Llama 3 / Qwen /
DeepSeek / Mistral 等开源模型,LangChain 提供统一封装做 RAG / agent。
整套零成本(GPU 电费除外),数据完全在本地。
1. 装 Ollama
curl -fsSL https://ollama.com/install.sh | sh
# macOS: brew install ollama
# Windows: 从 ollama.com 下安装包
ollama --version
Ollama 作为后台服务跑(端口 11434):
systemctl start ollama # Linux
brew services start ollama # macOS
2. 拉个模型
ollama pull qwen2.5:7b
# 或更小的:qwen2.5:3b (4 GB 显存就能跑)
# 或更大的:qwen2.5:14b、llama3.1:70b(需要 24+ GB / 80 GB)
ollama list
3. 命令行直接聊
ollama run qwen2.5:7b
>>> 用 Python 写一个二分查找
Ctrl-D 退出。
4. HTTP API(OpenAI 兼容)
Ollama 默认在 :11434 暴露 OpenAI 兼容 endpoint:
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen2.5:7b",
"messages": [{"role": "user", "content": "你好"}]
}'
任何 OpenAI 库直接换 base URL 就能用:
from openai import OpenAI
client = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')
resp = client.chat.completions.create(
model='qwen2.5:7b',
messages=[{'role': 'user', 'content': '你好'}],
)
print(resp.choices[0].message.content)
5. LangChain 集成
uv add langchain langchain-community langchain-ollama
from langchain_ollama import ChatOllama, OllamaEmbeddings
llm = ChatOllama(model='qwen2.5:7b', temperature=0.3)
emb = OllamaEmbeddings(model='nomic-embed-text') # 嵌入模型,需另拉
ollama pull nomic-embed-text 拉一个 274MB 的嵌入模型。
6. RAG:用本地 LLM + 本地知识库回答
from langchain_chroma import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain_community.document_loaders import TextLoader
# 1. 加载文档(这里举例一个 txt,实际可能是 md / pdf / html)
loader = TextLoader('knowledge.md', encoding='utf-8')
docs = loader.load()
# 2. 切块
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)
# 3. 向量化 + 入库
vectorstore = Chroma.from_documents(chunks, embedding=emb, persist_directory='./chroma_db')
# 4. 检索 + LLM 回答
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type='stuff',
retriever=vectorstore.as_retriever(search_kwargs={'k': 4}),
return_source_documents=True,
)
result = qa.invoke({'query': '本文如何解释 X 概念?'})
print(result['result'])
print('---sources---')
for d in result['source_documents']:
print(d.page_content[:80])
整个 pipeline 完全在本地。
7. 持久化向量库
# 写入后端
vectorstore.persist() # Chroma 自动 persist 到 directory
# 之后加载已有库
vectorstore = Chroma(persist_directory='./chroma_db', embedding_function=emb)
Chroma 是文件型向量数据库,适合 < 100 万 chunk 的小规模 RAG。
大规模用 Qdrant / Milvus / Weaviate。
8. Agent / tools
from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import tool
from langchain import hub
@tool
def get_weather(city: str) -> str:
"""获取指定城市的当前天气。"""
# 假装调 API
return f'{city} 今天晴,22°C'
@tool
def calculator(expr: str) -> str:
"""计算数学表达式,例如 '2 * (3 + 4)'。"""
try:
return str(eval(expr, {'__builtins__': {}}))
except Exception as e:
return f'error: {e}'
prompt = hub.pull('hwchase17/react')
agent = create_react_agent(llm, [get_weather, calculator], prompt)
executor = AgentExecutor(agent=agent, tools=[get_weather, calculator],
verbose=True, max_iterations=4)
executor.invoke({'input': '北京天气怎么样?顺便算一下 47 * 12'})
verbose=True 输出 agent 的思考过程(很好玩,但生产关掉)。
9. 流式输出
for chunk in llm.stream('用 100 字介绍 RAG'):
print(chunk.content, end='', flush=True)
或者在 FastAPI 里返回 SSE 流。
10. 性能 tip
- 量化:
ollama pull qwen2.5:7b-instruct-q4_K_M4-bit 量化,
4 GB 显存 / 内存就能跑。精度降几个点 - 多模型切换:
ollama list+ollama run,自动 load / unload - 并发:Ollama 默认串行处理,需要并发的话调
OLLAMA_NUM_PARALLEL=4 - GPU:自动检测 CUDA / Metal;CPU 也能跑但慢 5-10x
- 保持模型在内存:
ollama keep-alive控制;默认 5 分钟没请求会卸载
11. 模型选择
| 用途 | 推荐 | 显存 |
|---|---|---|
| 通用对话 / RAG | qwen2.5:7b / 14b | 8 / 16 GB |
| 编程 | qwen2.5-coder:7b / deepseek-coder:6.7b | 8 GB |
| 中文为主 | qwen2.5、yi、deepseek | - |
| 极轻量 | qwen2.5:3b、phi3:mini | 4 GB |
| 顶配 | llama3.1:70b、qwen2.5:72b | 48-80 GB |
| 嵌入 | nomic-embed-text、bge-m3 | < 2 GB |
12. 数据安全
- Ollama 默认监听
127.0.0.1:11434,不暴露公网 - LangChain 调用的所有 API 都走本地
- 向量库(Chroma)默认本地文件
- 整个 pipeline 不发任何数据到云端
完美的 enterprise / 隐私敏感场景。
踩过的坑
- 第一次拉大模型很慢(GB 级),可以预先
ollama pull而不是等首次调用
超时。 - 7B 模型在 CPU 上跑非常慢(每 token ~1 秒),交互式不可用;GPU / Apple
Silicon 必备。 - 上下文窗口默认很小(2048)。Ollama Modelfile 可以加大:
FROM qwen2.5:7b PARAMETER num_ctx 8192
ollama create my-qwen -f Modelfile。 - LangChain 升级特别快,API 经常变。在 pyproject.toml lock 版本,
不要随便升。
登录后参与评论。