news 2026/3/26 5:31:14

基于LangChain与Ollama的Qwen2.5智能助手:打造支持网络搜索与假期查询 Agent

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于LangChain与Ollama的Qwen2.5智能助手:打造支持网络搜索与假期查询 Agent

前言

在AI技术飞速发展的今天,构建一个功能强大且易于部署的本地AI助手是许多开发者的梦想。本文将详细介绍如何使用LangChain、Ollama和Qwen2.5模型构建一个功能丰富的本地AI Agent,该Agent不仅支持网络搜索和数学计算,还能查询节假日信息,真正实现一个全方位的智能助手。

项目概述

本项目是一个基于LangChain框架和Ollama平台的Qwen2.5智能助手,能够实现:

  • 网络搜索功能
  • 数学计算能力
  • 节假日查询功能
  • 本地部署,无需云端依赖

项目结构如下:

langchain_qwen_agent/ ├── agent.py # Agent核心创建模块 ├── run.py # 主运行模块 ├── tools.py # 工具函数模块 ├── requirements.txt # 项目依赖

项目依赖

首先,让我们看看项目的依赖文件requirements.txt

langchain==1.2.0 langchain-classic==1.0.1 langchain-community==0.4.1 langchain-core==1.2.6 langchain-ollama==1.0.1 langchain-text-splitters==1.1.0 requests

这些依赖库是构建AI Agent的核心组件,其中LangChain用于构建Agent框架,Ollama用于本地模型部署,requests用于HTTP请求。

Agent核心实现

Agent的核心逻辑实现在agent.py文件中:

# agent.pyfromlangchain_ollamaimportChatOllamafromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_classic.agentsimportcreate_tool_calling_agent,AgentExecutorfromtoolsimporttools# 绝对导入defcreate_qwen_agent():llm=ChatOllama(model="qwen2.5:7b",base_url="http://localhost:11434",temperature=0.7,)# 使用 ChatPromptTemplate + MessagesPlaceholder 的标准方式(推荐且稳定)prompt=ChatPromptTemplate.from_messages([("system","你是一个聪明强大的助手,能够使用工具来帮助解决问题。请严格按照思考格式行动。"),("placeholder","{chat_history}"),# 可选:如果以后要加记忆("human","{input}"),MessagesPlaceholder("agent_scratchpad"),])# 创建 tool-calling agentagent=create_tool_calling_agent(llm=llm,tools=tools,prompt=prompt)# 创建执行器agent_executor=AgentExecutor(agent=agent,tools=tools,verbose=True,handle_parsing_errors=True,max_iterations=15,max_execution_time=90,)returnagent_executor

这个文件定义了AI Agent的核心创建函数,通过LangChain的工具调用功能,使模型能够使用外部工具来增强其能力。

工具模块详解

tools.py文件是整个项目的关键,它定义了AI Agent可以使用的各种工具:

# tools.pyfromlangchain_core.toolsimporttoolfromlangchain_community.toolsimportDuckDuckGoSearchRunimportrequestsfromdatetimeimportdatetime# 原有工具search_tool=DuckDuckGoSearchRun()@tooldefcalculator(expression:str)->str:"""计算数学表达式"""try:result=eval(expression,{"__builtins__":{}})returnf"结果是{result}"exceptExceptionase:returnf"计算错误:{str(e)}"# ── 下面是更原子化的节假日工具(推荐使用这个版本) ──@tooldefget_today_holiday()->str:"""获取今天的法定节假日信息"""base_url="http://127.0.0.1:5007/api/holiday"try:resp=requests.get(f"{base_url}/today",timeout=8)ifresp.status_code==200:data=resp.json()desc=data["description"]name=data.get("name","")returnf"今天是:{name+','ifnameelse''}{desc}"else:return"无法获取今日节假日信息"exceptExceptionase:returnf"查询出错:{str(e)}"@tooldefget_date_holiday(date_str:str)->str:"""查询指定日期(格式:YYYY-MM-DD)的法定节假日信息"""base_url="http://127.0.0.1:5007/api/holiday"try:resp=requests.get(f"{base_url}/{date_str}",timeout=8)ifresp.status_code==200:data=resp.json()desc=data["description"]name=data.get("name","")returnf"{date_str}是:{name+','ifnameelse''}{desc}"else:returnf"无效日期或无法查询:{date_str}"exceptExceptionase:returnf"查询出错:{str(e)}"@tooldefget_month_holidays(year:int,month:int)->str:"""查询指定年月的节假日完整日历(返回当月所有放假/调休日期)"""base_url="http://127.0.0.1:5007/api/holiday"try:resp=requests.get(f"{base_url}/month/{year}/{month}",timeout=10)ifresp.status_code==200:data=resp.json()holidays=[f"{d['date']}{d['description']}"fordindata["days"]ifd["is_off_day"]ord["type"]=="makeup_workday"]ifholidays:returnf"{year}{month}月节假日/调休安排:\n"+"\n".join(holidays)else:returnf"{year}{month}月没有法定节假日或调休安排"else:returnf"无法查询{year}{month}月"exceptExceptionase:returnf"查询出错:{str(e)}"@tooldefget_year_holidays(year:int)->str:"""查询整年法定节假日安排概要(列出所有节日名称和放假/调休状态)"""base_url="http://127.0.0.1:5007/api/holiday"try:resp=requests.get(f"{base_url}/year/{year}",timeout=15)ifresp.status_code==200:data=resp.json()items=[]seen=set()fordindata.get("days",[]):name=d["name"]status="放假"ifd["isOffDay"]else"调休上班"key=f"{name}-{status}"ifkeynotinseen:seen.add(key)items.append(f"{name}{status})")returnf"{year}年法定节假日安排概要:\n"+"\n".join(sorted(items))else:returnf"无法获取{year}年节假日数据"exceptExceptionase:returnf"查询出错:{str(e)}"# 工具列表(现在更清晰、更原子)tools=[search_tool,calculator,get_today_holiday,get_date_holiday,get_month_holidays,get_year_holidays,]

