当前位置: 首页 > article >正文

不只是问答:灵活定义你的聊天模型

上一篇文章我们装好了第一条链——提示词模板串起模型与解析器几句中文就变成了地道的英文。那一刻你可能觉得一切都尽在掌握了。可一旦把链部署给朋友试用新的问题就冒了出来朋友说“多写一点”模型却只回了一行字你希望模型扮演一个毒舌的代码审查员它却始终温文尔雅。想让模型真正为你所用光会“调用”是不够的你得学会“调校”。就像刚拿到一把新吉他你能弹响它但要弹出心中的旋律还得学会调弦和指法。今天我们就来深入聊天模型的“控制面板”看清楚那些关键的旋钮和开关。学会它们你就能随心所欲地调节模型的输出风格、长度、随机性甚至能让它在多轮对话中始终牢记自己的角色。一、参数调校拧动模型行为的旋钮1.1temperature创造力的“温度计”在所有参数中temperature是你用得最多的那个。它的名字取得很有画面感——高温分子活跃低温分子安静。放在模型上低温接近 0模型几乎总选择概率最高的词。输出稳定、可重复适合翻译、事实提取、代码生成等需要准确性的任务。高温接近 1 甚至更高模型会大胆尝试概率较低的词输出更富有“创意”和变化但也更容易跑题或胡言乱语。适合写诗、头脑风暴、生成故事。来看一个直观对比fromlangchain_deepseekimportChatDeepSeekfromlangchain_core.messagesimportHumanMessage# 低温模型严谨、收敛low_temp_modelChatDeepSeek(modeldeepseek-chat,temperature0.0)# 高温模型跳脱、发散high_temp_modelChatDeepSeek(modeldeepseek-chat,temperature1.2)questionHumanMessage(content用一句话描述下夏天的感觉)# 低温回答print(低温模型,low_temp_model.invoke([question]).content)# 高温回答多试几次每次可能不同print(高温模型,high_temp_model.invoke([question]).content)低温模型大概率会给出“夏天是炎热的季节阳光强烈万物生长”这类中规中矩的答案。而高温模型可能时不时蹦出“夏天像一壶沸腾的橘子汽水在空气里炸开蝉鸣的泡沫”这样意外生动的句子。实用建议做 RAG 问答时把temperature调到 0~0.3保证答案基于事实写宣传文案时大胆拉到 0.8 以上激发灵感。1.2max_tokens控制回答的长度有时候模型会事无巨细说个没完有时候又惜字如金。max_tokens就是给模型画一条“篇幅上限”单位是 token约等于 0.75 个英文单词或 0.5 个中文字。注意这不是“生成恰好这么长”而是一旦达到上限模型就立刻闭嘴哪怕话没说完。# 限制最多只输出 30 个 token大约十几个中文字short_modelChatDeepSeek(modeldeepseek-chat,max_tokens30)msgHumanMessage(content详细解释一下什么是面向对象编程)responseshort_model.invoke([msg])print(response.content)# 话刚起个头就截断了max_tokens在构建简洁回复如标题生成、分类标签时非常有用能避免模型啰嗦。1.3stop指定“刹车词”有时你需要模型生成到某个特定位置就自动停止。比如生成一段 JSON在}之后立即停止不再添加额外的解释。stop参数可以指定一个或多个终止字符串。# 遇到 “---” 时立即停止生成stop_modelChatDeepSeek(modeldeepseek-chat,stop[---])msgHumanMessage(content写一篇关于春天的小短文用 --- 作为结尾)responsestop_model.invoke([msg])print(response.content)# 输出不会包含 --- 之后的内容这个特性在处理结构化输出、对话剧本角色 A……角色 B……时尤其好用。1.4 一次把多个旋钮配好LangChain 允许你在创建模型实例时像填一张配置单一样把所有参数都写好然后这个模型实例就会在所有后续调用中保持统一的行为# 一个严谨、简洁、遇到感叹号就停的模型custom_modelChatDeepSeek(modeldeepseek-chat,temperature0.1,# 确定性高max_tokens100,# 最多 100 tokensstop[!],# 遇到感叹号就停)当然你也可以在不同任务里创建多个不同参数的实例完全自由。二、消息类型赋予对话以角色和记忆参数旋钮拧好了模型有了性格和语调。但真正让聊天模型“活”起来变成一个会“扮演”的家伙还要靠消息Messages。在第二篇里我们接触过SystemMessage、HumanMessage和AIMessage现在系统认识一下它们。LangChain 中消息是从langchain_core.messages导入的。三种核心消息类型各有使命消息类型角色用途SystemMessage系统指令设定助手全局行为、规则、语气。通常放在消息列表最前面。HumanMessage用户代表用户说的话是每次对话的触发者。AIMessage助手代表模型之前的回复用于构建对话历史保持多轮连贯性。2.1 系统消息给模型披上一件“身份外套”系统消息不直接与用户互动而是悄悄在后台定义游戏的玩法。一个精心编写的系统消息能让同一个模型在“严谨的数学老师”和“幽默的脱口秀演员”之间自由切换。fromlangchain_deepseekimportChatDeepSeekfromlangchain_core.messagesimportSystemMessage,HumanMessage modelChatDeepSeek(modeldeepseek-chat,temperature0.7)# 角色一严谨的数学老师teacher_systemSystemMessage(content你是一位严谨的小学数学老师。任何与数学无关的问题你都会礼貌地拒绝回答。使用简洁清晰的中文。)# 角色二幽默的脱口秀演员comedian_systemSystemMessage(content你是一位脱口秀演员回答任何问题都要用幽默的腔调如果你不知道也要编出一个搞笑的解释。)# 同一个问题看看不同身份的回复questionHumanMessage(content1 1 等于几)print(老师模式,model.invoke([teacher_system,question]).content)print(脱口秀模式,model.invoke([comedian_system,question]).content)你会看到第一个回答大约在强调“等于 2这是基本的加法事实”而第二个可能变成“这个问题问得好1加1等于‘幸福’因为把我和你加在一起就是最好的答案”2.2 对话历史让模型拥有“连续记忆”单轮问答不需要记忆但聊天应用必须记住前面说过什么。虽然 LangChain 有高级的 Memory 模块但手动管理消息列表是最基础、也是最灵活的方式。你只需把过去的HumanMessage和AIMessage依次保留每轮新问题时一起提交给模型fromlangchain_core.messagesimportSystemMessage,HumanMessage,AIMessage# 系统设定一个“喜欢宠物的朋友”history[SystemMessage(content你是一个喜欢宠物的朋友对话中时不时会提起你的猫)]# 第一轮history.append(HumanMessage(content今天天气真好))response1model.invoke(history)history.append(response1)# 把模型的回复也加进历史print(Bot:,response1.content)# 第二轮基于之前的对话history.append(HumanMessage(content那我们出去做什么好))response2model.invoke(history)history.append(response2)print(Bot:,response2.content)因为历史里已经存储了第一轮的内容第二轮的回复就会自然地承接上一轮的语境比如建议去公园散步顺便带上猫。注意每一轮都把整个历史重新发送token 消耗会随对话变长而快速增长。好在 LangChain 的 Memory 组件能帮你自动裁剪、汇总历史我们后面会专门讲。三、不止文本灵活的输出类型聊天模型的输出不仅仅是纯文本。LangChain 允许你取回更丰富的信息供后续环节使用。3.1 获取原始 AIMessageinvoke返回的是一个AIMessage对象除了content文本内容它还包含很多“幕后信息”responsemodel.invoke([HumanMessage(content你好)])print(内容:,response.content)print(消息 ID:,response.id)print(使用的 token 数量:,response.usage_metadata)# 可能包含输入/输出 token 数这些元信息对日志记录、成本监控、调试非常有价值。不需要的时候你只用content需要时它们就在那里。3.2 获取结构化输出我们将在后续文章中深入结构化输出但这里可以提前瞥一眼你可以要求模型返回 JSON 格式然后用解析器直接转成 Python 字典。例如让模型从一段描述中提取姓名和年龄。fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParser promptChatPromptTemplate.from_template(从以下文字中提取姓名和年龄以 JSON 格式返回只包含 name 和 age 字段\n{text})chainprompt|model|StrOutputParser()resultchain.invoke({text:张三今年28岁在北京工作})print(result)# 期望输出 {name: 张三, age: 28}目前我们暂时用字符串接收后续会用专门的 JSON 解析器自动解析成 dict四、灵活定义打造你自己的专属聊天模型上面我们分开看了参数、消息和输出。现在把它们整合成一套可复用的“角色工厂”。假设你的项目里需要一个“毒舌代码审查员”的角色到处复用你可以把它封装成一个独立模块fromlangchain_deepseekimportChatDeepSeekfromlangchain_core.messagesimportSystemMessage,HumanMessageclassCodeReviewer:def__init__(self):self.modelChatDeepSeek(modeldeepseek-chat,temperature0.3,# 保留一点幽默感但不肆意妄为max_tokens200,)self.systemSystemMessage(content你是一位毒舌但专业的代码审查员。你需要指出代码的问题并用带点讽刺但不伤害对方自尊的语气说话。)defreview(self,code:str)-str:messages[self.system,HumanMessage(contentf请审查以下代码\n\n{code})]responseself.model.invoke(messages)returnresponse.content# 使用reviewerCodeReviewer()print(reviewer.review(def add(a,b): return ab))现在毒舌审查员就成了一个你可以随时调用的对象。如果想换一个温柔的审查员只需要改一下SystemMessage的文本。这种将“模型配置角色设定”打包成组件的思路正是 LangChain 设计哲学的缩影。五、今日收获与下篇预告今天你从“会用模型”升级到了“会调模型”你掌握了temperature、max_tokens、stop等关键参数能控制模型的创造力和输出长度。你深入理解了三种消息类型能用SystemMessage设定角色用对话历史实现连续记忆。你学会了将模型配置与角色封装成可复用的组件。现在你手里的聊天模型已经不再是一个黑盒而是一台有刻度盘、有开关、能按你心意调试的精密仪器。但到目前为止模型还只能“自己说”不能“自己查”。你想让它临时算一道根号 7 的近似值它只能凭记忆猜猜错了你也没辙。如果能给模型一把瑞士军刀——让它需要时主动调用外部工具比如搜索引擎、计算器、数据库——它的能力边界会瞬间膨胀。下一篇《给你的模型配上“瑞士军刀”工具调用》我们将打开这个“工具”的黑匣子让模型学会什么时候该自己回答什么时候该掏出一把趁手的工具。这是从“玩具”到“工具”的关键一跃。下一篇见

