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

河北住房和城乡建设委员会门户网站章鱼磁力链接引擎

河北住房和城乡建设委员会门户网站,章鱼磁力链接引擎,苏州网站制作开发,网络建设工程师导读 环境:OpenEuler、Windows 11、WSL 2、Python 3.12.3 langchain 0.3 背景:前期忙碌的开发阶段结束,需要沉淀自己的应用知识,过一遍LangChain 时间:20250225 说明:技术梳理,使用LangChai…

导读

环境:OpenEuler、Windows 11、WSL 2、Python 3.12.3 langchain 0.3

背景:前期忙碌的开发阶段结束,需要沉淀自己的应用知识,过一遍LangChain

时间:20250225

说明:技术梳理,使用LangChain实现tool,tool一般用于智能体(agent、代理)。而当前智能体基本均使用langgraph实现,故而此处仅仅作为示例而已。由于langchain的理念变化,所有都在向langgraph倾向,所以此篇也计划是最后一篇langchain的文章,后面也会使用langgraph实现rag、tool这些。

代码实战

 以下代码实现两个工具,获取北京、上海天气和获取最冷城市的工具,可以通过不同的问题来分析tool实现原理

代码实现

from langchain_core.messages import HumanMessage
from langchain_core.tools import tool
from langchain_openai import ChatOpenAIllm = ChatOpenAI(base_url="https://llm.xxx.xxxx.com/v1/",openai_api_key="sk-xxxxxxxxxx",model_name="qwen2.5-instruct")@tool
def get_weather(location: str):"""获取当前城市天气。"""if location in ["上海", "北京"]:return f"当前{location}天气晴朗,温度为21℃"else:return "该城市未知,不在地球上"@tool
def get_coolest_cities():"""获取中国最冷的城市"""return "黑龙江漠河气温在-30℃"tools = [get_weather, get_coolest_cities]llm_with_tools = llm.bind_tools(tools)messages = ["北京的天气怎么样?", "哈尔滨的天气怎么样?", "中国最冷的城市?", "唐朝持续了多少年?"]for i in messages:ai_msg = llm_with_tools.invoke([HumanMessage(i)])if not ai_msg.tool_calls:print(ai_msg.content, "--未调用工具")for tool_call in ai_msg.tool_calls:selected_tool = {"get_weather": get_weather, "get_coolest_cities": get_coolest_cities}[tool_call["name"].lower()]tool_msg = selected_tool.invoke(tool_call)print(f"{tool_msg.content:<30} {tool_call.get("name")}")

输出

当前北京天气晴朗,温度为21℃                get_weather
该城市未知,不在地球上                    get_weather
黑龙江漠河气温在-30℃                   get_coolest_cities
唐朝从618年建立,到907年灭亡,一共持续了289年。这段历史可以分为初唐、盛唐、中唐和晚唐四个阶段。如果您需要更详细的信息,请告诉我! --未调用工具

分析

第一个问题调用了get_weather方法,第二个问题相同,第三个问题调用get_coolest_cities,第四个问题未调用工具。由此可见,大模型会根据问题自动选择相应的工具。具体选用哪个工具需要查看ai_msg的tool_calls属性。你想要实现你的工具的功能,只需在相应的函数内部实现你的功能即可。

注:该示例出自 langgraph官方文档 更改的demo

tool简介

LangChain的tool功能,一般用于智能体,可以传递给支持工具调用的聊天模型,允许模型请求执行具有特定输入的特定功能。其常见属性有:name、description、args,可以分析代码,以便于更好的理解tool,LangChain也提供了很多的默认工具,地址:LangChain第三方工具集合。

官方文档理解

创建tool

官方文档提供了三种创建方式

tool装饰器

代码实现
from langchain_core.tools import tool@tool
def multiply(a: int, b: int):"""multiply two numbers"""return a * b@tool
async def amultiply(a: int, b: int):"""amultiply two numbers"""return a * bprint(amultiply.name, "|",amultiply.description, "|", amultiply.args)
输出

amultiply | amultiply two numbers | {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}

分析

该方法是通过tool装饰器实现,name即为工具名称,description为工具说明(注释的内容),args为工具接收的参数,两个工具功能相同,仅为异步和同步的差别。该方法为LangChain稳定创建tool的方法,第三种为beta版本,后期可能发生变化。

结构化工具

