掘金 人工智能 10月10日 07:53
本地部署AI Agent:以DeepSeek-R1为例
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了如何利用Ollama在本地部署DeepSeek-R1大模型,并结合Python、Langchain、Chroma向量数据库及ReAct提示词模板,开发一个AI Agent。通过“上海今天天气”这一实际场景,剖析了Agent的思考、任务分解、工具调用(天气API、RAG知识库)及执行过程。文章涵盖了AI Agent的核心功能(自主感知、决策规划、工具调用、动态调整、多任务协同),环境准备(Ollama部署、API Key获取、Rag系统搭建),以及具体的代码实现和执行结果分析,展示了Agent在处理多任务时的思考逻辑和潜在局限性。

🤖 **AI Agent的核心功能**:AI Agent是一种能够自主感知环境、做出决策并执行任务的智能系统。其核心能力包括自主感知与理解用户指令、进行决策与规划任务步骤、调用外部工具(如API、数据库、RAG)执行任务,以及根据反馈动态调整策略和协同多个Agent完成复杂任务。

🛠️ **开发环境与工具准备**:构建AI Agent需要本地部署大模型(如Ollama上的DeepSeek-R1),准备开发框架(Langchain)、向量数据库(Chroma),并获取必要的API接口(如OpenWeatherMap的API Key)。这些工具共同构成了Agent执行任务的基础。

🧠 **ReAct提示词模板与Agent执行流程**:通过ReAct(Reasoning and Acting)提示词模板,引导大模型进行思考(Reasoning)并采取行动(Acting)。Agent接收用户指令后,会思考任务分解,选择合适的工具(如天气API查询、RAG知识库检索),执行工具,然后根据工具返回结果继续思考或输出最终答案,实现了人机交互的自动化。

💡 **多任务处理与Agent局限性**:本文演示了Agent处理包含天气查询和知识检索的复合指令。Agent能够分解任务并调用相应工具,但其思考过程具有一定的不确定性,对工具参数的精确性要求高,并且在知识库未包含相关信息时,可能无法给出满意答案,体现了当前AI Agent技术的进步与挑战。

本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI

说明

本篇文章介绍使用Ollama本地部署DeepSeek-R1 8B通用大模型,作为Agent智能大脑,基于Python3.11(虚拟环境管理工具Conda)、Langchain开发框架、Chroma向量数据库、ReAct提示词模版等工具进行开发AI Agent人工智能体。为了便于理解智能体相关知识,本文以“上海今天天气情况”简单问询为例,去剖析AI agent思考过程和执行任务过程。如agent接到用户指令后,一步一步思考分解任务,去调用天气情况API、检索知识库Rag系统或LLM自身知识回答与执行任务,同时本文也会详细展示与分析AI Agent再执行任务的整个详细思考过程。

要学习AI Agent,首先弄清楚AI Agen是什么,有哪些功能,AI agent是人工智能代理,是一种能自主感知环境、做出决策并执行任务的智能系统,其核心功能体现在以下方面:

    自主感知与理解
    决策与规划
    工具调用与执行

例:用户一次问两个问题:1)上海天气情况,2)上海人工智能发展如何。AI agent思考用调用天气网站API回答第一个天气问题;思考用Rag知识库回答第二问题AI发展如何,如Rag知识库中没有检索到相关知识,最后智能基于DeepSeek本地部署大模型去回答用户问题

    动态调整与迭代
    多任务协同

本文AI Agent例子中Tools箱工具涉及三个功能:

环境前置准备

本文演示一个基于DeepSeek-R1的AI Agent智能体,根据用户指令(以问询上海天气情况为例)Agent会调用两个工具,即天气API、RAG增强检索知识库系统。所以这里需要本地部署DeepSeek-R1,Rag系统需要向量数据库、还要Langchain开发框架,Python环境(conda构建即可)。以上这些环境,在上一篇构建Rag系统有介绍,下文有相关链接。环境准备好,还需一个可调用天气API keys。

