概述
本章节学习 LangChain 中 Model 组件的核心使用方法,包括基础调用、批处理和流式输出三大技巧。 ps:本来是要调用openai的组件,因为某些原因,暂用月之暗面的api,他们的返回是一致的。
1. LLM与ChatModel基础使用
核心知识点
- ChatPromptTemplate: 用于结构化提示词模板
- .partial(): 预填充部分变量,避免重复传入
- .invoke(): 调用模型并获取完整响应
完整示例
python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import datetime
import dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
dotenv.load_dotenv()
# 1.编排prompt
prompt = ChatPromptTemplate.from_messages([
("system", "你是OpenAI开发的聊天机器人,请回答用户的问题,现在的时间是{now}"),
("human", "{query}"),
]).partial(now=datetime.now())
# 2.创建大语言模型
llm = ChatOpenAI(model="moonshot-v1-8k")
ai_message = llm.invoke(prompt.invoke({"query": "现在是几点,请讲一个程序员的冷笑话"}))
print(ai_message.type)
print(ai_message.content)
print(ai_message.response_metadata)
输出
python
ai
现在是2025年12月31日14:41:10。
讲一个程序员的冷笑话给你听:
为什么程序员总是混淆圣诞节和万圣节?
因为 Oct 31(十月三十一日)看起来像是 Dec 25(十二月二十五日)。
这个笑话的幽默之处在于,程序员习惯于使用月份的缩写和日期来表示日期,而"Oct 31"和"Dec 25"在视觉上有一 定的相似性,但实际上它们分别代表万圣节和圣诞节,这两个节日在文化和庆祝方式上有很大的不同。
{'token_usage': {'completion_tokens': 118, 'prompt_tokens': 52, 'total_tokens': 170, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'moonshot-v1-8k', 'system_fingerprint': None, 'id': 'chatcmpl-6954c58772a78fdd54a4a97a', 'finish_reason': 'stop', 'logprobs': None}
Failed to multipart ingest runs: langsmith.utils.LangSmithAuthError: Authentication failed for https://api.smith.langchain.com/runs/multipart. HTTPError('401 Client Error: Unauthorized for url: https://api.smith.langchain.com/runs/multipart', '{"error":"Unauthorized"}\n')trace=019b7323-9ba0-77e0-ae20-1cd8c15e46bc,id=019b7323-9ba0-77e0-ae20-1cd8c15e46bc; trace=019b7323-9c29-77c1-8bd7-ad9dbe1784ec,id=019b7323-9c29-77c1-8bd7-ad9dbe1784ec
Failed to send compressed multipart ingest: langsmith.utils.LangSmithAuthError: Authentication failed for https://api.smith.langchain.com/runs/multipart. HTTPError('401 Client Error: Unauthorized for url: https://api.smith.langchain.com/runs/multipart', '{"error":"Unauthorized"}\n')trace=019b7323-9c29-77c1-8bd7-ad9dbe1784ec,id=019b7323-9c29-77c1-8bd7-ad9dbe1784ec
返回结果解析
- ai_message.type: 消息类型
- ai_message.content: 模型生成的文本内容
- ai_message.response_metadata: 响应元数据(如token使用情况、模型信息等)
使用技巧
✅ 使用 .partial() 预填充静态变量
- 减少重复传参
- 提高代码可读性
- 适合系统提示词中的固定参数
2. Model批处理 (Batch)
核心知识点
- .batch(): 批量处理多个请求,提高效率
- 适用于需要同时处理多个查询的场景
完整示例
python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import datetime
import dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
dotenv.load_dotenv()
# 1.编排prompt
prompt = ChatPromptTemplate.from_messages([
("system", "你是OpenAI开发的聊天机器人,请回答用户的问题,现在的时间是{now}"),
("human", "{query}"),
]).partial(now=datetime.now())
# 2.创建大语言模型
llm = ChatOpenAI(model="moonshot-v1-8k")
ai_messages = llm.batch([
prompt.invoke({"query": "你好,你是?"}),
prompt.invoke({"query": "请讲一个关于程序员的冷笑话"}),
])
for ai_message in ai_messages:
print(ai_message.content)
print("====================")
markdown
你好!我是Kimi,由月之暗面科技有限公司(Moonshot AI)开发的人工智能助手。我擅长中英文对话,并且能够提供安全、有帮助、准确的回答。如果你有任何问题,无论是日常咨询还是需要信息搜索,我都在这里帮助你。有什 么可以为你服务的吗?
====================
好的,这里有一个关于程序员的冷笑话:
有一天,一个程序员的妻子让他去超市买东西。她给了他一个购物清单,上面写着:"买一袋面包,如果有鸡蛋,买六个。"
程序员回到家,手里提着六袋面包。
妻子问:"为什么买了这么多面包?"
程序员回答:"因为他们有鸡蛋。"
这个笑话的幽默之处在于程序员按照字面意思执行了妻子的指示,而没有理解其中的隐含条件。希望这个冷笑话能 给你带来一点轻松的乐趣!
使用场景
📌 适合批量处理的场景
- 批量问答
- 多文本总结
- 批量翻译
- 并行请求处理
3. Model流式输出 (Streaming)
核心知识点
- .stream(): 流式输出,实时生成内容
- 逐块返回生成结果,改善用户体验
完整示例
python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import datetime
import dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
dotenv.load_dotenv()
# 1.编排prompt
prompt = ChatPromptTemplate.from_messages([
("system", "你是OpenAI开发的聊天机器人,请回答用户的问题,现在的时间是{now}"),
("human", "{query}"),
]).partial(now=datetime.now())
# 2.创建大语言模型
llm = ChatOpenAI(model="moonshot-v1-8k")
response = llm.stream(prompt.invoke({"query": "你能简单介绍下LLM和LLMOps吗?"}))
for chunk in response:
print(chunk.content, flush=True, end="")
使用场景
🌊 适合流式输出的场景
- 聊天对话应用
- 长文本生成
- 实时内容展示
- 需要快速反馈的场景
三种方式对比
| 方式 | 方法 | 适用场景 | 响应方式 |
|---|---|---|---|
| 单次调用 | .invoke() |
简单请求 | 一次性返回全部内容 |
| 批处理 | .batch() |
多个并行请求 | 返回所有结果列表 |
| 流式输出 | .stream() |
长文本/聊天 | 逐块返回生成内容 |