news 2026/6/10 23:09:24

Langchain(下)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Langchain(下)

Agent部分

C-898S-989D-82N快点岛币吧

组件

Tool

的问题和工具交给大语言模型然后大语言模型进行1个意图识别决定是否要执行工具如果需要执行工具的话,执行工具并返回结果再返回给大语言模型然后代言模型根据结果生成我们的答案

SDK

这里直接调用openai的sdk

结果是

ChatCompletionMessage(content='', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=[ChatCompletionMessageFunctionToolCall(id='call_579422a0074c40f28d68f1', function=Function(arguments='{"city": "北京", "date": "2026-05-22"}', name='get_weather'), type='function', index=0)])
from openai import OpenAI import json client = OpenAI() # 1. 通过JSON结构定义工具,包括工具名称,描述,参数等 tools = [ { "type": "function", "function": { "name": "get_weather", "description": "Get today's weather for a location.", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名称, e.g. San Francisco", }, "date" :{ "type":"string", "description":"想要查询的天气的日期, e.g. 2023-12-25" } }, "required": ["city","date"], "additionalProperties": False, }, "strict": True, }, }, ] def get_weather(city,date): return f"{city} on {date} is cloudy with a chance of rain." messages = [ {"role": "user", "content": "What is the weather like in 北京 on 2024-12-25?"} ] # 2. Prompt the model with tools defined response = client.chat.completions.create( model="gpt-4.1", messages=messages, tools=tools, ) messages.append(response.choices[0].message) for tool_call in response.choices[0].message.tool_calls or []: if tool_call.function.name == "get_weather": # 3. 执行工具函数的逻辑 args = json.loads(tool_call.function.arguments) weather = get_weather(args["city"],args["date"]) # 4. 将工具函数的执行结果添加到消息列表中 messages.append( { "role": "tool", "tool_call_id": tool_call.id, "content": json.dumps({"weather": weather}), } ) response = client.chat.completions.create( model="gpt-4.1", messages=messages, tools=tools, ) # 5. 模型会根据工具函数的执行结果,生成最终的回复 print(response.choices[0].message.content)

LANGCHAIN方式

import json import os from dotenv import load_dotenv from langchain_core.messages import HumanMessage, ToolMessage from langchain_core.tools import tool from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field # 1 使用langchain装饰器定义工具方法和约束 class GetWeatherArgs(BaseModel): # 定义参数city:字符串类型,带描述(大模型会根据这个描述理解参数含义) city: str = Field(description="城市名称, 比方说 北京市, 武汉市,需要传递城市的全名") # 定义参数date:字符串类型,指定日期格式 date: str = Field(description="天气日期,格式是yyyy-MM-dd") @tool(description="获取城市在特定日期的天气",args_schema=GetWeatherArgs) def get_weather(city: str, date: str): # 模拟天气查询,实际项目中这里可以调用真实天气API return f'城市{city}在{date}的天气是晴朗的' # 2 创建llm load_dotenv() # 初始化LLM大模型:使用ChatOpenAI调用 llm = ChatOpenAI( model="qwen-turbo", api_key=os.getenv("OPENAI_API_KEY"), # 从.env读取千问的API Key base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", # 千问的OpenAI兼容接口地址 ) # 3 把工具和llm绑定 llm_with_tools = llm.bind_tools([get_weather]) # 4 构建message human_message = HumanMessage(content="北京在2026-05-22的天气是多少?") # 5 第一次调用llm:意图识别 res = llm_with_tools.invoke([human_message]) ai_message = res print("=== 第一次调用(大模型决定调用工具)===") print(res) # 6 从第一次llm返回结果获取工具名称和参数,进行工具调用 tool_call = res.tool_calls[0]['args'] # tool_res调用工具之后的结果 tool_res = get_weather.invoke(tool_call) # 7 构建message:包含问题 + 第一次调用llm结果 + 工具执行结果 # 8 第二次调用llm tool_id = res.tool_calls[0]['id'] tool_message = ToolMessage(tool_call_id=tool_id, content=tool_res) # human_message: 用户问题 # ai_message:第一次调用llm结果 # tool_message:工具执行结果 final_result = llm_with_tools.invoke([human_message, ai_message, tool_message]) # 打印最终回答 print('\n=== 模型第二次的回复结果(最终答案)===\n', final_result)

createagent

import os from dotenv import load_dotenv from langchain.agents import create_agent from langchain_core.messages.tool import tool_call from langchain_core.tools import tool from langchain_openai import ChatOpenAI # 创建llm load_dotenv() llm = ChatOpenAI( model="qwen-turbo", # 千问模型 api_key=os.getenv("OPENAI_API_KEY"), base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" ) # 创建工具方法 @tool def get_weather(city:str,date:str): """ 获取城市在特定日期的天气 """ return f'在{city} {date}的天气是晴朗的' # 创建agent agent = create_agent( model=llm, tools=[get_weather], ) # 调用agent,获取结果 res = agent.invoke({"messages":[{"role":"user", "content":"北京在2026-05-22的天气是多少?"}]}) print(res)