相关文章:

不只是问答:灵活定义你的聊天模型

上一篇文章,我们装好了第一条链——提示词模板串起模型与解析器,几句中文就变成了地道的英文。那一刻,你可能觉得一切都尽在掌握了。可一旦把链部署给朋友试用,新的问题就冒了出来:朋友说“多写一点”,模型…...

终极开源解决方案:用Video-subtitle-extractor高效提取视频硬字幕的完整指南

终极开源解决方案:用Video-subtitle-extractor高效提取视频硬字幕的完整指南 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含…...

NotebookLM API接入倒计时:GCP项目配额收紧前,必须完成的4步合规配置与审计清单

更多请点击: https://intelliparadigm.com 第一章:NotebookLM API开发接入 NotebookLM 是 Google 推出的面向研究与知识管理的 AI 笔记工具,其官方尚未开放公开 API,但通过逆向分析 Web 客户端通信及社区验证的认证流程&#xff…...

为什么你的Windows任务栏需要一次彻底的美学革命?

为什么你的Windows任务栏需要一次彻底的美学革命? 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否曾经盯着Windows桌面…...

Java 数字校验实战:从工具类到正则,性能与场景的深度抉择

1. 数字校验的常见场景与挑战 在Java开发中,数字校验是个看似简单却暗藏玄机的基础操作。我见过太多项目因为数字校验不严谨导致的数据异常,比如用户输入"12a3"被误认为金额,或者接口接收"-1.2.3"这样的非法浮点数。这些…...

