AI大模型实操演示:如何在LangChain+Ollama中使用 Tool (Function Call)

介绍

LangChain 是一个强大的框架,旨在帮助开发者构建基于语言模型的应用程序。在这个教程中,我们将深入探讨如何使用 LangChain 中的 Tool 功能,创建自定义工具以获取天气和时间信息。

文末赋完整代码!扫描下方二维码免费领取

环境准备

在开始之前,请确保您已经安装了 LangChain 及其依赖项。您可以使用以下命令进行安装:

pip install langchain

代码结构

我们将通过一个 Jupyter Notebook 来演示如何使用 LangChain 中的 Tool。以下是代码的主要结构:

1. 导入必要的库

首先,我们需要导入 LangChain 中的相关模块和 Python 的标准库:

from langchain.agents import Tool, AgentExecutor, LLMSingleActionAgent
from langchain.prompts import StringPromptTemplate
from langchain import OpenAI, LLMChain
from typing import List, Union
from langchain_community.llms import Ollama 
from langchain.schema import AgentAction, AgentFinish
import re
from langchain.agents import AgentOutputParser
from langchain_core.output_parsers import StrOutputParser

2. 定义工具函数

接下来,我们定义两个简单的工具函数:一个用于获取天气信息,另一个用于获取当前时间。

def get_weather(location: str) -> str:
    """获取指定位置的天气信息"""
    return f"{location}的天气晴朗,温度25度"

def get_time(timezone: str) -> str:
    """获取指定时区的当前时间"""
    return f"{timezone}的当前时间是下午3点"

3. 创建工具列表

我们将创建一个工具列表,其中包含我们刚刚定义的工具:

tools = [
    Tool(
        name="Weather",  # 工具的名称为 "Weather"
        func=get_weather,  # 关联的函数是 get_weather,用于获取天气信息
        description="用于获取指定位置的天气信息"  # 工具的描述,供LLM理解何时调用该工具
    ),
    Tool(
        name="Time",  # 工具的名称为 "Time"
        func=get_time,  # 关联的函数是 get_time,用于获取当前时间
        description="用于获取指定时区的当前时间"  # 工具的描述,供LLM理解何时调用该工具
    )
]
  • description字段会直接影响大语言模型选择工具的准确率

4. 创建提示模板

我们需要一个自定义的提示模板,以便在与用户交互时使用:
在这里插入图片描述在这里插入图片描述

from typing importList
from langchain.prompts import StringPromptTemplate
from langchain.tools import Tool

classCustomPromptTemplate(StringPromptTemplate):
    tools: List[Tool]

    defformat(self, **kwargs) -> str:
        # 步骤1:提取中间步骤记录
        intermediate_steps = kwargs.pop("intermediate_steps")

        # 步骤2:构建历史行动轨迹
        thoughts = ""
        for action, observation in intermediate_steps:
            thoughts += f"\n行动: {action}\n观察: {observation}"

        # 步骤3:生成工具描述列表
        tools_str = "\n".join([f"{tool.name}: {tool.description}"for tool inself.tools])

        # 组装完整提示模板
        return f"""请严格按照以下格式回答用户问题。

可用工具:
{tools_str}

必须严格按照如下格式回复:
思考: 分析需要做什么
行动: <工具名> <参数>
观察: <工具返回的结果>
... (可以重复思考/行动/观察步骤)
回答: 根据观察给出最终答案

之前的行动:{thoughts}

人类: {kwargs["input"]}
思考:"""

说明:

intermediate_steps = kwargs.pop(“intermediate_steps”)

存储的是调用Tool返回的结果,如:

[(AgentAction(tool='Weather', tool_input='{"location": "北京"}', log='思考: 需要获取北京当前的天气信息。\n行动: Weather {"location": "北京"}'), '{"location": "北京"}的天气晴朗,温度25度')]

kwargs.pop 获取之后回移出。

5. 创建输出解析器

输出解析器用于解析模型的输出,确保我们能够正确处理模型的响应:

