AIAgent学习记录——模型
·
本系列主要使用langchain/langgraph进行学习与实践
langchain提供的LLM接口
以OpenAI为例,其它大模型如Gemini均类似
- ChatOpenAI: OpenAI 聊天模型。
- AzureChatOpenAI: 托管在 Azure 上的 OpenAI 聊天模型的包装器。
- OpenAI: (传统) OpenAI 文本补全模型。
- AzureOpenAI: 托管在 Azure 上的 (传统) OpenAI 文本补全模型的包装器。
- OpenAIEmbeddings: OpenAI 嵌入模型。
- AzureOpenAIEmbeddings: 托管在 Azure 上的 OpenAI 嵌入模型的包装器。
分两个维度解释:
- 模型类型维度:
「聊天模型(Chat)」:专为对话 / 多轮交互设计(如 GPT-3.5/4o),输入是「消息列表(角色 + 内容)」,输出是「结构化聊天响应」;
「文本补全模型(Completion)」:传统 OpenAI 模型(如 davinci-003),输入是「纯文本提示词」,输出是「文本续写」;
「嵌入模型(Embeddings)」:将文本转为数值向量(Embedding),用于语义检索、相似度计算等。 - 部署环境维度:
「原生 OpenAI」:直接调用 OpenAI 官方公有 API(需科学上网,数据走 OpenAI 服务器);
「Azure OpenAI」:调用微软 Azure 云托管的 OpenAI 模型(国内可访问,合规性更高,企业级部署首选)。
模型用法
- 与代理一起使用 - 创建代理时可动态指定模型。
- 独立使用 - 模型可直接调用(在代理循环之外),用于文本生成、分类或提取等任务,而无需代理框架。
独立使用
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 | 人类消息 | 表示用户输入和与模型的交互 |
| AIMessage | AI 消息 | 模型生成的响应,包括文本内容、工具调用和元数据 |
| 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
}
})
| 键名 | 核心含义 |
|---|---|
| content | AI 生成的文本回答内容(此处为空,因为 AI 选择调用工具而非直接生成文字回答) |
| additional_kwargs | 额外的关键字参数(存储 LLM 原生返回的非核心元数据,如拒绝回答标记等) |
| response_metadata | 响应元数据(存储 LLM 调用的核心信息:token 用量、模型名称、请求 ID、结束原因等) |
| id | LangChain 给这条消息分配的唯一标识(用于追踪消息上下文) |
| tool_calls | AI 决定调用的工具列表(此处是调用「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 中调用的工具名一一对应) |
| id | LangChain 给这条工具结果消息分配的唯一标识(用于消息追踪) |
| tool_call_id | 关联的工具调用 ID(和 AIMessage 中 tool_calls 里的 id 一致,用于绑定「工具调用请求」和「工具返回结果」) |
参考文献:https://langchain-doc.cn/v1/python/langchain
更多推荐


所有评论(0)