深入GORM源码:手把手教你为自定义字段打造专属‘Clause钩子’

深入GORM源码:手把手教你为自定义字段打造专属‘Clause钩子’ 在当今快速迭代的业务场景中,数据库操作早已不再是简单的CRUD。当我们面对复杂的状态流转、多租户隔离或敏感数据加密时,往往需要在数据持久化层植入特定的业务逻辑。GORM作为Go生…...

一键转载革命:auto_feed_js如何让PT资源分享效率提升10倍

一键转载革命:auto_feed_js如何让PT资源分享效率提升10倍 【免费下载链接】auto_feed_js PT站一键转载脚本 项目地址: https://gitcode.com/gh_mirrors/au/auto_feed_js 在PT(Private Tracker)社区中,资源分享是一项既重要…...

群晖DSM 7.2.2视频站恢复指南:三步搞定Video Station完整功能

群晖DSM 7.2.2视频站恢复指南:三步搞定Video Station完整功能 【免费下载链接】Video_Station_for_DSM_722 Script to install Video Station in DSM 7.2.2 and DSM 7.3 项目地址: https://gitcode.com/gh_mirrors/vi/Video_Station_for_DSM_722 还在为升级到…...

Adobe-GenP 3.0终极指南:如何免费激活Adobe CC全系列软件

