Hello LangChain-invoke.py

# 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)
添加新评论