我们在官网:openweathermap.org/注册一个免费可调用的天气API接口获取API keys,傻瓜式如下注册就好:

首先,注册账号,按照要求进行认证即可,注册完成登录即可有个免费的API keys,如图:

其次,笔者注册后,点击账号后,获取的免费香的My API keys,如图:

最后,通过下面链接填写想要查询的城市,以及你的API keys验证是否生效,刚注册不是立即生效,一般要几分钟才会生效。

api.openweathermap.org/data/2.5/we…你的API keys

尝试是否生效如:查看上海天气,返回结果如下(json串):

{"coord":{"lon":120.3972,"lat":30.9075},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"base":"stations","main":{"temp":302.55,"feels_like":306.17,"temp_min":302.55,"temp_max":302.55,"pressure":999,"humidity":67,"sea_level":999,"grnd_level":994},"visibility":10000,"wind":{"speed":2.17,"deg":38,"gust":1.59},"clouds":{"all":56},"dt":1754188875,"sys":{"country":"CN","sunrise":1754169272,"sunset":1754220397},"timezone":28800,"id":1816670,"name":"Shanghai","cod":200}

本文利用Ollama在本地部署DeepSeek-R1推理模型,搭建一个Rag增强检索知识库系统,同时此Rag系统也是本文智能体的Tools工具之一。

笔者之前有篇文章,已经讲过本地搭建一个基于DeepSeek部署Rag知识库的内容,其中有讲如何利用Ollama在本地部署DeepSeek-R1推理模型,笔者这里不再赘述。

AI Agent功能说明与代码实现


这里讲述AI Agent以查询天气为例,不代表智能体仅仅只能做这些,也不代表做这些就够了,若结合实际生产可用的场景做复杂的智能体,还有很多工作要做如多种工具实现,提示词工程(如解决反提示攻击、提示词注入问题),结合垂直领域大模型训练、微调、模型稳定性等等问题。这里便于读者简单快速上手,可从以下几个方面入手:

代码实现部分,直接附上可执行代码(环境准备好、包导入直接可运行的):

from langchain import hub from langchain.agents import Tool, create_react_agent, AgentExecutor from langchain_ollama import OllamaLLM import requests

from lang_ollama_chroma import lang_rag

1. 配置本地DeepSeek模型(通过Ollama)

