LangChain + Ollama 跑本地 LLM(隐私 + 零成本 + 可写入向量库)

不想把数据发到 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_M 4-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 版本,
    不要随便升。
精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。