当前位置: 首页 > web >正文

【笔记】动手学Ollama 第七章 应用案例 Agent应用

正文详见:7.5 使用 LangChain 实现本地 Agenthttps://datawhalechina.github.io/handy-ollama/#/C7/5.%20%E4%BD%BF%E7%94%A8%20LangChain%20%E5%AE%9E%E7%8E%B0%E6%9C%AC%E5%9C%B0%20Agent

一、LangChain版本

1、安装模型

  • 语言模型:ollama pull gemma:2b

2、初始化Agent工具

  • Class SearchInput(BaseModel)描述输入数据的结构,可以用来检查参数的类型。在此代码中,location则被要求必须是字符串类型。
  • Field()函数给location添加了额外的约束(description="location to search for"),表示location的用途为“要搜索的位置”,这些描述信息会成为提示词被AI利用起来,用来理解参数的用途。
  • @tools是一个装饰器(decorator),表明这是一个可以被AI调用的工具。args_schema=SearchInput则表示这个工具的输入参数必须符合SearchInput定义的结构。
  • weather_forecast()函数解释u的一个字符串类型的参数location,但因为使用了args_schema,所以实际上传入的参数是从SearchInput解析出来的带有Field的参数。
  • """天气预报工具。"""字符串是AI Agent最重要的部分之一,Agent会读取这个描述来判断该工具的功能,以确定能在什么时候使用它。

总体来看,AI Agent会:

  1. 分析问题 → 发现与“天气”相关
  2. 查找可用工具 → 找到weather_forecast工具
  3. 解析参数 → 识别出location=“杭州”
  4. 验证输入 → 使用SearchInput模型验证
  5. 调用函数 → weather_forecast(“杭州”)​​​​​​
  6. 得到返回值 → “A dummy forecast for 杭州.”
  7. 回答用户 → “根据预报,杭州……”(具体内容取决于返回值)
from pydantic import BaseModel, Field
from langchain_core.tools import tool  class SearchInput(BaseModel):location: str = Field(description="location to search for")  # 定义一个 Pydantic 模型,用于描述输入模式,并提供描述信息@tool(args_schema=SearchInput)
def weather_forecast(location: str):"""天气预报工具。"""print(f"Weather for {location}")  # 打印要预报天气的位置return f"A dummy forecast for {location}."  # 返回给定位置的虚拟天气预报

3、初始化模型和工具

  • 加载模型gemma:2b
  • 定义工具列表,此处只有一个weather_forecast
from langchain_community.chat_models import ChatOllamallm = ChatOllama(model="gemma:2b")
tools = [weather_forecast]

4、创建提示模板

  • hub.pull的作用是是从LangChain Hub(类似于Github)中加载一个预定义的提示模板,其中react-json是一个著名ReAct模板。
  • react-json模板包含如何思考、要采取的动作、动作的输入、观察结果、最终回答,同时支持JSON格式解析,允许模型输出结构化的动作,如:调用那个工具、传什么参数。
  • partial方法的任务是将某些变量(包含工具)注入进提示模板中
    • render_text_description函数将工具转换成一段可读的文本描述。如:
      weather_forecast: 天气预报工具。参数: location (str) - location to search for
    • ", ".join则通过遍历tools列表,提取每个工具的名称(函数名)并用“,”拼接在一起。这样可以限制模型只能选择列出的工具名,防止其胡编乱造

from langchain import hub
from langchain_core.tools import render_text_descriptionprompt = hub.pull("hwchase17/react-json")
prompt = prompt.partial(tools=render_text_description(tools), tool_names=", ".join([t.name for t in tools]),
)

5、创建Agent

  • create_react_agent函数表明这是一个遵循ReAct架构的AI Agent,该架构的特点是在回答用户问题是进行“思考 → 行动 → 观察 → 回答”循环模式。其输入有三个核心组件:
    • 负责推理和决策的语言模型:llm
    • 可调用的外部工具列表:tools
    • 定制化的提示模板(已注入工具信息):prompt
  • AgentExecutor函数用来封装Agent,使Agent能够自动执行“思考 → 调用工具 → 获取结果 → 继续推理”的完整流程。
    • agent:create_react_agent创建的Agent
    • tools:告诉executor哪些工具可执行
    • handle_parsing_errors:自动处理错误
    • verbose:打印中间步骤日志
    • format:指定模型处处格式
from langchain.agents import AgentExecutor, create_react_agentagent = create_react_agent(llm, tools, prompt) 
agent_executor = AgentExecutor(agent=agent, tools=tools, handle_parsing_errors=True, verbose=False, format="json")  