代码实现
from langchain_core.tools import StructuredTooldef multiply(a: int, b: int):"""multiply two numbers"""return a * basync def amultiply(a: int, b: int):"""amultiply two numbers"""return a * bcalculator = StructuredTool.from_function(func=multiply, coroutine=amultiply)print(calculator.name, "|",calculator.description, "|",calculator.args)
输出

multiply | multiply two numbers | {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}

Runnables方法

代码实现
from langchain_core.language_models import GenericFakeChatModel
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplateprompt = ChatPromptTemplate.from_messages([("human", "Hello. Please respond in the style of {answer_style}.")]
)llm = GenericFakeChatModel(messages=iter(["hello matey"]))chain = prompt | llm | StrOutputParser()as_tool = chain.as_tool(name="Style responder", description="Description of when to use tool."
)print(as_tool.name, "|",as_tool.description,"|", as_tool.args)
输出

/tools/create_tools.py:41: LangChainBetaWarning: This API is in beta and may change in the future.
  as_tool = chain.as_tool(
Style responder | Description of when to use tool. | {'answer_style': {'title': 'Answer Style', 'type': 'string'}}

分析

显然,提示了警告,说明了该API在将来可能发生变化

BaseTool子类

这是最灵活的方法,它提供了最大的控制程度,但需要更多的代码。

代码实现
from typing import Optional, Type
from langchain_core.callbacks import (AsyncCallbackManagerForToolRun,CallbackManagerForToolRun,
)
from langchain_core.tools import BaseTool
from pydantic import BaseModel, Fieldclass CalculatorInput(BaseModel):a: int = Field(description="first number")b: int = Field(description="second number")class CustomCalculatorTool(BaseTool):name: str = "Calculator"description: str = "useful for when you need to answer questions about math"args_schema: Type[BaseModel] = CalculatorInputreturn_direct: bool = Truedef _run(self, a: int, b: int, run_manager: Optional[CallbackManagerForToolRun] = None) -> str:"""Use the tool."""return a * basync def _arun(self,a: int,b: int,run_manager: Optional[AsyncCallbackManagerForToolRun] = None,) -> str:"""Use the tool asynchronously."""return self._run(a, b, run_manager=run_manager.get_sync())tool_case = CustomCalculatorTool()
print(tool_case.name, tool_case.description, tool_case.args)
输出

Calculator useful for when you need to answer questions about math {'a': {'description': 'first number', 'title': 'A', 'type': 'integer'}, 'b': {'description': 'second number', 'title': 'B', 'type': 'integer'}}

分析

该方法为创建工具中最为灵活的方式,当然,比其他方式也更复杂,根据自己的需求选择合适的创建方式

多工具调用

文章开篇使用遍历的方式实现工具调用的详细说明,实际上工具是可以连续调用的

代码实现

from langchain_core.messages import HumanMessage
from langchain_core.tools import tool
from langchain_openai import ChatOpenAIllm = ChatOpenAI(base_url="https://lxxxxx.enovo.com/v1/", api_key="sxxxxxxxwW",model_name="qwen2.5-instruct")@tool
def get_weather(location: str):"""获取当前城市天气。"""if location in ["上海", "北京"]:return f"当前{location}天气晴朗,温度为21℃"else:return "该城市未知,不在地球上"@tool
def get_coolest_cities():"""获取中国最冷的城市"""return "黑龙江漠河气温在-30℃"tools = [get_weather, get_coolest_cities]llm_with_tools = llm.bind_tools(tools)messages = "北京的天气怎么样?哈尔滨的天气怎么样?中国最冷的城市?唐朝持续了多少年?"ai_msg = llm_with_tools.invoke([HumanMessage(messages)])
if ai_msg.content:print(ai_msg.content, "--未调用工具")
for tool_call in ai_msg.tool_calls:selected_tool = {"get_weather": get_weather, "get_coolest_cities": get_coolest_cities}[tool_call["name"].lower()]tool_msg = selected_tool.invoke(tool_call)print(f"{tool_msg.content:<30} {tool_call.get("name")}")

输出

对于唐朝持续了多少年的问题,唐朝从618年到907年,共持续了289年。 --未调用工具
当前北京天气晴朗,温度为21℃                get_weather
该城市未知,不在地球上                    get_weather
黑龙江漠河气温在-30℃                   get_coolest_cities

 分析

一般而言,工具调用后,即执行如下代码后:

llm_with_tools.invoke([HumanMessage(messages)])

返回值为空,即content='',而tool_calls属性中存在tool的name、arguments等信息,如下:

所以,直接产生内容,则说明没有调用工具。工具产生的内容都是在二次调用,如下:

selected_tool = {"get_weather": get_weather, "get_coolest_cities": get_coolest_cities}[tool_call["name"].lower()]
tool_msg = selected_tool.invoke(tool_call)

只有工具在二次调用后,才会生成工具返回的信息

 代码中唐朝持续了多少年?这个问题与工具无关,其余三个问题均与工具相关(即这三个问题都会调用工具),所以当四个问题为合并为一个字符串输入到大模型时,大模型的响应中content会有唐朝相关的内容,而工具中会有三个,如下图:

AIMessage(content='对于唐朝持续了多少年的提问,我需要直接回答,不需要调用工具。唐朝从公元618年到公元907年,持续了大约290年。请继续您的其他查询。', additional_kwargs={'tool_calls': [{'id': 'call_9e32c132-3855-4b77-b5bb-018ea22ca1c1', 'function': {'arguments': '{"location": "北京"}', 'name': 'get_weather'}, 'type': 'function'}, {'id': 'call_9e32c132-3855-4b77-b5bb-018ea22ca1c1', 'function': {'arguments': '{"location": "哈尔滨"}', 'name': 'get_weather'}, 'type': 'function'}, {'id': 'call_9e32c132-3855-4b77-b5bb-018ea22ca1c1', 'function': {'arguments': '{}', 'name': 'get_coolest_cities'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 105, 'prompt_tokens': 301, 'total_tokens': 406, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'qwen2.5-instruct', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-4c888156-f1a5-48fd-bf2d-806c0e1b501c-0', tool_calls=[{'name': 'get_weather', 'args': {'location': '北京'}, 'id': 'call_9e32c132-3855-4b77-b5bb-018ea22ca1c1', 'type': 'tool_call'}, {'name': 'get_weather', 'args': {'location': '哈尔滨'}, 'id': 'call_9e32c132-3855-4b77-b5bb-018ea22ca1c1', 'type': 'tool_call'}, {'name': 'get_coolest_cities', 'args': {}, 'id': 'call_9e32c132-3855-4b77-b5bb-018ea22ca1c1', 'type': 'tool_call'}], usage_metadata={'input_tokens': 301, 'output_tokens': 105, 'total_tokens': 406, 'input_token_details': {}, 'output_token_details': {}})

结语

工具也有流式、异步等方式,工具的回调,langchain也给出了处理方案。此处仅为展示tool的用法,不在过多叙述

http://www.dtcms.com/wzjs/287988.html

相关文章:

  • 电器工程东莞网站建设站长工具app下载
  • 酒店网站建设方案书宁波seo网站推广
  • 做电商设计有什么好的网站推荐网站优化推广怎么做
  • 武汉网站推广哪家好网游推广员
  • 四川煤矿基本建设工程公司网站高质量外链
  • 做哪种网站能赚到钱郑州seo网站关键词优化
  • 网站b2b建设北京知名seo公司精准互联
  • 做论坛网站看什么书如何让百度收录自己信息
  • 高端网站制作网站设计公司开发设计推荐
  • 大连网站代运营的公司有哪些seo课程培训课程
  • 怎么做付费网站百度热搜榜排名
  • 河北招投标网招标公告seo服务运用什么技术
  • 温州微信网站定制阿里巴巴官网首页
  • 懂做游戏钓鱼网站的百度竞价关键词价格查询工具
  • 深圳好点的网站建设公司免费网站在线客服软件
  • 网络公司名字大全简单好听文章优化软件
  • 建设手机网站谷歌排名推广
  • 沧州分销系统制作seo网站快排
  • 博彩游戏正规网站建设东莞网站营销策划
  • 福州鼓楼区网站建设什么公司适合做seo优化
  • wordpress回复下载插件海东地区谷歌seo网络优化
  • 响应式网页设计什么意思站优化
  • 网站构建深圳网站关键词优化推广
  • 智能网站推广优化企业查询官网入口
  • 百度蜘蛛网站排名营销案例分享
  • 音乐网站数据库怎么做网站开发框架
  • 菏泽住房和城乡建设部网站酒店网络营销方式有哪些
  • 什么网站做任务能挣营业推广怎么写
  • 如何做建材团购网站宁波百度快照优化排名
  • 网站怎么做反爬虫怎么找专业的营销团队