本系列主要使用langchain/langgraph进行学习与实践

langchain提供的LLM接口

以OpenAI为例,其它大模型如Gemini均类似

  • ChatOpenAI: OpenAI 聊天模型。
  • AzureChatOpenAI: 托管在 Azure 上的 OpenAI 聊天模型的包装器。
  • OpenAI: (传统) OpenAI 文本补全模型。
  • AzureOpenAI: 托管在 Azure 上的 (传统) OpenAI 文本补全模型的包装器。
  • OpenAIEmbeddings: OpenAI 嵌入模型。
  • AzureOpenAIEmbeddings: 托管在 Azure 上的 OpenAI 嵌入模型的包装器。

分两个维度解释:

  1. 模型类型维度:
    「聊天模型(Chat)」:专为对话 / 多轮交互设计(如 GPT-3.5/4o),输入是「消息列表(角色 + 内容)」,输出是「结构化聊天响应」;
    「文本补全模型(Completion)」:传统 OpenAI 模型(如 davinci-003),输入是「纯文本提示词」,输出是「文本续写」;
    「嵌入模型(Embeddings)」:将文本转为数值向量(Embedding),用于语义检索、相似度计算等。
  2. 部署环境维度:
    「原生 OpenAI」:直接调用 OpenAI 官方公有 API(需科学上网,数据走 OpenAI 服务器);
    「Azure OpenAI」:调用微软 Azure 云托管的 OpenAI 模型(国内可访问,合规性更高,企业级部署首选)。

模型用法

  1. 与代理一起使用 - 创建代理时可动态指定模型。
  2. 独立使用 - 模型可直接调用(在代理循环之外),用于文本生成、分类或提取等任务,而无需代理框架。

独立使用

import os
from langchain.chat_models import init_chat_model

os.environ["OPENAI_API_KEY"] = "sk-..."
model = init_chat_model("openai:gpt-4.1")  # 入参指定模型,可以不是openai
import os
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = "sk-..."
model = ChatOpenAI(model="gpt-4.1")  # 直接使用ChatOpenAI

代理

agents基于llm创建

from langchain.agents import create_agent

agent = create_agent(
    model,
    tools=tools
)

模型的使用

调用方法

方法说明
Invoke模型接受消息作为输入,并在生成完整响应后输出消息。
Stream调用模型,但实时流式传输生成的输出。
Batch将多个请求批量发送给模型,以实现更高效的处理。

调用时的入参有两种选择,第一种是直接使用字符串输入单个消息;第二种是传入消息列表,通常是传入对话历史,方便模型学习并给出更准确的答案:

# 1. 单个消息
response = model.invoke("为什么鹦鹉会说话?")

# 2. 消息列表
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage

conversation = [
    SystemMessage("你是一个将英语翻译成法语的有用助手。"),
    HumanMessage("翻译:我喜欢编程。"),
    AIMessage("J'adore la programmation。"),
    HumanMessage("翻译:我喜欢构建应用程序。")
]

response = model.invoke(conversation)
print(response)  # AIMessage("J'adore créer des applications。")

流式传输——stream

当问题复杂或者回复较长时通过逐步显示输出,流式传输显著改善了用户体验。
调用 stream() 返回一个迭代器,它在生成时逐块产生输出。您可以使用循环实时处理每个块:

full = None  # None | AIMessageChunk
for chunk in model.stream("天空是什么颜色?"):
    full = chunk if full is None else full + chunk
    print(full.text)

# 天空
# 天空是
# 天空通常
# 天空通常是蓝色
# ...

print(full.content_blocks)
# [{"type": "text", "text": "天空通常是蓝色..."}]

工具

工具通常是自行开发的函数,用于实现某些特定功能,这里只简单介绍绑定工具的方式、调用方式。
通常使用装饰器@tool,定义工具,再利用函数bind_tools绑定工具。
其中,函数注释的内容需要尽可能明确精炼,方便模型理解函数的功能并合理的调用。

from langchain.tools import tool

@tool
def get_weather(location: str) -> str:
    """获取某个位置的天气。"""
    return f"{location} 天气晴朗。"

model_with_tools = model.bind_tools([get_weather], tool_choice=‘any’)  # tool_choice也可以是某个函数名,用于强制调用某个工具

response = model_with_tools.invoke("波士顿的天气怎么样?")
for tool_call in response.tool_calls:
    # 查看模型发出的工具调用
    print(f"工具:{tool_call['name']}")
    print(f"参数:{tool_call['args']}")

