LangChain大模型应用开发:自定义工具调用

介绍

大家好,博主又来给大家分享知识了。今天要给大家分享的是使用LangChain进行大模型应用开发中的自定义工具调用。

在大模型应用开发的领域里,LangChain凭借其强大的功能和灵活性,成为了开发者们的得力助手。自定义工具调用则是LangChain众多亮点特性之一,它赋予了开发者根据特定需求打造专属工具的能力。

好了,我们直接进入正题。

自定义工具

LangChain的应用开发中,自定义工具是实现灵活且强大功能的关键要素之一。尤其是在构建智能体(Agent)时,工具的合理配置和使用至关重要。智能体就像是大模型的 “助手”,能够代表大模型执行各种特定任务。而自定义工具则为这个 “助手” 提供了多样化的 “工作器具”,让其能够更好地应对不同场景下的需求。

接下来我介绍在构建智能体时自定义工具的相关内容。在构建智能体时,我们需要为其提供一个Tool列表,以便智能体可以使用这些工具。除了实际调用的函数之外,Tool由几个组件组成:

属性

类型

描述

name

str

在提供给LLM或智能体工具中必须是唯一的。

description

str

描述工具的功能。LLM或智能体将使用此描述作为上下文。

args_schema

Pydantic BaseModel

可选但建议,可用于提供更多信息(例如,few-shot示例)验证预期参数。

return_direct

boolean

仅对智能体相关。当为True时,在调用给定工具后,智能体将停止并将结果直接返回给用户。

LangChain提供了三种创建工具的方式:

  1. 使用@tool装饰器——定义自定义工具的最简单方式。
  2. 使用StructuredTool.from_function类方法——这类似于@tool装饰器,但允许更多配置和同步和异步实现的规范。
  3. 通过子类化BaseTool——这是最灵活的方法,它提供了最大程度的控制,但需要更多的工作量和代码。@toolStructuredTool.from_function类方法对于大多数用例应该足够了。提示:如果工具具有精心选择的名称、描述和JSON模式,模型的性能会更好。

装饰器@tool

这个@tool装饰器是定义自定义工具的最简单方式。该装饰器默认使用函数名称作为工具名称,但可以通过传递字符串作为第一个参数来覆盖。此外,装饰器将使用函数的文档字符串作为工具的描述,因此必须提供文档字符串

装饰器@tool应用完整代码

# 从langchain_core库的tools模块导入tool装饰器,用于将函数转换为工具
from langchain_core.tools import tool


# 使用tool装饰器,将下方函数转换为LangChain可用的工具
@tool
# 定义一个名为multiply_numbers的函数,接收两个整数类型的参数,返回值也是整数
def multiply_numbers(num1: int, num2: int) -> int:
    # """此方法用于将两个整数相乘并返回结果。"""
    # 返回两个输入参数相乘的结果
    return num1 * num2


# 打印multiply_numbers工具的名称
print(multiply_numbers.name)
# 打印multiply_numbers工具的描述信息
print(multiply_numbers.description)
# 打印multiply_numbers工具的参数信息
print(multiply_numbers.args)

装饰器@tool应用运行结果

multiply_numbers
此方法用于将两个整数相乘并返回结果。
{'num1': {'title': 'Num1', 'type': 'integer'}, 'num2': {'title': 'Num2', 'type': 'integer'}}

进程已结束,退出代码为 0

我们使用@tool装饰器还可以应用于异步方法中。

装饰器@tool应用异步方法完整代码

# 从langchain_core库的tools模块导入tool装饰器,用于将函数转换为工具
from langchain_core.tools import tool


# 使用tool装饰器,将下方函数转换为LangChain可用的工具
@tool
# 定义一个名为multiply_numbers的异步函数,接收两个整数类型的参数,返回值也是整数
async def multiply_numbers(num1: int, num2: int) -> int:
    """此方法用于将两个整数相乘并返回结果。"""
    # 返回两个输入参数相乘的结果
    return num1 * num2


# 打印multiply_numbers工具的名称
print(multiply_numbers.name)
# 打印multiply_numbers工具的描述信息
print(multiply_numbers.description)
# 打印multiply_numbers工具的参数信息
print(multiply_numbers.args)

装饰器@tool应用异步方法运行结果

multiply_numbers
此方法用于将两个整数相乘并返回结果。
{'num1': {'title': 'Num1', 'type': 'integer'}, 'num2': {'title': 'Num2', 'type': 'integer'}}

进程已结束,退出代码为 0

我们还可以将装饰器@tool定义工具名称,输入参数验证,并设置该方法是否立刻返回结果等。

