普通视图

Received before yesterday

LangChain Tools工具使用

2025年12月24日 00:00

未完待续

关于大模型工具使用有关前置知识和原理,已经在下面文章提到:

1.概述

本文介绍基于langchain开发具有工具使用(Function calling)功能的智能体Agent

2.实现

langchain开发Agent,需要安装包

pip install langchain==1.1.2pip install langchain-openaipip install langchain-classic

实现工具方法供大模型调用,并通过函数装饰器@tools修饰工具方法

@tools常用属性

属性类型描述
name_or_callablestr | Callable名称
descriptionstr描述工具的功能,会作为上下文发送给大模型
args_schemaArgsSchema可选择性地指定参数格式
return_directbool是否直接从工具返回

/my_tools.py

from langchain.tools import toolfrom pydantic import BaseModelfrom pydantic import Fieldclass FiledInfo(BaseModel):    """    定义参数信息    """    city: str = Field(description='城市')@tool(args_schema=FiledInfo, description='根据城市名称获取温度')def tp_tool(city: str) -> int:    print('=======tp_tool=======')    if city == '北京':        return 12    elif city == '武汉':        return 23    elif city == '沈阳':        return -10    elif city == '泉州':        return 27    else:        return Noneif __name__ == '__main__':    print( tp_tool.invoke({'city': '沈阳'}) )

使用create_agent创建智能体agent,绑定模型和工具,然后调用invoke()执行

/test_tool2.py

import osfrom langchain.agents import create_agentfrom langchain.chat_models import init_chat_modelfrom my_tool import tp_toolllm = init_chat_model(    model = 'deepseek-chat',    model_provider = 'openai',    api_key = os.getenv('DSKEY'),    base_url = 'https://api.deepseek.com')# 创建 Agent,绑定tp_tool工具agent = create_agent(    llm,    tools=[tp_tool],    system_prompt="""你是一个天气查询助手""")# 执行result = agent.invoke({    "messages": [{"role": "user", "content": "泉州温度多少"}]})for msg in result['messages']:    if hasattr(msg, 'content'):        print(f"{msg.__class__.__name__}: {msg.content}")

输出结果

=======tp_tool=======HumanMessage: 泉州温度多少AIMessage: 我来帮您查询泉州的温度。ToolMessage: 27AIMessage: 根据查询结果,泉州的当前温度是**27°C**。

LangChain开篇

2025年5月24日 00:00

本系列未完待续

关于大语言模型驱动的应用程序有关前置知识,可以移步:

1.概述

