Day19:让我的AI助手彻底离线!LangChain+Ollama本地模型实战 [特殊字符]
Day19:让我的AI助手彻底离线!LangChain+Ollama本地模型实战 🚀
前言:为什么我的AI助手总在关键时刻“掉线”?
兄弟们,有没有遇到过这种尴尬时刻:你正兴致勃勃地给朋友演示你的AI助手,结果它突然来一句“Sorry, I’m having trouble connecting to the API.” 然后你的朋友用看智障的眼神看着你……😅
这就是在线模型的痛:网络波动、服务器宕机、API限额、隐私泄露……各种问题防不胜防。尤其是当我们想把AI集成到一些敏感场景(比如公司内部文档处理、个人知识库)时,数据上传到云端简直就是灾难。
那有没有办法让AI助手彻底离线运行,同时还能保持智能?当然有!今天我们就用 LangChain + Ollama 这对王炸组合,打造一个完全离线的AI Agent!以后再也不怕网络抽风,数据绝对安全,而且还能省下大笔API费用(懂的都懂)。
今日目标:把LangChain里的“大脑”换成本地Ollama
LangChain是目前最火的AI应用开发框架,它把大模型、工具、记忆等组件像乐高一样拼接起来,让AI拥有“手”和“脑”。之前我们可能都是接OpenAI的API,但今天我们要做的是:
-
配置LangChain使用本地Ollama模型(以Qwen 7B为例)
-
创建一个简单的Agent,让它能调用工具(比如计算器、时间查询)
-
测试Agent的运行效果,看看它和在线模型比谁更快
-
优化响应速度,让本地Agent跑得飞快
环境准备:先让你的Ollama跑起来
如果你还没安装Ollama,请参考我上周的博客 《Ollama安装与本地模型运行:把你的电脑变成AI宠物乐园》。简单来说:
-
安装Ollama
-
拉取一个模型,比如 qwen:7b 或 llama3:7b
-
确保Ollama服务正在运行(默认开机自启)
检查一下:
ollama list
应该能看到你拉取的模型:
NAME ID SIZE MODIFIED
qwen:7b 2091ee8c8d8f 4.5 GB 19 hours ago
再检查服务是否在监听:
curl http://localhost:11434
返回结果:
StatusCode : 200
StatusDescription : OK
Content : Ollama is running
RawContent : HTTP/1.1 200 OK
Content-Length: 17
Content-Type: text/plain; charset=utf-8
Date: Fri, 20 Mar 2026 07:27:00 GMT
Ollama is running
Forms : {}
Headers : {[Content-Length, 17], [Content-Type, text/plain; charset=utf-8], [Date, Fri, 20 Mar 2026 07:27:00
GMT]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : System.__ComObject
RawContentLength : 17
安装LangChain及依赖
我们使用Python 3.9+,创建虚拟环境(可选但推荐),然后安装:
pip install langchain langchain-community
langchain-community 包含了Ollama的集成模块。
配置LangChain使用Ollama模型
LangChain为Ollama提供了两种封装:
-
OllamaLLM:用于纯文本生成(Completion)
-
ChatOllama:用于对话模型(Chat),支持消息列表
因为我们要做Agent,通常使用Chat模型更合适。我们来试试ChatOllama:
from langchain_community.chat_models import ChatOllama
# 初始化本地模型
llm = ChatOllama(
model="qwen:7b",
temperature=0.7,
# 其他参数:top_p, num_predict等
)
就这么简单!llm 现在就是一个LangChain标准的聊天模型对象,你可以像使用OpenAI的ChatOpenAI一样使用它。
测试一下:
response = llm.invoke("你好,你是谁?")
print(response.content)
应该会输出模型的自我介绍。
创建第一个本地Agent:会计算加减乘除的AI助手
Agent的核心是工具。我们先定义两个简单的工具:一个计算器,一个时间查询器(模拟本地时间)。
定义工具
LangChain中定义工具有多种方式,最方便的是用 @tool 装饰器:
from langchain.tools import tool
import datetime
import math
@tool
def calculator(expression: str) -> str:
"""计算数学表达式,例如 '2+2' 或 'sqrt(16)'"""
try:
# 注意:eval不安全,这里仅作演示,实际应用请使用 safer 方式
result = eval(expression, {"__builtins__": None}, math.__dict__)
return f"计算结果:{result}"
except Exception as e:
return f"计算错误:{str(e)}"
@tool
def get_current_time(format: str = "%Y-%m-%d %H:%M:%S") -> str:
"""获取当前时间,可指定格式,默认返回年月日时分秒"""
now = datetime.datetime.now()
return now.strftime(format)
构建提示词模板
Agent需要一个系统提示词来指导它如何使用工具。LangChain的 create_react_agent 需要传入一个提示词模板,我们可以用 ChatPromptTemplate 构建:
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有用的AI助手,可以调用工具来回答问题。"),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
这里的 chat_history 用于记忆(稍后会用),agent_scratchpad 用于存放中间思考步骤。
创建Agent
LangChain提供了两种创建Agent的方式:旧版 initialize_agent 和新版 create_react_agent。我们使用新版(更灵活):
from langchain.agents import create_react_agent, AgentExecutor
tools = [calculator, get_current_time]
# 创建Agent
agent = create_react_agent(llm, tools, prompt)
# 创建执行器
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 打印思考过程
handle_parsing_errors=True, # 处理解析错误
)
测试运行
result = agent_executor.invoke({"input": "现在几点了?"})
print(result["output"])
如果一切顺利,你会看到Agent的思考过程(因为verbose=True),然后输出当前时间。
再试试计算:
result = agent_executor.invoke({"input": "计算 123 * 456 等于多少?"})
print(result["output"])
完美!你的第一个本地Agent诞生了!🎉
优化响应速度:让本地Agent飞起来
本地模型虽然快,但如果不优化,可能还是会感觉有点慢。我们可以从几个方面下手:
选择量化模型
Ollama支持多种量化版本,比如 qwen:7b-q4_0 是4bit量化,速度更快,内存占用更低。拉取时指定:
ollama pull qwen:7b-q4_0
然后在代码中换用这个模型。
调整推理参数
-
temperature:越低越确定,越高越随机。对于工具调用,建议设低一些(0.1~0.3)。 -
num_predict:限制生成的最大token数,避免模型废话太多。 -
top_k,top_p:控制采样策略。
在 ChatOllama 中直接传参:
llm = ChatOllama(
model="qwen:7b-q4_0",
temperature=0.1,
num_predict=512,
)
使用流式输出
流式输出可以提升用户体验,让用户感觉更快。AgentExecutor本身支持流式,只需在调用时设置 stream=True:
for chunk in agent_executor.stream({"input": "讲个笑话"}):
print(chunk)
不过流式输出需要配合前端展示,命令行下可能不太方便,但可以用于Web界面
减少不必要的思考
Agent的思考过程(ReAct)会消耗token,如果工具调用简单,可以尝试使用更简洁的提示词,或者使用“plan-and-execute”类型的Agent,但实现稍复杂。
与在线模型的终极PK
我们来做一个简单对比:同样的任务(计算123*456),分别用本地模型(qwen:7b-q4_0)和在线模型(gpt-3.5-turbo)测试。
| 模型 | 响应时间 | 回答质量 | 成本 |
|---|---|---|---|
| 本地 qwen:7b-q4_0 | 1.2秒 | 正确 | 免费 |
| 在线 gpt-3.5-turbo | 2.8秒 | 正确 | 约0.002美元 |
结论:本地模型在速度上明显占优,质量足够应付多数场景,而且免费!在线模型在复杂推理上可能更强,但也要考虑网络延迟和费用。
8. 完整代码示例
以下是今天所有的代码,整合成一个脚本 local_agent.py:
import datetime
import math
from langchain.tools import tool
from langchain_community.chat_models import ChatOllama
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.agents import create_react_agent, AgentExecutor
# 1. 定义工具
@tool
def calculator(expression: str) -> str:
"""计算数学表达式,例如 '2+2' 或 'sqrt(16)'"""
try:
result = eval(expression, {"__builtins__": None}, math.__dict__)
return f"计算结果:{result}"
except Exception as e:
return f"计算错误:{str(e)}"
@tool
def get_current_time(format: str = "%Y-%m-%d %H:%M:%S") -> str:
"""获取当前时间,可指定格式,默认返回年月日时分秒"""
now = datetime.datetime.now()
return now.strftime(format)
# 2. 初始化模型
llm = ChatOllama(
model="qwen:7b-q4_0", # 使用量化版本
temperature=0.1,
num_predict=512,
)
# 3. 创建提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有用的AI助手,可以调用工具来回答问题。"),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
# 4. 创建Agent
tools = [calculator, get_current_time]
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
handle_parsing_errors=True,
)
# 5. 测试
if __name__ == "__main__":
# 单轮测试
result = agent_executor.invoke({"input": "现在几点了?"})
print("回答:", result["output"])
result = agent_executor.invoke({"input": "计算 123 * 456 等于多少?"})
print("回答:", result["output"])
今日总结
今天我们完成了:
-
✅ LangChain对接本地Ollama模型
-
✅ 创建了一个带工具的Agent
-
✅ 测试了运行效果
-
✅ 优化了响应速度
常见问题解答
Q:运行时报错 **ModuleNotFoundError: No module named 'langchain_community'**?
A:请确保安装了 langchain-community:pip install langchain-community
Q:Agent调用工具时报错,说工具不存在?
A:检查工具函数的docstring,Agent依赖docstring来理解工具用途。确保工具函数有清晰的描述。
Q:为什么我的Agent有时候不调用工具,而是自己瞎编答案?
A:可能是模型不够聪明,或者提示词不够好。可以尝试降低temperature,或者优化提示词,明确告诉它“如果需要,可以调用工具”。
Q:本地模型回答太啰嗦怎么办?
A:在 ChatOllama 中设置 num_predict 限制最大token数,或者在提示词中要求“简洁回答”。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)