class CustomOutputParser(AgentOutputParser):
    defparse(self, text: str) -> Union[AgentAction, AgentFinish]:
      
        if"回答:"in text or"回答:"in text:
            answer = text.split("回答:")[-1].split("回答:")[-1].strip()
            return AgentFinish(
                return_values={"output": answer},
                log=text
            )
        
        action_match = re.search(r"行动[::]\s*(.*?)(?:\n|$)", text)
        ifnot action_match:
            print(f"DEBUG - 收到的文本: {text}")
            if"思考:"in text or"思考:"in text:
                raise ValueError("模型正在思考,但尚未给出行动步骤")
            else:
                raise ValueError("无法识别输出格式,需要'行动'或'回答'")
        
        action = action_match.group(1).strip()
        parts = action.split()
        iflen(parts) < 2:
            raise ValueError(f"行动格式错误,需要'工具名 参数'格式: {action}")
            
        tool_name = parts[0]
        tool_input = " ".join(parts[1:])
        
        return AgentAction(tool=tool_name, tool_input=tool_input, log=text)

    @property
    def_type(self) -> str:
        return "custom"

这里主要根据大模型返回的结果进行判断下一步该走什么流程,这里的逻辑自己可以优化,我这里只是一个 Demo,比如:

  • • 代码检查文本中是否包含“回答:”或“回答:”,如果找到这些标识符,表示模型已经完成任务并给出了最终答案。此时,提取答案并返回一个 AgentFinish 对象,表示任务完成。
  • • 如果没有找到最终回答,代码会使用正则表达式查找“行动:”或“行动:”后面的内容。如果未找到行动步骤,打印调试信息,并根据文本内容判断是否抛出错误。

说明:

  • • AgentAction: 表示代理需要执行的具体行动,包含工具名称、输入参数和日志信息。(通过他可以完成多次 LLM 调用)
  • • AgentFinish: 表示代理完成任务的状态,包含最终返回的结果和日志信息。

6. 设置 Agent

我们将初始化一个语言模型(LLM)并创建一个 Agent:

# 初始化Ollama模型配置
llm = Ollama(
    model="qwen2.5:7b",  # 指定要使用的模型名称
    base_url="${Ollama地址}"# 设置API端点的地址,使用环境变量或配置文件中的地址
)

# 创建自定义提示模板
prompt = CustomPromptTemplate(
    template="",  # 提示模板的内容,这里为空字符串,在使用中动态生成
    tools=tools,  # 将之前定义的工具列表传入模板
    input_variables=["input", "intermediate_steps"]  # 定义输入变量,包含用户输入和中间步骤
)

# 创建输出解析器实例
output_parser = CustomOutputParser()  # 实例化自定义输出解析器,用于解析模型的输出

# 创建LLM链,结合模型和提示模板
llm_chain = LLMChain(llm=llm, prompt=prompt)  # 将Ollama模型和提示模板组合成一个链

# 创建单一行动代理
agent = LLMSingleActionAgent(
    llm_chain=llm_chain,  # 将LLM链传入代理
    output_parser=output_parser,  # 设置输出解析器
    stop=["\n观察:"],  # 定义停止标记,当模型输出包含此标记时停止生成
    allowed_tools=[tool.name for tool in tools]  # 允许代理使用的工具列表
)

7. 创建 Agent 执行器

最后,我们创建一个 Agent 执行器,并在主程序中运行它:

# 创建Agent执行器,结合代理和工具
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent,  # 将之前创建的代理实例传入
    tools=tools,  # 传入可用的工具列表
    verbose=True# 设置为True以启用详细输出,便于调试和观察执行过程
)

# 主程序入口
if __name__ == "__main__":
    # 运行代理执行器,传入用户查询的内容
    result = agent_executor.run("北京的天气怎么样?")  # 执行代理,询问北京的天气情况
    # 打印最终结果
    print("最终结果:", result)  # 输出代理返回的结果
    
    result = agent_executor.run("北京现在几点")
    # 打印最终结果
    print("最终结果:", result)  # 输出代理返回的结果