LangChain(https://www.langchain.com/)是2022年10月,由哈佛大学的哈里森·蔡斯发起的一个开源框架,采用Python为主要语言编写,用于开发由大语言模型驱动的应用程序,一经推出便获得广泛支持,是最早推出,也是截止成文日期最成熟,支持场景最多的一个大模型应用框架

LangChain顾名思义,Lang指的就是大语言模型,Chain指的就是将大语言模型和各种相关的外部的组件连成一串,这个也是LangChain的核心设计思想。LangChain提供各种支持链式组装的组件,完成高级的特定任务,让复杂的逻辑变得结构化,易于组合和拓展。

LangChain提供整套大模型应用开发的工具集,支持LLM接入,Prompt对话工程构建,记忆管理,工具调用Tools,检索增强生成RAG等多种形态的应用开发。

LangChain类似Spring又分为Spring Framework,Spring Boot, Spring MVC那样,狭义上的LangChain就是LangChain本身,但广义的LangChain除了本身,还包括:LangGraph,LangSmith等组件,LangGraph在的基础上进一步封装,能够协调多个Chain,Tool,Agent完成更复杂的任务和更高级的功能。

本系列将基于Python 3.13.x + LangChain 1.1.x,通过常见形态大模型应用的例子介绍LangChain的使用

2.快速开始

虚拟环境中安装相关包,并设置好python版本

pip install langchain==1.1.2pip install langchain-openai
import sysimport langchainprint(sys.version)print(langchain.__version__)
3.13.11 (tags/v3.13.11:6278944, Dec  5 2025, 16:26:58) [MSC v.1944 64 bit (AMD64)]1.1.2

一个简单的调用大模型例子

from langchain.chat_models import init_chat_modelimport osllm = init_chat_model(    model = 'deepseek-chat',    model_provider = 'openai',    api_key = os.getenv('DSKEY'),    base_url = 'https://api.deepseek.com')print(llm.invoke('你是谁').content)

3. LangChain使用案例

序号文章名概述
1LangChain Prompt提示词工程大模型对话,会话记忆
2LangChain Tools工具使用Tools(Function calling)实现

LangChain Prompt提示词工程

2025年12月12日 00:00

本文未完待续

引言

本文基于Python 1.13.x和LangChain 1.1.2,并采用DeekSeep大模型,介绍LangChain提示词工程的实现。

pip install langchain==1.1.2pip install langchain-openai

类似的其他语言和框架的提示词工程实现案例,可以移步:

1.阻塞式对话

一个简单的对话实现

  • model = 'deepseek-chat' 大模型名称
  • model_provider = 'openai' 采用OpenAI标准
  • api_key = os.getenv('DSKEY') 从环境变量获取API_KEY
  • base_url 接口地址
from langchain.chat_models import init_chat_modelimport osmodel = init_chat_model(    model = 'deepseek-chat',    model_provider = 'openai',    api_key = os.getenv('DSKEY'),    base_url = 'https://api.deepseek.com')print(model.invoke('你是谁').content)

2.流式输出

遍历llm.stream返回的迭代器对象Iterator[AIMessageChunk],得到实时返回的输出,打印追加

from langchain.chat_models import init_chat_modelimport osllm = init_chat_model(    model = 'deepseek-chat',    model_provider = 'openai',    api_key = os.getenv('DSKEY'),    base_url = 'https://api.deepseek.com')for trunk in llm.stream('你是谁'):    print(trunk.content, end='')print('结束')

还可以每次返回和之前的返回拼接在一起

无数trunk对象通过+加在一起,底层是用重写__add__()方法运算符重载实现

from langchain.chat_models import init_chat_modelimport osllm = init_chat_model(    model = 'deepseek-chat',    model_provider = 'openai',    api_key = os.getenv('DSKEY'),    base_url = 'https://api.deepseek.com')full = Nonefor trunk in llm.stream('用一句话介绍自己'):    full = trunk if full is None else full + trunk    print(full.text)    print(full.content_blocks)print('结束')print(full.content_blocks)

运行结果:

[]你好[{'type': 'text', 'text': '你好'}]你好,[{'type': 'text', 'text': '你好,'}]你好,我是[{'type': 'text', 'text': '你好,我是'}]你好,我是Deep[{'type': 'text', 'text': '你好,我是Deep'}]你好,我是DeepSe[{'type': 'text', 'text': '你好,我是DeepSe'}]你好,我是DeepSeek[{'type': 'text', 'text': '你好,我是DeepSeek'}]你好,我是DeepSeek,[{'type': 'text', 'text': '你好,我是DeepSeek,'}]你好,我是DeepSeek,一个[{'type': 'text', 'text': '你好,我是DeepSeek,一个'}]你好,我是DeepSeek,一个由[{'type': 'text', 'text': '你好,我是DeepSeek,一个由'}]你好,我是DeepSeek,一个由深度[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度'}]你好,我是DeepSeek,一个由深度求[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求'}]你好,我是DeepSeek,一个由深度求索[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索'}]你好,我是DeepSeek,一个由深度求索公司[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司'}]你好,我是DeepSeek,一个由深度求索公司创造的[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的'}]你好,我是DeepSeek,一个由深度求索公司创造的AI[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助![{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊'}]结束[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊'}]

还可以加上一个提示词模板PromptTemplate

要想流式,只要改成chain.stream(...)即可

import osfrom langchain.chat_models import init_chat_modelfrom langchain_core.prompts import PromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnableSequenceprompt_template = PromptTemplate(    template='做一个关于{topic}的小诗',    input_variables=['topic'])llm = init_chat_model(    model = 'deepseek-chat',    model_provider = 'openai',    api_key = os.getenv('DSKEY'),    base_url = 'https://api.deepseek.com')parser = StrOutputParser()# 提示词=》大模型=》格式化输出chain = RunnableSequence(prompt_template, llm, parser)resp = chain.invoke({'topic': '霸道总裁爱上做保洁的我'})print(resp)

3.LCEL增强对话功能

要理解LCEL,首先要了解Runable,Runable(langchain_core.runnables.base.Runnable)是langchain中可以调用,批处理,流式输出,转换和组合的工作单元,是实现LCEL的基础,通过重写__or__()方法,实现了|运算符的重载,实现了Runable的类对象之间便可以进行一些类似linux命令中的管道(|)操作。

LCEL,全称LangChain Express Language,即LangChain表达式语言,也是LangChain官方推荐的写法,是一种从Runable而来的声明式方法,用于声明,组合和执行各种组件(模型,提示词,工具等),如果要使用LCEL,对应的组件必须实现Runable,使用LCEL创建的Runable称之为链。

例如,将刚刚提示词模板的例子用LCEL重写

import osfrom langchain.chat_models import init_chat_modelfrom langchain_core.prompts import PromptTemplatefrom langchain_core.output_parsers import StrOutputParserprompt_template = PromptTemplate(    template='做一个关于{topic}的小诗',    input_variables=['topic'])llm = init_chat_model(    model = 'deepseek-chat',    model_provider = 'openai',    api_key = os.getenv('DSKEY'),    base_url = 'https://api.deepseek.com')parser = StrOutputParser()# LCEL重写chain = prompt_template | llm | parserresp = chain.invoke({'topic': '霸道总裁爱上做保洁的我'})print(resp)

还可以自定义一个word_count(text: str) -> int函数,通过langchain的RunnableLambda对象包装,使得函数变为获得链式的执行能力的Runable对象,拼入链中,统计大模型回复的字数

import osfrom langchain.chat_models import init_chat_modelfrom langchain_core.prompts import PromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnableLambdaprompt_template = PromptTemplate(    template='做一个关于{topic}的小诗',    input_variables=['topic'])llm = init_chat_model(    model = 'deepseek-chat',    model_provider = 'openai',    api_key = os.getenv('DSKEY'),    base_url = 'https://api.deepseek.com')parser = StrOutputParser()def word_count(text: str) -> int:    print('----------word_count---------')    return len(text)word_counter = RunnableLambda(word_count)# LCEL重写chain = prompt_template | llm | parser | word_counterresp = chain.invoke({'topic': '霸道总裁爱上做保洁的我'})print(resp)

运行:

----------word_count---------232
❌