tags:/n - langchain

  • 模型调用
  • Prompt
  • LLM
  • 面试
    aliases:/n - Model IO
  • 模型输入输出

02 Model I/O 与模型调用

Model I/O 是与语言模型交互的核心组件:输入提示(Prompt)→ 调用模型(Model)→ 输出解析(Parser)

一、调用在线模型

1.1 LangChain 统一调用

"""
LangChain 调用在线模型

运行方式:python 02_LangChain调用模型.py
"""
from dotenv import load_dotenv
import os
from langchain_openai import ChatOpenAI

load_dotenv()

# 创建 LLM 实例
llm = ChatOpenAI(
    model="qwen-turbo",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
)

# 调用模型
resp = llm.invoke("你好")
print(type(resp))   # <class 'langchain_core.messages.ai.AIMessage'>
print(resp.content)

1.2 消息类型

类型 说明 示例
SystemMessage 系统指令 设置角色、行为规范
HumanMessage 用户消息 用户的输入
AIMessage AI 回复 模型的输出
ToolMessage 工具结果 工具调用的返回值
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage

# 方式1:消息对象列表
resp = llm.invoke([
    SystemMessage(content="你是一个专业的数学助手"),
    HumanMessage(content="你好,你是谁"),
])

# 方式2:元组列表(简洁写法)
resp = llm.invoke([("system", "你是一个专业的数学助手"), ("user", "你好")])

# 方式3:字典列表
resp = llm.invoke([{"role": "system", "content": "你是一个专业的数学助手"}, {"role": "user", "content": "你好"}])

1.3 调用方式

方式 方法 说明
同步调用 llm.invoke() 阻塞等待结果
异步调用 await llm.ainvoke() 非阻塞,适合高并发
流式调用 llm.stream() 打字机效果,逐 token 输出
批次调用 llm.batch() 并行多个请求
"""
流式调用演示

运行方式:python 02_流式调用.py
"""
# 流式调用
response = llm.stream(input=[("user", "什么是LangChain")])
for chunk in response:
    print(chunk.content, end="", flush=True)
print()

# 批次调用
response = llm.batch([
    [("user", "什么是LangChain")],
    ("user", "LangChain的核心价值是什么?"),
])
for resp in response:
    print(resp.content)
    print("-" * 50)

二、调用本地模型(Ollama)

"""
LangChain 调用本地 Ollama 模型

运行方式:python 02_Ollama调用.py
前提:已安装 Ollama 并下载了 qwen3:8b
"""
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="qwen3:8b",
    base_url="http://localhost:11434/v1",
    api_key="ollama",
)

resp = llm.invoke("你好")
print(resp.content)

三、模型调用结果解析

3.1 JSON 输出

"""
JsonOutputParser 演示

运行方式:python 02_JSON解析.py
"""
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import JsonOutputParser
from pydantic import BaseModel, Field

llm = ChatOpenAI(model="qwen-plus", base_url="...", api_key="...")

class Prime(BaseModel):
    prime: list[int] = Field(description="素数列表")
    count: list[int] = Field(description="小于该素数的素数个数")

json_parser = JsonOutputParser(pydantic_object=Prime)

res = llm.invoke([
    ("system", json_parser.get_format_instructions()),
    ("user", "任意生成2个1-10之间的素数"),
])

parsed_res = json_parser.invoke(res)
print(type(parsed_res))  # <class 'dict'>
print(parsed_res)

3.2 结构化输出(推荐)

"""
LangChain 结构化输出

运行方式:python 02_结构化输出.py
"""
from langchain_openai import ChatOpenAI
from pydantic import BaseModel

llm = ChatOpenAI(model="qwen-turbo", base_url="...", api_key="...")

class CalendarEvent(BaseModel):
    name: str
    date: str
    participants: list[str]

# 开启结构化输出
new_llm = llm.with_structured_output(schema=CalendarEvent)

res = new_llm.invoke("Alice and Bob are going to a science fair on Friday.")
print(res)
print(type(res))  # <class '__main__.CalendarEvent'>
print(f"事件: {res.name}, 日期: {res.date}")

3.3 常用 Output Parser

Parser 说明 输出类型
StrOutputParser 字符串输出 str
JsonOutputParser JSON 输出 dict
PydanticOutputParser Pydantic 对象 BaseModel
CommaSeparatedListOutputParser 逗号分隔列表 list

相关笔记

[[01-LangChain概述]] · [[03-提示词模板与Chains]] · [[04-RAG检索增强]] · [[05-Agents智能体]]

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