langchain学习总结-Model组件及使用技巧

概述

本章节学习 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() 长文本/聊天 逐块返回生成内容
相关推荐
心在飞扬2 小时前
langchain学习总结-OutputParser组件及使用技巧
前端·后端
Penge6662 小时前
ClickHouse 向量化执行:为什么能让查询快几十倍?
后端
心在飞扬2 小时前
langchain学习总结-两个Runnable核心类的讲解与使用
前端·后端
大橘喵喵重2 小时前
FastAPI 实现国际化(i18n)和多语言支持的完整方案
后端
少莫千华2 小时前
【Web API】RESTful API接口规范
前端·后端·json·api·restful·rest
用户2345267009822 小时前
AI会不会悄悄把漏洞甚至后门写进你的代码里
后端·ai编程
实习生小黄2 小时前
NestJS 调试方案
后端·nestjs
嘻哈baby2 小时前
rsync文件同步:从备份到迁移的瑞士军刀
后端
Java水解2 小时前
Spring Boot Starter自定义开发 构建企业级组件库
spring boot·后端