装饰器@tool多参数应用完整代码


                
<think>嗯,用户想了解如何使用LangChain调用国内的大规模语言模型。首先,我得回忆一下LangChain的基本结构和功能。根据引用[2],LangChain是一个Python框架,用于连接语言模型和其他数据源,让应用能感知数据并具有交互性。而用户提到的是国内的大模型,可能需要通过API或本地部署的方式接入。 首先,需要确认国内有哪些大模型支持API调用,比如文心ERNIE、通义千问或者智谱AI等。然后,考虑如何在LangChain中集成这些模型。引用[1]提到,LangChain的Chat模型支持多种输入格式,如字符串、消息列表,还能配置参数如温度、最大令牌数等。所以,用户需要将这些国内模型的API接口封装成LangChain的LLM组件。 接下来,步骤可能包括安装必要的库,比如LangChain本身和对应国内模型的SDK。然后,创建自定义的LLM类,继承自LangChain的BaseLLM,并实现必要的_call方法,在其中调用国内模型的API。这里需要注意处理认证信息,比如API Key,可能要从环境变量中获取,保证安全性。 另外,引用[3]提到模型部署时的服务化和容器化,可能用户也需要考虑将国内模型部署为API服务,再通过LangChain调用。例如,使用FastAPI封装模型,然后用Docker容器化,这样LangChain就可以通过HTTP请求来访问。 还有参数配置方面,温度参数和最大令牌数这些在生成文本时很重要,需要指导用户如何调整这些参数以适应不同场景。比如,温度低时输出更确定,适合事实性回答;温度高则更有创造性。 可能遇到的问题包括网络连接问题,国内模型可能需要特定的访问权限或区域设置。另外,不同模型的API响应格式可能不同,需要正确解析返回结果,确保LangChain能处理。 最后,用户可能需要示例代码,展示如何具体实现自定义LLM类,并集成到LangChain的链或代理中。需要确保代码正确使用异步请求,处理可能的错误,比如重试机制或超时设置。 总结步骤:安装依赖、创建自定义模型类、处理认证、调用API、配置参数、集成到应用流程。同时,提醒用户注意模型选择、参数调整和部署方式,确保顺利调用国内大模型。</think>### 分步说明:使用LangChain调用国内大规模语言模型 #### 1. **环境准备与依赖安装** 首先确保已安装LangChain及相关依赖: ```bash pip install langchain python-dotenv requests ``` 国内大模型通常需要特定SDK(如文心ERNIE、通义千问等),需安装对应库: ```bash # 示例:安装文心ERNIE SDK(若适用) pip install erniebot ``` #### 2. **封装国内模型API** 假设目标模型支持HTTP API调用,需创建自定义LLM类继承`BaseLLM`: ```python from langchain.llms.base import BaseLLM from typing import Optional, List, Dict import requests import os class ChineseLLM(BaseLLM): api_key: str # 认证参数 model_name: str = "your_model_name" # 模型标识 def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str: # 调用国内模型API headers = {"Authorization": f"Bearer {self.api_key}"} data = { "prompt": prompt, "temperature": 0.7, # 参数配置[^1] "max_tokens": 500 } response = requests.post("https://api.example.com/v1/completions", json=data, headers=headers) result = response.json() return result["text"][0] # 解析响应 @property def _llm_type(self) -> str: return "chinese_llm" ``` #### 3. **配置认证信息** 通过环境变量管理敏感信息(API Key): ```python from dotenv import load_dotenv load_dotenv() llm = ChineseLLM(api_key=os.getenv("API_KEY")) ``` #### 4. **集成LangChain应用流程** 将自定义模型嵌入LangChain链或代理中: ```python from langchain.chains import LLMChain from langchain.prompts import PromptTemplate prompt = PromptTemplate( input_variables=["topic"], template="用中文写一段关于{topic}的简短说明:" ) chain = LLMChain(llm=llm, prompt=prompt) print(chain.run("量子计算")) ``` #### 5. **参数调优与部署** - **温度参数**:调整生成多样性(0-1,值越高越随机)[^3] - **服务化部署**:若模型需本地部署,可用FastAPI封装为服务: ```python from fastapi import FastAPI app = FastAPI() @app.post("/generate") async def generate_text(prompt: str): return {"text": llm(prompt)} ``` 通过Docker容器化后部署到云平台(如阿里云、腾讯云)[^3]。 --- ### 关键注意事项 1. **模型选择**:优先选择提供标准API接口的国内模型(如文心、通义、智谱AI) 2. **网络限制**:确保服务器IP在模型的许可访问列表中 3. **异步优化**:使用`async/await`或LangChain的异步接口提升并发性能 4. **错误处理**:添加重试逻辑和超时控制: ```python from tenacity import retry, stop_after_attempt @retry(stop=stop_after_attempt(3)) def safe_call(prompt): return llm(prompt) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老赵爱学习

您的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值