MCP

MCP的工作流程如下所示: (1)握手与能力声明(Handshake & Discovery):当AI应用程序(Host)启动时,它会根据配置启动 MCP Server(通常是一个子进程)。Host 记住了这些工具的名字和用法说明,但此时 并没有执行任何代码 。 (2)用户提问与上下文注入(Context Injection):User提出问题后,Host 把用户的这个问题,加上刚才 Server 汇报的 工具说明书 ,一起打包发给 LLM。 (3)模型决策(LLM Reasoning):LLM决定是否需要去调用相关工具。 (4)路由与执行(Routing & Execution):Host 收到指令,发现是要调用 MCP 工具,Host 通过 MCP 协议(JSON-RPC)给 MCP Server 发消息,Server 收到请求, 在它自己的进程(如果是StreamableHttp方式,则是在远端执行)里执行相关操作。 所有的驱动依赖、复杂逻辑都在 Server 端。 (5)结果回传(Result Feedback):Server 拿到结果,打包成 MCP 响应发回给 Host,Host再将相关结果,传递给大模型,让大模型做下一步的输出。

服务端

from mcp.server import FastMCP ## stdio传输协议, # 特点:本身不是服务器方式,使用本地命令行调用, # 不需要启动服务器端,在客户端启动和调用 # 定义FastMCP实例 mcp = FastMCP() # 创建工具、资源和提示模板 @mcp.tool() def get_weather(city:str,date:str) -> str: return f"在{city},{date}的天气是下雨的" @mcp.resource("greeting://default") def get_greeting() -> str: return "Hello from static resource!" @mcp.prompt() def greet_user(name: str, style: str = "friendly") -> str: styles = { "friendly": "写一句友善的问候", "formal": "写一句正式的问候", "casual": "写一句轻松的问候", } return f"为{name}{styles.get(style, styles['friendly'])}" if __name__ == "__main__": mcp.run(transport="stdio")

客户端

from mcp.client.streamable_http import streamable_http_client from mcp import ClientSession async def main(): url = "http://localhost:8000/mcp" async with streamable_http_client(url=url) as (read_stream,write_stream,_): async with ClientSession(read_stream=read_stream,write_stream=write_stream) as session: # 1、初始化 await session.initialize() # 2、获取到server端所有工具 tools = await session.list_tools() print(tools) # 3、调用tool result = await session.call_tool(name="get_temperature",arguments={"city":"北京","date":"2023-12-12"}) print(result) if __name__ == "__main__": import asyncio asyncio.run(main())
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 23:05:34

已经处在AI时代里,软件工程师将何去何从?

🌳一个写全栈技术、偏底层基建、爱研究 bug 的程序员博客。技术界的一名小工匠⊥⊤,每天进步一点点。自2022年11月30日,OpenAI正式对外发布ChatGPT以来,其以带可视化对话面向普通大众聊天产品,直接引爆了全球AI热潮。 …

作者头像 李华
网站建设 2026/6/10 23:05:07

【Fastapi学习笔记(7)】—— Fastapi 中间件、前端跨域请求

FastAPI 中间件(Middleware)详解 一、什么是中间件 中间件是介于 客户端请求 和 接口路由函数 之间的一层通用逻辑,请求到达接口之前、响应返回客户端之前都会经过它。 简单流程: 客户端请求 → 中间件(前置逻辑&#…

作者头像 李华
网站建设 2026/6/10 23:05:06

多模态目标检测-LLVIP数据集处理(清洗+YOLO格式)

0、介绍 2021 年,北京邮电大学的研究团队发布了LLVIP 数据集,首次为低光照下的可见光-红外多模态任务提供了大规模、高精度的统一基准。 基本信息: 总样本量:15488对严格对齐的图像(共30976张)分辨率&…

作者头像 李华
网站建设 2026/6/10 22:57:40

猫抓浏览器扩展:5步智能媒体资源嗅探与自动化下载完全指南

猫抓浏览器扩展:5步智能媒体资源嗅探与自动化下载完全指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今数字内容丰富的时代&a…

作者头像 李华
网站建设 2026/6/10 22:52:53

小程序毕业设计-基于微信小程序的智能包裹配送服务管理系统基于springboot+微信小程序的智能包裹配送服务管理系统小程序(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/10 22:52:28

星空-星瀚对接记录

-- 星瀚暂估应收单 fl库 select * from t_ar_busbill where fbillnoARUB-000139 -- 暂估应收单分录 select * from t_ar_busbillentry where fid (select fid from t_ar_busbill where fbillnoARUB-000139) --财务应收单 select * from t_ar_finarbill wh…

作者头像 李华