效果演示

可以看到已经成功调用了工具,剩下的使用大家就自由发挥了,演示的工具我是写死的,实际应用大家可以自定义实现。

image-20250221172210105

总结

通过本文,我们学习了如何使用 LangChain 中的 Tool 功能来创建自定义工具,以获取天气和时间信息。通过定义工具函数、创建工具列表、设置提示模板和输出解析器,我们能够初步构建一个能够与用户进行交互的智能代理,为进一步开发更复杂的智能应用提供了思路和方法。

如何零基础入门 / 学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

全套AGI大模型学习大纲+路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

read-normal-img

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈
基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

img

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

<think>好的,用户想知道如何在大型语言模型(LLM)的推理过程中现函数调用。首先,我需要回忆一下之前看过的相关引用内容。引用[1]提到需要定义可以被LLM调用的函数,包括函数名、描述和参数列表。引用[4]则详细说明了函数调用功能如何提升模型的推理能力,以及如何通过tools参数向模型提供函数定义,模型生成调用参数后由开发者执行。 接下来,我应该整理现步骤。根据引用中的信息,首先需要定义函数,然后通过API将函数描述传递给模型,模型生成调用参数后,再执行外部函数。引用[3]还提到有两种交互方式:用户直接选择或模型推理判断,这可能需要在步骤中说明。 可能还需要考虑不同框架的特点,比如引用[2]提到的local-llm-function-calling专注于函数调用和输出约束,与其他框架的区别。但用户的问题主要关注现方法,所以这部分可以作为补充。 需要确保回答结构清晰,分步骤说明,并引用正确的来源。同时,要检查是否符合系统级指令,比如使用正确的LaTeX格式和引用标识。例如,在提到参数列表时,可以用$...$包裹变量名,如$参数名$。 最后,生成相关问题时要围绕函数调用的定义、交互方式、参数验证、应用场景和本地部署等方面,确保问题有针对性,帮助用户深入理解。</think>### 如何在 LLM现推理过程的函数调用 现大型语言模型(LLM)的推理过程中函数调用,需通过以下步骤完成: --- #### **1. 定义函数规范** - **核心要求**:明确函数名称、功能描述、输入参数(含类型和约束)及返回值格式。例如: ```json { "name": "get_weather", "description": "查询指定城市的天气", "parameters": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名称"} } } } ``` 此步骤需确保模型能理解函数语义和调用逻辑[^1][^4]。 --- #### **2. 通过 API 传递函数定义** - **技术现**:将函数定义通过 API 参数(如 OpenAI 的 `tools`)传递给模型: ```python response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "北京今天气温多少?"}], tools=[{ "type": "function", "function": weather_function_definition # 步骤1定义的函数 }] ) ``` 模型会生成包含调用参数的响应(如 `{"city": "北京"}`)[^4]。 --- #### **3. 解析并执行函数调用** - **开发侧处理**:从模型响应中提取参数并执行际函数: ```python def get_weather(city): # 调用天气API或查询数据库 return f"{city}天气:晴,25℃" if response.choices[0].message.tool_calls: args = json.loads(response.choices[0].message.tool_calls[0].function.arguments) result = get_weather(args["city"]) ``` 模型不直接执行函数,仅提供参数。 --- #### **4. 反馈结果并迭代** - **交互闭环**:将函数执行结果返回给模型,支持后续推理: ```python messages.append({ "role": "tool", "content": result, "tool_call_id": response.choices[0].message.tool_calls[0].id }) ``` 此过程可循环进行以现复杂任务。 --- ### **关键技术点** 1. **语义对齐**:函数描述需与模型知识对齐,例如“查询天气”需明确参数为城市名称而非经纬度。 2. **参数验证**:需在调用前校验参数合法性(如城市是否存在),避免模型生成无效参数[^3]。 3. **本地部署优化**:如引用[^2]所述,本地化部署需关注输出约束,可通过微调或提示词工程提升调用准确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值