如果不使用agent的情况下,需要使用执行循环把工具的结果给LLM才能得到最后的结果。

# 将(可能多个)工具绑定到模型
model_with_tools = model.bind_tools([get_weather])

# 步骤 1:模型生成工具调用
messages = [{"role": "user", "content": "波士顿的天气怎么样?"}]
ai_msg = model_with_tools.invoke(messages)
messages.append(ai_msg)

# 步骤 2:执行工具并收集结果
for tool_call in ai_msg.tool_calls:
    # 使用生成的参数执行工具
    tool_result = get_weather.invoke(tool_call)
    messages.append(tool_result)

# 步骤 3:将结果传递回模型以获取最终响应
final_response = model_with_tools.invoke(messages)
print(final_response.text)
# "波士顿当前天气为 72°F,晴朗。"

消息

消息包含以下几种类型

消息对象消息类型含义
SystemMessage系统消息告诉模型如何行为并为交互提供上下文
HumanMessage人类消息表示用户输入和与模型的交互
AIMessageAI 消息模型生成的响应,包括文本内容、工具调用和元数据
ToolMessage工具消息表示工具调用的输出

下面的例子均来自使用代理进行交互过程中产生的输出。

HumanMessage

表示用户输入和交互。它们可以包含文本、图像、音频、文件以及任何其他多模态内容。

HumanMessage(
         content='查询机台M101的生产状态',
         additional_kwargs={},
         response_metadata={},
         id='f4d50d20-a3dd-463d-bb9c-468d377b236f'  # 唯一标识
         )

AIMessage

AIMessage(
         content='',
         additional_kwargs={'refusal': None},
         response_metadata={'token_usage': {'completion_tokens': 28, 'prompt_tokens': 353, 'total_tokens': 381,
                                            'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0},
                                            'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}},
                            'model_provider': 'openai',
                            'model_name': 'gpt-5-mini-2025-08-07',
                            'system_fingerprint': None,
                            'id': 'chatcmpl-DEtqgQ1jnlEkpN8TSfv5ss760nNKX',
                            'finish_reason': 'tool_calls',
                            'logprobs': None
        },
         id='lc_run--019caddf-b465-7eb2-82b9-7a8b0dcc65ce-0',
         tool_calls=[
            {'name': 'MachineStatusQuery',
             'args': {'machine_id': 'M101'},
             'id': 'call_DihaYfDLoTXBWXomO2tbhgXZ',
             'type': 'tool_call'
            }
        ],
         invalid_tool_calls=[],
         usage_metadata={'input_tokens': 353, 'output_tokens': 28, 'total_tokens': 381, 'input_token_details': {'audio': 0, 'cache_read': 0
            }, 'output_token_details': {'audio': 0, 'reasoning': 0
            }
        })
键名核心含义
contentAI 生成的文本回答内容(此处为空,因为 AI 选择调用工具而非直接生成文字回答)
additional_kwargs额外的关键字参数(存储 LLM 原生返回的非核心元数据,如拒绝回答标记等)
response_metadata响应元数据(存储 LLM 调用的核心信息:token 用量、模型名称、请求 ID、结束原因等)
idLangChain 给这条消息分配的唯一标识(用于追踪消息上下文)
tool_callsAI 决定调用的工具列表(此处是调用「MachineStatusQuery」工具,传参「machine_id: M101」)
invalid_tool_calls无效的工具调用列表(此处为空,表示没有错误的工具调用)
usage_metadata简化版的 token 用量统计(输入 / 输出 / 总 token 数,便于快速查看消耗)

ToolMessage

ToolMessage(
        content='机台M101状态:运行,当前生产模具:模具A,良品率:98.5%',
        name='MachineStatusQuery',
        id='85e3666b-6e7a-4cd3-ba1e-1dfa1ef0d4a8',
        tool_call_id='call_DihaYfDLoTXBWXomO2tbhgXZ')
键名核心含义
content工具调用后返回的实际业务数据(此处是机台 M101 的生产状态、模具、良品率等核心信息)
name对应的工具名称(此处是「MachineStatusQuery」,和之前 AIMessage 中调用的工具名一一对应)
idLangChain 给这条工具结果消息分配的唯一标识(用于消息追踪)
tool_call_id关联的工具调用 ID(和 AIMessage 中 tool_calls 里的 id 一致,用于绑定「工具调用请求」和「工具返回结果」)

参考文献:https://langchain-doc.cn/v1/python/langchain

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