Adobe-GenP 3.0终极指南:如何免费激活Adobe CC全系列软件 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款强大的Adobe Creative Cl…...

对比按需计费与TokenPlan在长期项目中的成本体感差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比按需计费与TokenPlan在长期项目中的成本体感差异 在长期运行的AI项目中,成本控制是一个持续优化的过程。不同的计费…...

Discord服务器日活破5万后ChatGPT机器人崩了?百万级消息队列+状态分片架构设计(附GitHub星标1.2k的开源模板)

更多请点击: https://intelliparadigm.com 第一章:Discord服务器日活破5万后ChatGPT机器人崩了? 当 Discord 社区日活跃用户突破 5 万时,一个基于 OpenAI API 的 ChatGPT 机器人在高峰时段突然出现 98% 的请求超时与 429&#xf…...

RAG提示工程失效?NotebookLM上下文压缩机制深度拆解,3类文档结构适配公式即拿即用

更多请点击: https://intelliparadigm.com 第一章:RAG提示工程失效的底层归因与NotebookLM破局逻辑 RAG(Retrieval-Augmented Generation)系统在真实场景中频繁遭遇“提示失焦”现象——检索结果与生成目标语义脱节,导…...

员工管理(新增员工)、事务管理和文件上传(阿里云OSS)

员工管理(新增员工) 思路就是就是新增的员工基本信息和批量保存员工的工作经历信息&#xff0c;也就是后端对应了两条sql语句&#xff0c; 1.保存员工基本信息 Emp实体类中新添一个字段用于保存员工工作经历 //封装工作经历 private List<EmpExpr> exprList; (1)Cont…...

NotebookLM笔记整理实战指南:5步打造自动关联知识图谱的智能笔记系统

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM笔记整理实战指南&#xff1a;5步打造自动关联知识图谱的智能笔记系统 NotebookLM 是 Google 推出的面向研究者与开发者的第一方 AI 笔记工具&#xff0c;其核心能力在于基于用户上传文档构建…...

Docker容器化高可用架构部署方案(二)

01-环境准备 本文档详细介绍部署前的环境准备工作&#xff0c;包括操作系统要求、Docker安装、内核参数配置和网络确认。 系统要求 硬件要求 CPU&#xff1a;至少2核心 内存&#xff1a;至少4GB 磁盘&#xff1a;至少40GB可用空间 操作系统 OpenEuler 24.03 SP3 或其他L…...

给视觉开发新手的保姆级教程:在Ubuntu上从下载源码到成功运行Demo,搞定OpenCV 3环境搭建

给视觉开发新手的保姆级教程&#xff1a;在Ubuntu上从下载源码到成功运行Demo&#xff0c;搞定OpenCV 3环境搭建 第一次在Ubuntu上搭建OpenCV开发环境&#xff0c;对很多视觉开发新手来说可能是个令人望而生畏的任务。命令行操作、编译工具链、环境配置……这些术语听起来就让人…...

Markdown基础功能

原文&#xff1a;Markdown基础语法介绍 | Colin Gretzky的博客 本文介绍 Markdown 笔记格式的基础功能&#xff0c;涵盖核心语法和使用要点&#xff0c;适合初学者快速上手。 Markdown 简介 Markdown 是一种轻量级的标记语言&#xff0c;由 John Gruber 于 2004 年设计。它的核…...

Pixel-to-Space 像素到空间 一镜到底·跨镜连续技术解析方案

Pixel-to-Space 像素到空间 一镜到底跨镜连续技术解析方案一、技术总览1.1 核心定义Pixel-to-Space像素到空间&#xff0c;是一套自成体系的二维视频像素向三维物理空间实时反演的全域感知范式&#xff0c;跳出市面传统视频解析与空间重建的通用研发路线&#xff0c;形成专属化…...

通达信缠论分析插件:如何用开源工具实现智能技术分析

通达信缠论分析插件&#xff1a;如何用开源工具实现智能技术分析 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 缠论作为技术分析的重要理论体系&#xff0c;其复杂的线段划分和中枢识别让许多交易者望…...

AgentDock:构建可控AI智能体的开源框架与工程实践

1. 项目概述&#xff1a;构建可控的智能体应用框架如果你正在寻找一个既能利用大语言模型&#xff08;LLM&#xff09;的创造力&#xff0c;又能确保关键业务流程稳定可靠的开发框架&#xff0c;那么 AgentDock 的出现可能正合你意。我最近深度体验了这个开源项目&#xff0c;它…...