6、运行Agent

print(agent_executor.invoke({"input":"What is the weather in Paris?"}))

7、使用对话历史

在使用对话历史时,需要使用 react-chat Prompt 模板。在 invoke 时,加入 chat_history

prompt = hub.pull("hwchase17/react-chat")# 构建 ReAct agent
agent_history = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent_history, tools=tools, verbose=False)agent_executor.invoke({"input": "what's my name? Only use a tool if needed, otherwise respond with Final Answer","chat_history": "Human: Hi! My name is Bob\nAI: Hello Bob! Nice to meet you",}
)

你可以看到在输出的地方有一行警告信息,这是因为新版的lnagchain自带了langsmith。langsmith是一个在线的调式与监控平台,可以记录Agent调式的整个流程,由于我们并没有设置langsmith的API,所以出现了报错。

二、LlamaIndex版本

1、安装模型

  • ollama pull qwen2:0.5b

2、初始化Agent工具

FunctionTool.from_defaults()方法用于把普通函数包装成AI可调用的工具

  • fn:指定要包装的原始函数
  • name:工具名称,AI或系统内部通过name引用该函数
  • description:描述工具功能,直接告诉AI工具能做什么
  • return_direct:表示AI调用工具后,直接将结果返回给用户,不再需要进过AI加工
from llama_index.core.tools import FunctionTool# Define tools
def multiply(a: float, b: float) -> float:"""Multiply two integers and return the result integer"""return a * b# Create FunctionTool instances
multiply_tool = FunctionTool.from_defaults(fn=multiply,name="MultiplyTool",description="A tool that multiplies two floats.",return_direct=True
)

3、初始化LLM和Agent

通过ReActAgent.from_tools()方法创建具备工具调用能力的ReAct架构的智能体

  • tools:一个包含可用工具的列表,此时只存入了一个工具,Agent也只能使用该工具
  • llm:大语言模型
  • verbose=True:开启“详细模式”,Agent运行时,会打印出每一步的思考过程
from llama_index.llms.ollama import Ollama
from llama_index.core.agent import ReActAgent# 初始化 LLM
llm = Ollama(model="qwen2:0.5b", request_timeout=360.0)# 初始化 ReAct Agent(新写法)
agent = ReActAgent(llm=llm,tools=[multiply_tool],  # 注意:参数名是 tools,不是 [multiply_tool] 作为位置参数verbose=True
)

4、进行对话(不调用Agent)

# direct response
res_llm = llm.complete("What is 2.3 × 4.8 ? Calculate step by step")
print(res_llm)

在不调用Agent的情况下,可以看到,仅凭借该模型(qwen2.0)的能力,无法实现带有小数点的数字相乘的计算

5、进行对话(调用Agent)

# use agent
response = agent.chat("What is 2.3 × 4.8 ? Calculate step by step")
response.response

http://www.xdnf.cn/news/18555.html

相关文章:

  • C++的指针和引用:
  • Apache HTTP Server:深入探索Web世界的磐石基石!!!
  • 第5.3节:awk数据类型
  • 部署Qwen2.5-VL-7B-Instruct-GPTQ-Int3
  • linux中的iptables的简介与常用基础用法
  • ES_分词
  • OpenCV图像形态学操作
  • 智能求职推荐系统
  • ES6 面试题及详细答案 80题 (01-05)-- 基础语法与变量声明
  • 在 Linux 中全局搜索 Word 文档内容的完整指南
  • DeepSeek R2难产:近期 DeepSeek-V3.1 发布,迈向 Agent 时代的第一步
  • (LeetCode 面试经典 150 题) 129. 求根节点到叶节点数字之和 (深度优先搜索dfs)
  • windows中bat脚本中一些操作(一)
  • 面试紧张情绪管理:如何保持冷静自信应对挑战
  • ES_预处理
  • 自定义SamOut模型在随机序列生成任务上超越Transformer
  • DINOv3 重磅发布
  • CLruCache::BucketFromIdentifier函数分析
  • k8s集群限制不同用户操作
  • 基于springboot的中医养生管理系统
  • 机器学习-聚类算法
  • 【算法精练】 哈夫曼编码
  • Kotlin-基础语法练习二
  • 【python】python测试用例模板
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第二章知识点问答(21题)
  • 效果驱动复购!健永科技RFID牛场智能称重项目落地
  • AI资深 Java 研发专家系统解析Java 中常见的 Queue实现类
  • 手机惊魂
  • MySQL高可用之MHA
  • 【智慧城市】2025年中国地质大学(武汉)暑期实训优秀作品(1):智绘旅程构建文旅新基建