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

【Langchain】根据LCEL规范实现Runable interface

目录

✅什么是 Runnable 接口?

✅ 自定义实现一个 Runnable 的例子

✅使用方式

✅ 更复杂一点:实现一个 Runnable 来加时间戳

✅ 与其他链组合使用

✅实现一个标准的 LCEL Runnable 要点

✅实现更复杂、实用、符合 LCEL 规范的 Runnable

🎯 场景说明

实例代码(获取实时天气)


LCEL(LangChain Expression Language)是 LangChain 提供的一套用于组合和控制语言模型、工具、链(Chain)等逻辑的规范。
在 LCEL 中,任何可以执行(run)的模块都应实现 Runnable 接口,包括自定义组件。


✅什么是 Runnable 接口?

这是 LangChain 定义的标准接口之一,其核心方法是:

async def ainvoke(self, input: Any, config: Optional[RunnableConfig] = None) -> Any

你只需要实现 invoke(同步)或 ainvoke(异步)方法即可,LangChain 就可以把你这个类像 LLM、Chain、Tool 一样“拼起来”。


✅ 自定义实现一个 Runnable 的例子

我们来创建一个简单的 Runnable将输入字符串反转

from langchain_core.runnables import Runnable 
from typing import Any, Optional 
from langchain_core.runnables.utils import Input, Output class ReverseTextRunnable(Runnable): """一个简单的Runnable实现:将字符串反转""" def invoke(self, input: Input, config: Optional[dict] = None) -> Output: if not isinstance(input, str): raise ValueError("输入必须是字符串") return input[::-1]

✅使用方式

r = ReverseTextRunnable()
print(r.invoke("hello"))  # 输出:'olleh'

✅ 更复杂一点:实现一个 Runnable 来加时间戳

from datetime import datetime
from langchain_core.runnables import Runnable
from typing import Any, Optionalclass TimestampAppender(Runnable):"""将当前时间附加到文本输入后"""def invoke(self, input: Any, config: Optional[dict] = None) -> Any:timestamp = datetime.utcnow().isoformat()return f"{input} [timestamp: {timestamp}]"


✅ 与其他链组合使用

你可以将这个 Runnable 与其他链用 | 符号组合:

from langchain.chat_models import ChatOpenAIllm = ChatOpenAI()
r = TimestampAppender()# LLM 之后加时间戳
chain = llm | r
print(chain.invoke("你是谁?"))


✅实现一个标准的 LCEL Runnable 要点

要素描述
必须方法invoke(input, config=None)ainvoke(...)
可选方法batch, stream, atransform, 等(可选)
可组合性实现后可与 LLM、Prompt、Chain 等组合使用
输入输出类型建议标注类型,增强可读性与兼容性

✅实现更复杂、实用、符合 LCEL 规范Runnable

它将接收输入文本,调用一个外部 API(示例用 Open-Meteo 免费天气 API),然后处理响应并返回格式化内容

下列代码中定义了4个城市的经纬度坐标,通过输入对应城市名,能够实时获取气温情况 

🎯 场景说明

我们要创建一个 Runnable 类,做以下事情:

  1. 接收城市名(如 "Beijing");

  2. 调用天气 API,获取实时天气数据;

  3. 提取温度并返回格式化字符串,比如:
    👉 "当前北京的气温是 23.1°C"

实例代码(获取实时天气)

import requests
from langchain_core.runnables import Runnable
from typing import Any, Optionalclass WeatherLookupRunnable(Runnable):"""调用 Open-Meteo API 获取城市天气"""def get_coordinates(self, city: str):# 简化演示:你可以用更完善的 geocoding 服务city_map = {"Beijing": (39.9042, 116.4074),"Shanghai": (31.2304, 121.4737),"New York": (40.7128, -74.0060),"Ganzhou":(25.8312,114.9356),}return city_map.get(city)def invoke(self, input: Any, config: Optional[dict] = None) -> str:if not isinstance(input, str):raise ValueError("输入必须是城市名字符串")coords = self.get_coordinates(input)if coords is None:return f"暂不支持城市:{input}"lat, lon = coordsurl = (f"https://api.open-meteo.com/v1/forecast?"f"latitude={lat}&longitude={lon}&current_weather=true")response = requests.get(url)if response.status_code != 200:return "天气 API 请求失败"data = response.json()temp = data.get("current_weather", {}).get("temperature")return f"当前{input}的气温是 {temp}°C" if temp is not None else "未获取到气温"weather = WeatherLookupRunnable()
print(weather.invoke("Ganzhou"))

运行结果

 

当前Ganzhou的气温是 29.5°C

相关文章:

  • 精品,第22章 Python3 数据类型与文件操作详解
  • Kubernetes资源管理之Request与Limit配置黄金法则
  • 科大讯飞TTS(文字转语音)和STT(语音转文字)
  • ragflow报错:KeyError: ‘\n “序号“‘
  • VTK-B 人工智能采集单元选型与配置原理说明
  • printf调试时候正常,运行时打印不出来
  • LAMMPS分子动力学基于周期扰动法的黏度计算
  • 【Bluedroid】蓝牙 HID 设备服务注册流程源码解析:从初始化到 SDP 记录构建
  • 旅游推荐数据分析可视化系统算法
  • 求两个正整数的最大公约数和最小公倍数:方法1:辗转相除法
  • openstack的网络和vpc网络底层原理有什么区别与联系
  • 添加物体.
  • MySQL 从入门到精通(五):索引深度解析 —— 性能优化的核心武器
  • 计算机网络 4-1 网络层(网络层的功能)
  • openstack的网络技术是怎样的
  • JAVA练习题(1) 卖飞机票
  • AJAX 请求方式
  • 【沉浸式求职学习day35】【Tomcat安装、配置】【Http简述】
  • anaconda部分基本指令
  • 车载学习(6)——CAPL(1)一些基础知识
  • 王毅同印度国家安全顾问多瓦尔通电话
  • 巴基斯坦对印度发起网络攻击,致其约70%电网瘫痪
  • 比特币价格重返10万美元,哪些因素使然?
  • 泉州一家婚介机构广告牌越南新娘七天闪婚领证?市监部门介入
  • 上海科创“八杰”赋能新兴产业链:硬核科技,形成良好盈利模式
  • 美联储宣布维持联邦基金利率目标区间不变