# 2. invoke 方法 - 调用模型(深入详解)
# invoke 是 LangChain 中最核心的方法,用于同步调用 LLM 模型。理解 invoke 是学习 LangChain 的关键。
# 🎯 invoke 方法做什么?
# 简单来说,invoke 方法的作用就是:
# 接收你的输入(问题、指令、对话历史等)
# 发送给 LLM 模型(如 GPT-4, Llama, Claude 等)
# 返回模型的响应(文本回复 + 元数据信息)
# 流程图:
# 你的输入 → invoke() → LLM 模型 → 响应 → 返回给你
# 基本语法
# response = model.invoke(input, config=None)
from init_model import get_chat_model
import init_model
# 获取模型实例
chat_model = get_chat_model()
# 格式 1:纯字符串(最简单,适合单次问答)
def example1():
response = chat_model.invoke("什么是机器学习?用一句话解释")
print(response.content)
# 机器学习是一种让计算机通过分析数据自动学习规律,从而在没有显式编程的情况下实现预测或决策的技 术。
# 格式 2:字典列表(推荐,最灵活)
# 使用场景: 需要设置系统角色、多轮对话、精确控制对话流程
def example2():
messages = [
{
"role": "system",
"content": "你是一个专业的 Python 编程导师。回答要简洁、准确,并提供代码示例。",
},
{"role": "user", "content": "什么是 Python 列表推导式?"},
]
response = chat_model.invoke(messages)
print(response.content)
# 完整示例 2:多轮对话(带历史)
def example2_1():
# 第一轮对话
messages = [
{"role": "system", "content": "你是一个友好的助手"},
{"role": "user", "content": "我叫小明"},
]
response1 = chat_model.invoke(messages)
print(response1.content)
# 第二轮对话 - 添加历史
messages.append({"role": "assistant", "content": response1.content})
messages.append({"role": "user", "content": "我刚才说我叫什么?"})
response2 = chat_model.invoke(messages)
print(response2.content)
# 你好呀,小明!👋 很高兴认识你~
# 我是你的友好助手,以后有什么事情都可以随时找我 哦。无论是查资料、写东西,还是随便聊聊,我都在 这儿呢!😄
# 今天有什么想聊的,或者需要我帮忙的吗?
# 你叫**小明**呀!😄
# 就在我们刚开始聊天的时候,你亲口告诉我的~ 我可一直记着呢!
# 完整示例 3:构建完整对话
def example2_2():
messages = [
{
"role": "system",
"content": "你是一个专业的 Python 编程导师。回答要简洁、准确,并提供代码示例。",
}
]
# 用户提问 1
messages.append({"role": "user", "content": "什么是列表?请简单告诉我"})
response1 = chat_model.invoke(messages)
messages.append({"role": "assistant", "content": response1.content})
# 用户提问 2(基于上下文)
messages.append({"role": "user", "content": "它和元组有什么区别?"})
response2 = chat_model.invoke(messages)
print(f"AI: {response2.content}")
print(f"\n完整对话历史: {messages}")
# 注意:messages 列表会持续更新,每次调用后都包含最新的对话历史。
# 你可以根据需要随时调用 invoke 方法,每次调用都将基于当前的 messages 列表。
# 例如,你可以在循环中连续调用 invoke,每次都添加新的用户问题和模型回复。
# ✅ 最灵活,完全控制
# ✅ 可以设置系统提示
# ✅ 支持多轮对话
# ✅ 与 OpenAI API 格式一致
# ✅ JSON 兼容,易于存储和传输
# 格式 3:消息对象列表(类型安全,但较繁琐)
# 消息类 对应字典格式 作用
# SystemMessage {"role": "system", ...} 系统提示
# HumanMessage {"role": "user", ...} 用户输入
# AIMessage {"role": "assistant", ...} AI 回复
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
def example3():
messages = [
SystemMessage(content="你是一个 Python 专家"),
HumanMessage(content="什么是生成器?请一句话说明"),
]
response = chat_model.invoke(messages)
print(response.content)
# # 继续对话
messages.append(AIMessage(content=response.content))
messages.append(HumanMessage(content="能给个例子吗?"))
response = chat_model.invoke(messages)
print(response.content)
# invoke 返回值详解
# 返回对象结构:
# response = chat_model.invoke("Hello")
# # 1. 主要内容
# response.content # str - AI 的回复文本
# response.response_metadata # dict - 响应元数据
# response.id # str - 消息唯一 ID
# response.usage_metadata # dict - Token 使用情况
# response.additional_kwargs # dict - 其他额外信息
# 完整示例:访问所有信息
def example4():
response = chat_model.invoke("用一句话解释什么是 AI")
# 1. 获取回复内容
print("AI 回复:", response.content)
# 2. 获取模型信息
metadata = response.response_metadata
print(f"使用的模型: {metadata['model_name']}")
print(f"结束原因: {metadata['finish_reason']}")
# 3. 获取 Token 使用情况
usage = metadata.get("token_usage", {})
print(f"提示 tokens: {usage.get('prompt_tokens')}")
print(f"完成 tokens: {usage.get('completion_tokens')}")
print(f"总计 tokens: {usage.get('total_tokens')}")
# 4. 获取消息 ID
print(f"消息 ID: {response.id}")
# response_metadata 完整结构:
# {
# 'model_name': 'llama-3.3-70b-versatile', # 使用的模型
# 'system_fingerprint': 'fp_4cfc2deea6', # 系统指纹
# 'finish_reason': 'stop', # 结束原因:stop/length/error
# 'model_provider': 'groq', # 模型提供商
# 'token_usage': { # Token 使用统计
# 'prompt_tokens': 15, # 输入 tokens
# 'completion_tokens': 25, # 输出 tokens
# 'total_tokens': 40, # 总计 tokens
# 'prompt_time': 0.002, # 输入处理时间(秒)
# 'completion_time': 0.23 # 输出生成时间(秒)
# }
# }
# config 参数(高级用法)
# config = {
# "callbacks": [callback_handler], # 回调函数
# "tags": ["test", "development"], # 标签(用于追踪)
# "metadata": {"user_id": "123"}, # 元数据
# "run_name": "my_query", # 运行名称
# }
# response = init_model.invoke(messages, config=config)