Day19:让我的AI助手彻底离线!LangChain+Ollama本地模型实战 [特殊字符]
Day19让我的AI助手彻底离线LangChainOllama本地模型实战 前言为什么我的AI助手总在关键时刻“掉线”兄弟们有没有遇到过这种尴尬时刻你正兴致勃勃地给朋友演示你的AI助手结果它突然来一句“Sorry, I’m having trouble connecting to the API.” 然后你的朋友用看智障的眼神看着你……这就是在线模型的痛网络波动、服务器宕机、API限额、隐私泄露……各种问题防不胜防。尤其是当我们想把AI集成到一些敏感场景比如公司内部文档处理、个人知识库时数据上传到云端简直就是灾难。那有没有办法让AI助手彻底离线运行同时还能保持智能当然有今天我们就用 LangChain Ollama 这对王炸组合打造一个完全离线的AI Agent以后再也不怕网络抽风数据绝对安全而且还能省下大笔API费用懂的都懂。今日目标把LangChain里的“大脑”换成本地OllamaLangChain是目前最火的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; charsetutf-8 Date: Fri, 20 Mar 2026 07:27:00 GMT Ollama is running Forms : {} Headers : {[Content-Length, 17], [Content-Type, text/plain; charsetutf-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-communitylangchain-community包含了Ollama的集成模块。配置LangChain使用Ollama模型LangChain为Ollama提供了两种封装OllamaLLM用于纯文本生成CompletionChatOllama用于对话模型Chat支持消息列表因为我们要做Agent通常使用Chat模型更合适。我们来试试ChatOllamafromlangchain_community.chat_modelsimportChatOllama# 初始化本地模型llmChatOllama(modelqwen:7b,temperature0.7,# 其他参数top_p, num_predict等)就这么简单llm现在就是一个LangChain标准的聊天模型对象你可以像使用OpenAI的ChatOpenAI一样使用它。测试一下responsellm.invoke(你好你是谁)print(response.content)应该会输出模型的自我介绍。创建第一个本地Agent会计算加减乘除的AI助手Agent的核心是工具。我们先定义两个简单的工具一个计算器一个时间查询器模拟本地时间。定义工具LangChain中定义工具有多种方式最方便的是用 tool 装饰器fromlangchain.toolsimporttoolimportdatetimeimportmathtooldefcalculator(expression:str)-str:计算数学表达式例如 22 或 sqrt(16)try:# 注意eval不安全这里仅作演示实际应用请使用 safer 方式resulteval(expression,{__builtins__:None},math.__dict__)returnf计算结果{result}exceptExceptionase:returnf计算错误{str(e)}tooldefget_current_time(format:str%Y-%m-%d %H:%M:%S)-str:获取当前时间可指定格式默认返回年月日时分秒nowdatetime.datetime.now()returnnow.strftime(format)构建提示词模板Agent需要一个系统提示词来指导它如何使用工具。LangChain的create_react_agent需要传入一个提示词模板我们可以用ChatPromptTemplate构建fromlangchain.promptsimportChatPromptTemplate,MessagesPlaceholder promptChatPromptTemplate.from_messages([(system,你是一个有用的AI助手可以调用工具来回答问题。),MessagesPlaceholder(variable_namechat_history),(human,{input}),MessagesPlaceholder(variable_nameagent_scratchpad),])这里的chat_history用于记忆稍后会用agent_scratchpad用于存放中间思考步骤。创建AgentLangChain提供了两种创建Agent的方式旧版initialize_agent和新版create_react_agent。我们使用新版更灵活fromlangchain.agentsimportcreate_react_agent,AgentExecutor tools[calculator,get_current_time]# 创建Agentagentcreate_react_agent(llm,tools,prompt)# 创建执行器agent_executorAgentExecutor(agentagent,toolstools,verboseTrue,# 打印思考过程handle_parsing_errorsTrue,# 处理解析错误)测试运行resultagent_executor.invoke({input:现在几点了})print(result[output])如果一切顺利你会看到Agent的思考过程因为verboseTrue然后输出当前时间。再试试计算resultagent_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中直接传参llmChatOllama(modelqwen:7b-q4_0,temperature0.1,num_predict512,)使用流式输出流式输出可以提升用户体验让用户感觉更快。AgentExecutor本身支持流式只需在调用时设置streamTrueforchunkinagent_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_01.2秒正确免费在线 gpt-3.5-turbo2.8秒正确约0.002美元结论本地模型在速度上明显占优质量足够应付多数场景而且免费在线模型在复杂推理上可能更强但也要考虑网络延迟和费用。8. 完整代码示例以下是今天所有的代码整合成一个脚本local_agent.pyimportdatetimeimportmathfromlangchain.toolsimporttoolfromlangchain_community.chat_modelsimportChatOllamafromlangchain.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain.agentsimportcreate_react_agent,AgentExecutor# 1. 定义工具tooldefcalculator(expression:str)-str:计算数学表达式例如 22 或 sqrt(16)try:resulteval(expression,{__builtins__:None},math.__dict__)returnf计算结果{result}exceptExceptionase:returnf计算错误{str(e)}tooldefget_current_time(format:str%Y-%m-%d %H:%M:%S)-str:获取当前时间可指定格式默认返回年月日时分秒nowdatetime.datetime.now()returnnow.strftime(format)# 2. 初始化模型llmChatOllama(modelqwen:7b-q4_0,# 使用量化版本temperature0.1,num_predict512,)# 3. 创建提示词模板promptChatPromptTemplate.from_messages([(system,你是一个有用的AI助手可以调用工具来回答问题。),MessagesPlaceholder(variable_namechat_history),(human,{input}),MessagesPlaceholder(variable_nameagent_scratchpad),])# 4. 创建Agenttools[calculator,get_current_time]agentcreate_react_agent(llm,tools,prompt)agent_executorAgentExecutor(agentagent,toolstools,verboseTrue,handle_parsing_errorsTrue,)# 5. 测试if__name____main__:# 单轮测试resultagent_executor.invoke({input:现在几点了})print(回答,result[output])resultagent_executor.invoke({input:计算 123 * 456 等于多少})print(回答,result[output])今日总结今天我们完成了✅ LangChain对接本地Ollama模型✅ 创建了一个带工具的Agent✅ 测试了运行效果✅ 优化了响应速度常见问题解答Q运行时报错**ModuleNotFoundError: No module named langchain_community**A请确保安装了langchain-communitypip install langchain-communityQAgent调用工具时报错说工具不存在A检查工具函数的docstringAgent依赖docstring来理解工具用途。确保工具函数有清晰的描述。Q为什么我的Agent有时候不调用工具而是自己瞎编答案A可能是模型不够聪明或者提示词不够好。可以尝试降低temperature或者优化提示词明确告诉它“如果需要可以调用工具”。Q本地模型回答太啰嗦怎么办A在ChatOllama中设置num_predict限制最大token数或者在提示词中要求“简洁回答”。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2432192.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!