llm = OllamaLLM( model="deepseek-r1",  # 确保已通过ollama pull deepseek下载模型 base_url="http://localhost:11434", temperature=0.5 )

2. 天气查询工具函数

def get_weather(city: str) -> str: """获取指定城市的天气信息""" try:

替换为你的自己的OpenWeatherMap API密钥

api_key = "xxxxxxxxx94271055d4bc24628abf4"

调用天气API

response = requests.get( "api.openweathermap.org/data/2.5/we…", params={ "q": city,

"q": "Shanghai,cn",

"appid": api_key, "units": "metric",  # 摄氏度 "lang": "zh_cn"  # 中文结果 }         )         data = response.json()

提取关键信息

return ( f"{data['name']}当前天气:\n"             f"温度:{data'main'}°C\n"             f"状况:{data'weather'['description']}\n"             f"湿度:{data'main'}%" ) except Exception as e: return f"查询失败:{str(e)}"

3. 注册工具,这里可以注册多个工具(这里注册两个工具,一个API;一个Rag知识库)

tools = [     Tool(    #查询天气API接口工具 name="WeatherQuery", func=get_weather, description="查询城市天气的工具,输入参数为城市名称(如北京:Beijing,cn、上海:Shanghai,cn)" ), Tool(    #查询本地部署增强检索Rag知识库 name="RAG_Retrieval", func=lang_rag, description="用于检索本地文档中的信息上海人工智能发展情况,输入应为具体查询问题" ) ]

4. 获取最新的ReAct提示词模板(从LangChain Hub)这是新版的核心变化:使用标准化提示词模板

prompt = hub.pull("hwchase17/react")

5. 创建Agent

agent = create_react_agent( llm=llm, tools=tools, prompt=prompt )

6. 创建Agent执行器(负责运行Agent并处理输出)

agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True  # 显示思考过程,False不显示思考过程 )

7. 测试

if name == "main":     result = agent_executor.invoke({ "input": "上海今天的天气怎么样?上海人工智能发展怎么样?" }) print("结果:", result["output"])

执行结果解析:

1)问题场景一:上海今天的天气怎么样?


这里需要说明一下天气API参数需要填写Shanghai,cn拼音,填写上海汉子是无法识别的。以下注释掉描述部分description="查询城市天气的工具,输入参数为城市名称(如北京:Beijing,cn、上海:Shanghai,cn

如果没在描述内,说明对应的编码,智能体没有上下文信息,以下是Agent的思考过程,回答不尽人意的,并没有调用正确的工具并提出正确的答案。

注:think标签 是agent思考过程;Action标签是去执行工具

2)问题场景二:上海今天的天气怎么样?


这里使用了description="查询城市天气的工具,输入参数为城市名称(如北京:Beijing,cn、上海:Shanghai,cn。再看Agent思考过程有点智能了。调用正确的工具并给出满意答案。

一起看一下大模型的思考过程:

“啊对了,系统提示中明确要求城市名称要转换成“Shanghai,cn”格式,这个细节不能错。虽然看起来简单,但天气工具每次调用都要精确匹配参数才行。“

3)场景问题三:上海今天的天气怎么样?上海人工智能发展怎么样?


Agent经过思考调用天气API;调用检索Rag知识库系统寻找答案,结果没找到答案,然后基于通用大模型DeepSeek的理解给出了答案。以下是Agent的思考过程:

附上文字版思考过程:

<think>嗯,用户问的是“上海今天的天气怎么样?上海人工智能发展怎么样?”这个问题看起来是两个部分:一个是实时天气查询,另一个是关于上海AI发展的现状和趋势。用户可能正在计划去上海旅游或者出差,想先了解当地的天气情况。同时ta对上海的科技产业感兴趣,特别是人工智能领域的发展状况,可能是为了考察就业机会、投资环境,或者是学术研究需要。对于天气部分,直接调用WeatherQuery工具就能得到准确信息了。“人工智能发展”这部分属于本地文档知识库的内容,应该使用RAG_Retrieval工具来查询。不过用户把两个问题混在一起问了,可能希望一次性获得完整回答。考虑到用户同时询问了天气和AI发展这两个性质完全不同的事情,在回复时需要明确区分两部分信息,并分别说明数据来源的不同可靠性。天气是实时的,而AI发展属于历史知识库内容。</think>好的,我现在将开始分析这个问题并逐步解决。首先,我需要查询上海今天的天气情况,这可以通过调用 WeatherQuery 工具来实现。对于人工智能发展的部分,则可能需要从本地文档中检索相关信息,因此我会使用 RAG_Retrieval 工具。接下来,让我一步步执行这些操作。</think>Thought: 我需要分别处理这两个问题:查询上海今天的天气和了解上海人工智能的发展状况。- 对于"上海今天的天气怎么样?"这个问题,我应该调用 `WeatherQuery` 工具,并输入城市名称 "Shanghai,cn" 来获取最新的天气信息。- 对于"上海人工智能发展怎么样?"这个问题,它涉及本地文档中的知识(如旅游攻略或特定领域的介绍),所以我需要使用 `RAG_Retrieval` 工具。输入应该是具体的查询问题,比如"上海的人工智能产业现状和发展趋势是什么?"现在,我会先执行天气查询。Action: WeatherQueryAction Input: Shanghai,cnShanghai当前天气:温度:29.29°C状况:多云湿度:80%<think>嗯,用户让我查上海今天的天气和人工智能发展情况。首先得拆分成两个问题处理。先看第一个问题,“上海今天的天气怎么样”。这个应该用WeatherQuery工具,输入Shanghai,cn就行。不过我得确认一下返回的数据格式是不是标准的,比如温度、湿度这些数值是否准确显示。然后是“上海人工智能发展怎么样”,这属于需要本地文档的信息,所以要用RAG_Retrieval工具。用户可能想知道的是当前的发展状况,包括政策支持、企业情况或者研究成果之类的。不过我得注意输入的问题描述要具体,不能太笼统,比如直接问"上海的人工智能产业现状和发展趋势是什么?"会更准确。接下来我要执行WeatherQuery的查询。假设返回的数据是温度29°C,多云,湿度80%,这些信息应该没问题。然后处理RAG_Retrieval的部分,用户的问题需要明确指向人工智能发展的情况,可能涉及到政府政策、企业布局或者学术研究等方面。比如可以查"上海的人工智能产业现状和发展趋势是什么?"来获取更详细的信息。不过要注意的是,用户这两个问题的性质完全不同:一个是实时天气,另一个是历史知识库的内容。所以回答时要分开说明,并且指出天气信息可能有变化而AI发展情况相对稳定,但需要引用本地文档才能准确回答。另外,用户可能是游客或商务人士,在计划行程前想了解当地气候和科技环境,这样能帮助ta做更好的准备。</think>好的,我现在将开始分析这个问题并逐步解决。首先,我需要查询上海今天的天气情况,这可以通过调用 `WeatherQuery` 工具来实现。对于人工智能发展的部分,则可能需要从本地文档中检索相关信息,因此我会使用 `RAG_Retrieval` 巛具。接下来,让我一步步执行这些操作。</think>Action: WeatherQueryAction Input: Shanghai,cnShanghai当前天气:温度:29.29°C状况:多云湿度:80%<think>嗯,用户现在问的是上海今天的天气和人工智能发展情况。首先得分开处理这两个部分。先看天气查询的部分。刚才我调用了WeatherQuery工具,结果显示上海今天是多云,温度大概在29°C左右,湿度80%。这个数据应该是比较准确的,但需要确认是否是最新的信息,因为用户可能是在实时获取天气来安排行程或者活动。接下来是人工智能发展的情况。这个问题属于本地文档的内容,比如旅游攻略或产业报告里可能会提到上海作为中国科技中心的发展情况。这时候应该用RAG_Retrieval工具,输入一个明确的问题,例如“上海的人工智能产业现状和发展趋势是什么?”。不过要注意用户可能想知道的是当前的政策支持、主要企业或者学术研究进展,而不仅仅是历史数据。然后需要考虑回答的结构。天气部分已经得到结果,但AI发展这部分需要引用本地文档的信息,并且要说明这些信息是基于知识库的内容,而不是实时数据。同时,应该提醒用户如果有更具体的问题,比如某个公司的技术或具体的政策变化,可能需要进一步查询。另外,用户可能是游客或者商务人士,在计划去上海之前想了解当地的天气情况和科技环境,这样能帮助ta做出更好的行程安排或商业决策。不过也有可能是本地居民关注AI产业动态,或者是学生做相关研究需要参考资料。最后要确保回答清晰分开两部分,并且指出信息来源的不同可靠性:实时天气可能有变化,而AI发展的情况则基于历史知识库数据。</think>Action: RAG_RetrievalAction Input: 上海的人工智能产业现状和发展趋势是什么?提示词模板创建向量数据库检索器{'query': '上海的人工智能产业现状和发展趋势是什么?  \n', 'result': "<think>\n嗯,用户问的是上海人工智能产业的现状和发展趋势。这个问题看起来挺专业的,可能是个科技行业从业者、投资人或者学生在做相关研究。\n\n用户提供的上下文全是关于HNSW算法的重复描述,和问题完全无关啊。这种情况下,我需要先确认自己是否理解正确——看来用户要么是误传了资料,要么是在测试我的信息筛选能力?\n\n作为DeepSeek助手,看到这个问题时确实有点困惑。因为当前提供的所有内容都是在详细解释HNSW(Hierarchical Navigable Small World)算法的原理和运作方式,与上海人工智能产业现状完全无关。\n\n这种情况下最好的回应就是诚实地告诉用户我无法回答这个问题,并建议他们提供相关领域的资料。毕竟作为负责任的知识助手,不能为了应付问题而给出不准确的回答。\n</think>\nI don't know."}<think>好的,现在需要处理用户的查询:“上海今天的天气怎么样?上海人工智能发展怎么样?”。首先看第一个部分“上海今天的天气怎么样”。根据之前的工具调用记录,我注意到在第一次交互中已经成功使用了 `WeatherQuery` 工具来获取了上海市的最新天气信息。这些信息应该是准确且实时更新的,因此我可以直接引用并总结这部分内容。接着是第二个问题“上海人工智能发展怎么样?”。在这个部分里,用户似乎希望了解上海在人工智能领域的整体发展情况,包括产业现状、政策支持或未来趋势等。然而,在提供的上下文和检索结果中,并没有找到任何与上海人工智能产业发展相关的有效信息。这可能是因为相关资料并未包含在我当前访问到的本地文档知识库中。在这种情况下,我应该明确告知用户哪些部分得到了回答,以及哪些问题无法解决的原因。对于天气部分可以给出清晰、准确的回答;而对于AI发展的问题,则需要说明缺乏相关信息,并建议用户提供更多背景或上下文以便更好地理解和回答。</think>Thought: I now know the final answerFinal Answer: 好的,我已经分别查询了上海今天的天气和人工智能发展情况:1. **上海今天天气**- 根据最新的气象数据,上海市当前的天气是多云,温度约为29°C,湿度在80%左右。建议您根据实时变化调整行程。2. **上海人工智能发展**- 抱歉,在我检索到的相关资料中没有找到关于“上海人工智能产业发展现状和趋势”的有效信息。- 如果你能提供更多背景或上下文(比如具体的公司、技术方向或者时间段),我可以更好地理解和回答这个问题。> Finished chain.结果: 好的,我已经分别查询了上海今天的天气和人工智能发展情况:1. **上海今天天气**- 根据最新的气象数据,上海市当前的天气是多云,温度约为29°C,湿度在80%左右。建议您根据实时变化调整行程。2. **上海人工智能发展**- 抱歉,在我检索到的相关资料中没有找到关于“上海人工智能产业发展现状和趋势”的有效信息。- 如果你能提供更多背景或上下文(比如具体的公司、技术方向或者时间段),我可以更好地理解和回答这个问题。Process finished with exit code 0

另,通过同样问题多次提问,每次思考过程不一样,这也说明大模型思考不可解释性。同一个问题执行多次,Agent回答不一样,这也是其缺点之一,但都能正确地去调用相关工具执行,以下是运行两次思考过程

运行第一次:

运行第二次:

写在最后

在人工智能浪潮中,与其焦虑替代风险,不如拥抱技术浪潮主动进化。AI 不是对手,而是解放创造力的工具 —— 它能高效处理重复劳动,让我们聚焦更具价值的思考与创新。

保持学习热情,将 AI 视为协作伙伴:用大模型提升工作效率,借数据工具洞察趋势,靠编程能力拓展技术边界。同时深耕独特优势,人类的共情力、创造力和复杂决策能力,仍是 AI 难以替代的核心竞争力。以开放心态拥抱变化,在人机协作中找到新定位,在技术迭代中积累跨界能力。

每一次技术革命都孕育新机遇,积极融入、持续成长,方能在智能时代立于潮头,收获更广阔的发展空间。

学习资源推荐

如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。

本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

AI Agent DeepSeek-R1 Ollama Langchain RAG 本地部署 人工智能 Python ReAct
相关文章