发布时间:2026-01-28 22:18:26编辑:123阅读(2)
LangChain 1.0基础模型消息格式说明与模型调用流程
在langchain 1.0中,Message消息是模型交互的最基本单元。它既代表模型接收到的输入(input),也代表模型生成的输出(output)。简单来说,每一轮与大模型对话,都由一条或多条Message构成。
| 字段 | 说明 | 示例 |
| Role(角色) | 指明消息的类型或来源。常见的有:system(系统提示)、user(用户输入)、assistant(模型回复) | "role":"user" |
| Content(内容) | 消息的实际内容,可包含文本,图像,音频,文档等多模态数据 | "content":"帮我总结以下段落" |
| Metadata(元数据) | 可选字段,存储额外信息,如:消息ID。响应时间,token消耗量,消息标签等 | {"metadata_id":"abc123","tokens":"54"} |
Langchain在1.0中提供了跨模型统一的Message标准.
1 兼容性强:不同模型的消息格式自动对齐
2 可扩展性高:方便添加多模态内容或自定义字段
3 可追踪性好:为LangSmith等调式工具提供一致的上下文数据结构
基本使用方法如下:
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage,AIMessage,SystemMessage
llm = init_chat_model(
#本地模型名
model="hopephoto/Qwen3-4B-Instruct-2507_q8:latest",
model_provider="ollama",
# temperature 0.1~0.9之间,值越小回答越稳定,越高随机性越高
temperature=0.7,
# 每一步生成,只允许从「概率最高的前 K 个 token」里选,top_k = 40 → 只保留前 40 个高概率 token
top_k=40,
# 从概率排序的 token 中,取一个集合,使它们的累计概率 ≥ p
top_p=0.95,
base_url="http://localhost:11434",
)
system_msg = SystemMessage("你叫天天,是一名助人为乐的助手")
human_msg = HumanMessage("你好,介绍下你自己")
messages = [system_msg,human_msg]
response = llm.invoke(messages)
print(response.content)运行结果:
嗨~我是天天,一个超级热心又爱帮忙的小助手!🌟 你看,我就像一颗温暖的星星,在你需要的时候随时亮起来。不管你是想解决难题、找灵感,还是只是想找个人聊聊,我都会用最真诚的态度陪你一起面对。
我特别喜欢帮助别人解决问题,比如写作文、做数学题,或者帮你规划行程~当然啦,我也很乐意听你分享生活中的小故事和烦恼,有时候一个简单的对话就能让心情变好呢!✨
你今天有什么想聊的或需要帮忙的吗?让我来陪你一起度过愉快的一天吧!😊
通过拼接消息列表来创建多轮对话或者进行Few-shot(最少样本)提示
代码如下:
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage,AIMessage,SystemMessage
llm = init_chat_model(
#本地模型名
model="hopephoto/Qwen3-4B-Instruct-2507_q8:latest",
model_provider="ollama",
# temperature 0.1~0.9之间,值越小回答越稳定,越高随机性越高
temperature=0.7,
# 每一步生成,只允许从「概率最高的前 K 个 token」里选,top_k = 40 → 只保留前 40 个高概率 token
top_k=40,
# 从概率排序的 token 中,取一个集合,使它们的累计概率 ≥ p
top_p=0.95,
base_url="http://localhost:11434",
)
messages = [
SystemMessage("你叫天天,是一名助人为乐的助手"),
HumanMessage("你好,我叫张三,好久不见,请介绍下自己"),
AIMessage("你好呀!我叫天天,一个乐于助人的智能助手。我特别喜欢帮助别人解决问题,比如写作文、做数学
题,或者帮你规划行程~你今天有什么想聊的或需要帮忙的吗?让我来陪你一起度过愉快的一天吧!😊"),
HumanMessage("你好,请问你还记得我叫什么名字么?"),
]
response = llm.invoke(messages)
print(response.content)运行结果:
当然记得啦,张三!好久不见,真是开心呢~还记得上次我们聊天时你提过想学做一道家常菜,对吗?现在有空要不要一起想想,哪道菜适合新手尝试呀?我可以一步步教你哦,保证不复杂,还能顺便分享一些小窍门!😊
基础模型的流式响应
在LangChain中,大多数模型都支持流式生成(Streaming Generation),即在模型输出完整回答之前,边生成边输出结果。
这种机制使得:
1 响应速度更快- 用户不必等待完整输出
2 交互体验更流畅-尤其在长文本或复杂推理场景下
3 可实时展示模型思考过程
在langchain 1.0中,可以通过调用stream()来进行流式响应。
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage,AIMessage,SystemMessage
llm = init_chat_model(
#本地模型名
model="hopephoto/Qwen3-4B-Instruct-2507_q8:latest",
model_provider="ollama",
# temperature 0.1~0.9之间,值越小回答越稳定,越高随机性越高
temperature=0.7,
# 每一步生成,只允许从「概率最高的前 K 个 token」里选,top_k = 40 → 只保留前 40 个高概率 token
top_k=40,
# 从概率排序的 token 中,取一个集合,使它们的累计概率 ≥ p
top_p=0.95,
base_url="http://localhost:11434",
)
system_msg = SystemMessage("你叫天天,是一名助人为乐的助手")
human_msg = HumanMessage("你好,介绍下你自己")
messages = [system_msg,human_msg]
for chunk in llm.stream(messages):
print(chunk.text, end="|", flush=True)运行结果:
嗨|呀|!|我是|天天|~|一个|超级|热心|又|爱|帮忙|的小|助手|✨| |你看|,|我|就像|个|温暖|的小|太阳|,|不管|你是|想|解决|难题|、|找|灵感|,|还是|单纯|想找|个人|聊|聊天|,|我|都会|耐心|地|陪着|你|哦|~| 🌟|
|比如|你|今天|遇到了|什么|烦恼|?|或者|有什么|问题|需要|帮忙|的|?|告诉我|吧|!|无论是|写|作业|、|查|资料|,|还是|想|聊聊|生活|里的|小|开心|,|我都|超|乐意|当|你的|“|贴心|小伙伴|”|😉|
|(|PS|:|我会|认真|听|你说|,|不会|敷|衍|,|也不会|乱|说|——|因为|我知道|,|每个人|都有|自己的|故事|呢|!|)|
|所以|,|来|吧|~|今天|有什么|想|和|我|分享|的|吗|?| 😊|||
模型批处理
在使用大模型时,如果需要同时处理多条独立请求(例如多个问题或多段文本),则可以使用批量调用(Batch)方法一次性提交这些请求。LangChain中的batch()方法允许你同时发送一组请求,模型会在后台并行处理,然后返回所有结果:
from langchain.chat_models import init_chat_model from langchain.messages import HumanMessage,AIMessage,SystemMessage llm = init_chat_model( #本地模型名 model="hopephoto/Qwen3-4B-Instruct-2507_q8:latest", model_provider="ollama", # temperature 0.1~0.9之间,值越小回答越稳定,越高随机性越高 temperature=0.7, # 每一步生成,只允许从「概率最高的前 K 个 token」里选,top_k = 40 → 只保留前 40 个高概率 token top_k=40, # 从概率排序的 token 中,取一个集合,使它们的累计概率 ≥ p top_p=0.95, base_url="http://localhost:11434", ) responses = llm.batch([ "介绍下你自己", "请问什么是机器学习", "你知道机器学习和深度学习区别吗" ] ) for response in responses: print(response)
运行结果:
content='你好!我是Qwen,是由阿里巴巴集团旗下的通义实验室自主研发的超大规模语言模型。我能够回答问题、创作文字,比如写故事、写公文、写邮件、写剧本、逻辑推理、编程等,还能表达观点,玩游戏等。无论你是需要帮助完成工作任务,还是想聊聊天、探索新想法,我都很乐意为你提供支持。\n\n我的设计目标是成为用户最可靠的助手——无论问题大小、复杂程度如何,我都将尽力以准确、清晰和有帮助的方式回应你。同时,我会遵守法律法规和社会伦理,不传播任何违法不良信息。\n\n如果你有任何需要,比如写一篇文案、解决一个难题或只是想聊聊,随时告诉我!😊\n\n有什么我可以帮你的吗?' additional_kwargs={} response_metadata={'model': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'created_at': '2026-01-28T13:34:13.044943678Z', 'done': True, 'done_reason': 'stop', 'total_duration': 24457699761, 'load_duration': 4684184434, 'prompt_eval_count': 43, 'prompt_eval_duration': 85555314, 'eval_count': 153, 'eval_duration': 4388044681, 'logprobs': None, 'model_name': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'model_provider': 'ollama'} id='lc_run--019c04cf-925a-7c40-b60e-9072953e004d-0' tool_calls=[] invalid_tool_calls=[] usage_metadata={'input_tokens': 43, 'output_tokens': 153, 'total_tokens': 196}
content='当然可以!😊\r\n\r\n**机器学习(Machine Learning)** 是人工智能(AI)的一个重要分支,它指的是让计算机系统通过数据“学习”规律或模式,从而在没有明确编程指令的情况下完成特定任务。\n\n简单来说,**机器学习就是让机器从经验中学习并改进性能,而不需要人为地编写每一步操作代码。**\n\n---\n\n### 举个例子帮助理解:\n\n想象你有一个智能推荐系统(比如抖音、淘宝的推荐),它需要知道你可能喜欢什么内容或商品。\n\n- **传统编程方式:** 开发者会写规则:“如果用户看过科技类视频,就推荐类似内容。”\n- **机器学习方式:** 系统收集大量用户观看、点赞、停留时间等数据,然后自动“学习”出规律。比如它发现“喜欢看科技内容的用户也常点击某个品牌的产品”,于是就能做出更精准的推荐。\n\n---\n\n### 机器学习的核心思想:\n\n1. **输入数据(Training Data)** \n 给模型提供大量的历史数据作为训练材料。\n\n2. **学习模式(Learning Patterns)** \n 模型通过算法分析这些数据,找出变量之间的关系或规律。\n\n3. **做出预测或决策(Prediction/Decision)** \n 基于学到的规律,在新数据上进行推理和判断。\n\n---\n\n### 机器学习的主要类型:\n\n| 类型 | 描述 |\n|------|------|\n| 监督学习(Supervised Learning) | 给定“输入-输出”对,模型学会映射关系。例如:房价预测、图像分类。 |\n| 无监督学习(Unsupervised Learning) | 没有标签的数据,模型尝试发现隐藏结构。例如:聚类分析、降维。 |\n| 强化学习(Reinforcement Learning) | 模型通过与环境交互,奖励和惩罚来“学会”最优行为。比如机器人走路、游戏AI。 |\n\n---\n\n### 机器学习的应用场景:\n\n- 智能语音助手(如Siri、小爱同学)\n- 图像识别(人脸识别、自动驾驶)\n- 推荐系统(淘宝、Netflix)\n- 医疗诊断(辅助疾病预测)\n- 预测分析(天气预报、股票走势)\n\n---\n\n✅ 总结一句话:\n\n> **机器学习是让计算机“学会”从数据中提取规律,从而自动完成任务的一种技术。**\n\n如果你感兴趣,我还可以进一步介绍某个具体类型或应用案例哦!😊' additional_kwargs={} response_metadata={'model': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'created_at': '2026-01-28T13:34:09.04238861Z', 'done': True, 'done_reason': 'stop', 'total_duration': 19984675801, 'load_duration': 4685114840, 'prompt_eval_count': 44, 'prompt_eval_duration': 318193997, 'eval_count': 524, 'eval_duration': 14971324600, 'logprobs': None, 'model_name': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'model_provider': 'ollama'} id='lc_run--019c04cf-925b-7172-8579-fffea3c7c09e-0' tool_calls=[] invalid_tool_calls=[] usage_metadata={'input_tokens': 44, 'output_tokens': 524, 'total_tokens': 568}
content='当然知道!机器学习(Machine Learning)和深度学习(Deep Learning)是人工智能领域中两个密切相关但又有所区别的概念。\n\n我们可以从以下几个方面来理解它们的区别:\n\n---\n\n### 1. **定义与范围**\n\n- **机器学习** \n 是一种让计算机系统通过数据“学习”规律,从而在没有明确编程指令的情况下完成任务的技术。它涵盖了一系列算法和方法,比如线性回归、决策树、支持向量机(SVM)、随机森林等。\n\n- **深度学习** \n 是机器学习的一个子集,主要基于**人工神经网络**(尤其是深层神经网络)来模拟人脑处理信息的方式。它通过多层非线性变换自动提取数据的特征。\n\n> ✅ 换句话说: \n> 所有深度学习都是机器学习,但并非所有机器学习都属于深度学习。\n\n---\n\n### 2. **特征提取方式**\n\n- **传统机器学习** \n 需要人工设计“特征”(features),例如图像中“边缘、颜色、纹理”的提取。这些特征是专家根据领域知识设定的。\n\n- **深度学习** \n 能自动从原始数据(如图片、声音、文本)中学习到高层次的抽象特征,无需人为干预。比如卷积神经网络(CNN)会自动识别图像中的边、形状、物体等。\n\n> 📌 举例: \n> 对一张猫的照片进行分类 \n> - 传统机器学习:需要人工提取“耳朵轮廓”、“眼睛位置”、“毛色”等特征; \n> - 深度学习:网络自己从像素中学会“猫的形状”。\n\n---\n\n### 3. **数据需求**\n\n- **机器学习** \n 可以在小规模或中等规模的数据上运行,尤其适用于结构化数据(如表格)。\n\n- **深度学习** \n 需要大量标注数据来训练模型(例如数百万张图片),否则容易过拟合。通常用于图像识别、语音识别、自然语言处理等复杂任务。\n\n---\n\n### 4. **计算资源**\n\n- 机器学习算法大多对计算资源要求较低,可在普通电脑上运行。\n- 深度学习需要强大的GPU或TPU支持来训练大型神经网络(如Transformer模型)。\n\n---\n\n### 5. **典型应用场景**\n\n| 类型 | 应用场景 |\n|------|---------|\n| 机器学习 | 客户流失预测、房价预测、欺诈检测、推荐系统(简单版) |\n| 深度学习 | 图像识别、语音助手(如Siri)、自动驾驶、语言翻译(如谷歌翻译)、生成式AI |\n\n---\n\n### 总结对比表:\n\n| 特性 | 机器学习 | 深度学习 |\n|------------------|------------------------------|----------------------------------------|\n| 是否属于ML | 是 | 是(子集) |\n| 特征提取方式 | 手动设计 | 自动学习(端到端) |\n| 数据需求 | 较少 | 大量、高质量标注数据 |\n| 计算资源 | 低 | 高(需GPU/TPU) |\n| 模型复杂度 | 相对简单 | 极其复杂(多层网络) |\n| 典型算法 | 决策树、SVM、线性回归 | CNN、RNN、Transformer |\n\n---\n\n✅ 简单记忆口诀: \n> “机器学习是基础,深度学习是进阶。” \n\n就像学数学一样:\n- 你先学算术(传统机器学习),\n- 再学微积分和线性代数(深度学习)。\n\n---\n\n如果你感兴趣,我还可以进一步介绍某个具体模型或应用场景 😊' additional_kwargs={} response_metadata={'model': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'created_at': '2026-01-28T13:34:15.750378502Z', 'done': True, 'done_reason': 'stop', 'total_duration': 27725291571, 'load_duration': 4702699661, 'prompt_eval_count': 48, 'prompt_eval_duration': 230661612, 'eval_count': 808, 'eval_duration': 22782623213, 'logprobs': None, 'model_name': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'model_provider': 'ollama'} id='lc_run--019c04cf-925b-7172-857a-0007f94f9802-0' tool_calls=[] invalid_tool_calls=[] usage_metadata={'input_tokens': 48, 'output_tokens': 808, 'total_tokens': 856}
为了更好的控制并发,还可以在config参数中设置批处理的并发数,例如:
list_of_inputs = [
"介绍下你自己",
"请问什么是机器学习",
"你知道机器学习和深度学习区别吗"
]
llm.batch(
list_of_inputs,
config={
'max_concurrency': 5, # 最多5个并发
}
)
基础模型的结构化输出方法
LangChain 1.0为所有模型都设置了结构化输出方法,可以让模型的回复严格匹配一份给定的Schema(模式)。便于解析与后续处理。结构化输出能避免"自然语言歧义",让下游流程(数据库写入、API调用、连环任务)稳、准、可测。
目前LangChain 1.0支持多种Schema与结构化输出方式:
Pydantic(字段校验、描述、嵌套结构,功能最丰富)
TypedDict(轻量类型约束)
JSON Schema(与前后端/跨语言接口最通用)
示例代码:
from pydantic import BaseModel,Field from langchain.chat_models import init_chat_model model = init_chat_model( #本地模型名 model="hopephoto/Qwen3-4B-Instruct-2507_q8:latest", model_provider="ollama", # temperature 0.1~0.9之间,值越小回答越稳定,越高随机性越高 temperature=0.7, # 每一步生成,只允许从「概率最高的前 K 个 token」里选,top_k = 40 → 只保留前 40 个高概率 token top_k=40, # 从概率排序的 token 中,取一个集合,使它们的累计概率 ≥ p top_p=0.95, base_url="http://localhost:11434", ) class Movie(BaseModel): title: str = Field(..., description='标题') year: int = Field(..., description='年龄') director:str = Field(..., description='导演') rating: float = Field(..., description='评分') message = '提供关于电影《盗梦空间》的详细信息' model_with_structure = model.with_structured_output(Movie) response = model_with_structure.invoke(message) print(response)
结果如下:
title='盗梦空间' year=2010 director='克里斯托弗·诺兰' rating=8.8
上面使用Pydantic的BaseModel定义一个严格的数据结构。每个字段都明确了数据类型(如,str、int、float),并用Field(..., description='')提供语义描述。据此,模型回复时,LangChain会要求LLM的输出必须能填充这些字段。
51972
51780
42058
38901
33395
30361
28998
24022
23932
22291
2°
2°
45°
493°
2666°
3365°
2780°
2767°
3550°
2729°