这个模块定义了多个实用工具:

  1. calculator:用于数学计算
  2. get_today_holiday:获取今天节假日信息
  3. get_date_holiday:查询指定日期节假日
  4. get_month_holidays:查询月份节假日安排
  5. get_year_holidays:查询年度节假日概要

主程序入口

run.py文件是程序的入口,实现了用户交互逻辑:

# run.pyfromagentimportcreate_qwen_agentdefmain():print("正在启动本地 Qwen2.5-7B Agent(Ollama)...")print("请确保你已运行:ollama serve 并且已下载模型:ollama pull qwen2.5:7b\n")agent_executor=create_qwen_agent()print("Agent 已就绪!支持网络搜索和数学计算。")print("输入 'exit'、'quit' 或 'bye' 退出程序。\n")whileTrue:try:user_input=input("You: ").strip()ifuser_input.lower()in["exit","quit","bye"]:print("再见!")breakifnotuser_input:print("请输入内容哦~")continueprint("Agent 正在思考...\n")response=agent_executor.invoke({"input":user_input})print(f"Agent:{response['output']}\n")exceptKeyboardInterrupt:print("\n\n再见!")breakexceptExceptionase:print(f"发生错误:{e}\n")if__name__=="__main__":main()

部署与运行

要运行这个项目,需要以下步骤:

  1. 安装依赖:
pipinstall-rrequirements.txt
  1. 启动Ollama服务:
ollama serve
  1. 下载Qwen2.5模型:
ollama pull qwen2.5:7b
  1. 运行主程序:
python run.py

5.接口请参考:

https://blog.csdn.net/weixin_46244623/article/details/156257588

功能演示

运行程序后,您可以与AI Agent进行交互,例如:

  • 询问数学问题:“计算 25*36+128”
  • 搜索网络:“今天天气如何?”
  • 查询节假日:“今天是什么节日?”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/22 15:26:25

亲测好用9个AI论文写作软件,专科生毕业论文轻松搞定!

亲测好用9个AI论文写作软件,专科生毕业论文轻松搞定! AI 工具助力论文写作,专科生也能轻松应对 随着人工智能技术的不断发展,AI 写作工具逐渐成为学生群体,尤其是专科生在撰写毕业论文时的重要助手。这些工具不仅能够帮…

作者头像 李华
网站建设 2026/3/21 9:00:37

教育大模型的认知过载风险:个性化推荐与学习者自主性的矛盾

教育大模型的认知过载风险:个性化推荐与学习者自主性的矛盾 引言:智能教育的双刃剑 随着教育大模型(Educational Large Language Models)的快速发展,个性化学习推荐系统已成为智能教育的核心组件。这些系统通过分析学习…

作者头像 李华
网站建设 2026/3/21 23:05:37

unique_lock<mutex> uLock 的用法

std::unique_lock<std::mutex> 是 C11 提供的一种更灵活的互斥锁管理器&#xff0c;常用于多线程同步场景。std::unique_lock<std::mutex> uLock; 本质上是一个可控制加锁/解锁时机、可转移所有权的锁对象。一、unique_lock 是干什么的&#xff1f;一句话总结&…

作者头像 李华
网站建设 2026/3/23 4:20:31

探索金属凝固的奥秘:三维枝晶相场模拟的奇妙旅程

三维凝固金属枝晶生长相场模拟&#xff01; 首次实现三维凝固枝晶相场模拟&#xff5e; 根据经典三维模型 实现枝晶的各项异性凝固生长 完成相场和温度场变化情况&#xff01; 源代码实现&#xff0c;且可修改相关参数对应实际实验情况&#xff01; 增加维度 增加可能性&#x…

作者头像 李华
网站建设 2026/3/25 2:43:56

成本核算模型:每千次调用消耗多少电费

成本核算模型&#xff1a;每千次调用消耗多少电费 在AI推理成本高企的今天&#xff0c;一个现实问题摆在开发者面前&#xff1a;我能不能负担得起每天成千上万次的模型调用&#xff1f;尤其是当任务只是解一道算法题或写一段函数时&#xff0c;是否真的需要动用GPT-4级别的“重…

作者头像 李华
网站建设 2026/3/18 5:29:15

8 款 AI 开题报告工具测评:让论文开篇快人 N 步

论文开题到底能多轻松&#xff1f;现在的 AI 工具已经把 “烧脑写框架” 变成了 “填空式出稿”。今天就盘点 8 款实用的 AI 开题报告工具&#xff0c;PaperXie直接拿下 “性价比王者”&#xff0c;剩下 7 款各有特色 —— 看完这篇&#xff0c;你选工具再也不用踩坑&#xff0…

作者头像 李华