OAI 5G核心网搭建后,如何用Docker命令进行日常运维和故障排查?

OAI 5G核心网Docker运维实战&#xff1a;从日志分析到故障排查 当OAI 5G核心网完成基础部署后&#xff0c;真正的挑战才刚刚开始。面对由多个容器组成的复杂系统&#xff0c;如何快速定位AMF拒绝注册的原因&#xff1f;SMF的PDU会话建立失败该如何排查&#xff1f;本文将分享一…...

Python调用MATLAB引擎避坑指南:从安装路径选择到`setup.py` install命令的完整实战

Python调用MATLAB引擎避坑指南&#xff1a;从安装路径选择到setup.py install命令的完整实战 在科学计算和工程仿真领域&#xff0c;MATLAB和Python各有优势。许多开发者希望将两者结合使用&#xff0c;但安装MATLAB引擎到Python环境时常常遇到各种"玄学"问题。本文将…...

如何在3分钟内安装TrollStore?TrollInstallerX终极指南

如何在3分钟内安装TrollStore&#xff1f;TrollInstallerX终极指南 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾想过在不越狱的情况下自由安装iOS应用&#…...

别再死记硬背公式了!用“预测-更新”的贝叶斯视角,5分钟看懂卡尔曼滤波核心

卡尔曼滤波&#xff1a;用贝叶斯思维解决自动驾驶中的不确定性追踪问题 想象一下你正驾驶一辆特斯拉行驶在高速公路上&#xff0c;车载雷达显示前方100米处有一辆卡车。但下一秒雷达数据突然跳变到105米&#xff0c;而摄像头却显示距离是98米。作为人类司机&#xff0c;你会本能…...

PCL2启动器游戏启动失败的终极解决方案:3步快速修复指南

PCL2启动器游戏启动失败的终极解决方案&#xff1a;3步快速修复指南 【免费下载链接】PCL Minecraft 启动器 Plain Craft Launcher&#xff08;PCL&#xff09;。 项目地址: https://gitcode.com/gh_mirrors/pc/PCL Plain Craft Launcher 2&#xff08;PCL2&#xff09;…...

深度理解 C++ 继承与多态:从底层原理到实战技巧

目录 一、 继承&#xff1a;不仅是代码的复用 1.1 三种继承方式的差异 1.2 构造与析构的顺序&#xff08;避坑指南&#xff09; 二、 多态&#xff1a;让程序具备“生命力” 2.1 虚函数&#xff08;Virtual Function&#xff09; 2.2 核心代码示例 三、 深度思考&#x…...

RTKLIB2.4.3进阶:在VS2017中通过.conf与命令行参数高效驱动PPP数据处理

1. RTKLIB与PPP数据处理基础 RTKLIB作为开源GNSS数据处理工具链&#xff0c;在精密单点定位&#xff08;PPP&#xff09;领域有着广泛应用。2.4.3版本虽然发布较早&#xff0c;但其稳定性和功能完整性使其至今仍是许多高精度定位项目的首选。我在多个测绘项目中实测发现&#x…...

Perplexity学术模式尚未开放的4个隐藏功能(仅限IEEE Fellow级用户测试通道泄露)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity学术模式尚未开放的4个隐藏功能&#xff08;仅限IEEE Fellow级用户测试通道泄露&#xff09; 离线语义缓存预热接口 Perplexity 内部测试版暴露了 /v2/academic/cache/warmup 端点&#xff…...

别再复制粘贴了!手把手教你从零配置一个生产可用的log4j2.xml文件

从零构建生产级Log4j2配置&#xff1a;告别复制粘贴的五个关键设计 每次接手新项目时&#xff0c;看到团队直接从GitHub或博客复制过来的log4j2.xml文件&#xff0c;我都会暗自叹气。这些配置往往带着各种隐患&#xff1a;有的在高峰期突然打满磁盘&#xff0c;有的关键错误日志…...

AI写专著的技巧与工具:一键生成20万字专著,开启写作新体验!

学术著作的严谨性离不开丰富的资料和数据支撑&#xff0c;但资料的搜集和数据的整合恰恰是撰写过程中最繁琐且耗时的环节。进行研究的学者需要全面搜索国内外的最新文献&#xff0c;确保所选文献既权威又相关&#xff0c;并追溯到原始来源&#xff0c;避免出现二次引用的错误&a…...