Ollama加LangChain本地大模型调用:参数调优与报错排查

文章配图

一个包名先分清

对接 Ollama 的正确依赖是 langchain-ollama,装法:uv add langchain-ollama。网上大量老教程写的是 pip install langchain-community 然后导入 from langchain_community.llms import Ollama——那条路在 LangChain 0.2 之后已标记废弃,只做兼容保留,新项目别再起这个头。版本对不上,后面所有报错都会变得莫名其妙。项目级依赖用 uv add,别用全局 pip,多项目共存时版本打架的债迟早要还。

五行跑通

from langchain_ollama import ChatOllama

llm = ChatOllama(model="deepseek-r1:7b", temperature=0.3)

print(llm.invoke("用一句话解释流式输出").content)

for chunk in llm.stream("翻译:Hello, Local LLM!"):
    print(chunk.content, end="", flush=True)

invoke 同步拿全量结果,stream 逐 chunk 吐——前端要打字机效果就用后者。

最高频的一个报错

第一跑大概率撞上这个:

ConnectionError: HTTPConnectionPool(host='localhost', port=11434): Max retries exceeded

根因不在代码,在服务:Ollama 的本地服务没起,或者模型没拉。按顺序验:

curl http://localhost:11434/api/tags     # 服务活着会返回已装模型列表
ollama list                               # 确认 deepseek-r1:7b 真的存在
ollama serve                              # 没起就手动拉起(装了桌面版一般开机自启)

api/tags 返回 JSON 才算服务正常;列表里没有目标模型就 ollama pull deepseek-r1:7b 先拉。三步做完再跑 Python,九成的连接报错到此终结。

temperature 之外,更值钱的两个参数

num_ctx:上下文窗口,默认只有 2048。 这是最隐蔽的坑——多轮对话聊着聊着模型开始"失忆",不是模型不行,是早期消息被静默截断了。本地内存够就开大:

llm = ChatOllama(model="deepseek-r1:7b", temperature=0.3, num_ctx=8192)

keep_alive:模型驻留时间,默认 5 分钟。 超时后模型从显存卸载,下次调用要重新加载,7B 模型冷启动好几秒——这就是"为什么有时第一问特别慢"。常驻服务场景设 keep_alive=-1(永不卸载),内存紧张就保持默认。

temperature 本身没什么神秘:趋近 0 输出稳定,适合代码生成和结构化抽取;趋近 1 发散,适合文案。日常技术问答 0.2~0.4 起步即可。

多轮对话的正确姿势

传角色消息数组,框架自动拼上下文:

messages = [
    ("system", "你是一名 Python 技术助手,回答简洁。"),
    ("human", "怎么调用本地 Ollama 模型?"),
    ("ai", "用 ChatOllama 组件即可。"),
    ("human", "多轮对话怎么做?"),
]
print(llm.invoke(messages).content)

注意和 num_ctx 联动:历史越长越要留窗口余量,不然系统提示词先被截掉。

模型怎么选

7B 量级(DeepSeek R1 7B)是本地开发的主力:加载快、响应快,翻译、问答、简单代码生成都够用。百亿级模型推理能力强,但加载慢、延迟高,普通显卡跑起来卡顿明显,日常调试不值得。结论简单:先用 7B 把流程跑顺,真遇到 7B 明显办不了的任务再换大模型,别一上来就堆参数。

验收标准

一条链路验完算通关:uv add langchain-ollama 装好 → curl api/tags 服务通 → invoke 返回正常 → stream 打字机正常 → 多轮对话记住上文 → 把 num_ctx 从默认值调大后长对话不再丢上下文。五分钟能跑完,跑完这套,本地调用这条线基本不会再回头踩坑。

0

评论0

请先
显示验证码
没有账号?注册  忘记密码?