LangChain框架入门04:10分钟优雅接入主流大模型
一个 AI 应用的核心就是它所依赖的大语言模型,LangChain 框架本身不内置任何大模型,但它通过定义统一的接口规范,可以将各种第三方大语言模型接入进来。本文将详细介绍如何在 LangChain 中接入大语言模型,以及如何使用不同的大语言模型。
一、Model的分类
LangChain中将大语言模型分为:文本生成模型(LLMs)和支持多轮对话的聊天模型(Chat models)。
聊天模型:接受消息输入,并且输出消息,返回的消息封装为不同类型的 BaseMessage
实例, LangChain 也允许聊天模型以字符串作为输入。这样做可以轻松地用聊天模型代替 LLMs,当以字符串作为输入时,该字符串会被转换为 HumanMessage
,然后传递给底层聊天模型。
文本生成模型:接受字符串输入,并且输出字符串,LangChain 也允许文本模型也以“消息”作为输入,从而与聊天模型的接口保持一致。当以消息作为输入时,这些消息会在传递给LLM之前被转换为字符串。
在 LangChain 的类结构中,顶层基类是 BaseLanguageModel
,用于定义模型的通用接口。它分为两支:BaseChatModel
和 BaseLLM
。接入聊天模型时需继承 BaseChatModel
,如常用的 ChatOpenAI
;而文本生成模型则继承 BaseLLM
,如 OpenAI
。
二、Chat Model聊天模型
在构建聊天模型时,有一些标准化参数:
参数名 | 参数含义 |
---|---|
model | 指定使用的大语言模型名称(如 "gpt-4" 、"gpt-3.5-turbo" 等) |
temperature | 温度,温度越高,输出内容越随机;温度越低,输出内容越确定 |
timeout | 请求超时时间 |
max_tokens | 生成内容的最大token数 |
stop | 模型在生成时遇到这些“停止词”将立刻停止生成,常用于控制输出的边界。 |
max_retries | 最大重试请求次数 |
api_key | 大模型供应商提供的API秘钥 |
base_url | 大模型供应商API 请求地址 |
以上的标准参数,也只是适用于部分的大语言模型,有些参数在特定模型中可能是无效的,这些标准化参数仅对 LangChain 官方提供集成包的模型(如 langchain-openai
、langchain-anthropic
)生效,在langchain-community包中的第三方模型,则不需要遵守这些标准化参数的规则。
ChatOpenAI完整示例:
import dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 读取env配置
dotenv.load_dotenv()
# 1.构建提示词
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个资深的Python开发工程师"),
("human", "{question}")
])
# 2.创建模型
llm = ChatOpenAI()
# 3.生成提示词
prompt_value = prompt.invoke({"question": "请你帮我写一个求最大公约数方法"})
# 4.大模型接受promptValue,输出AI消息
aiMessage = llm.invoke(prompt_value)
# 5.打印AI消息和AI消息内容
print(aiMessage.content)
执行结果如下:
好的!求最大公约数(GCD)可以用欧几里得算法,这是一种高效的算法。下面是用 Python 实现的代码:
```python
def gcd(a, b):
while b:
a, b = b, a % b
return a
```
### 解释:
- 这个方法使用了 **欧几里得算法**,通过反复取模来缩小问题的规模,直到 `b` 为 0。
- 当 `b` 为 0 时,`a` 就是两个数的最大公约数。
你可以用这个函数来求两个数的最大公约数。例如:
```python
print(gcd(56, 98)) # 输出:14
```
这种方法的时间复杂度是 \(O(\log(\min(a, b)))\),非常高效。
三、LLM文本生成模型
LLM文本生成模型使用方式如下:
import dotenv
from langchain_core.prompts import PromptTemplate
from langchain_openai import OpenAI
# 读取env配置
dotenv.load_dotenv()
# 1.构建提示词
prompt = PromptTemplate.from_template("{question}")
# 2.创建模型
llm = OpenAI()
prompt_value = prompt.invoke({"question": "请完整输出悯农这首诗"})
# 3.文本生成模型接受promptValue,并输出结果
print(llm.invoke(prompt_value))
执行结果:
《悯农》是唐代诗人李绅创作的一首诗,原文如下:
**悯农**
锄禾日当午,
汗滴禾下土。
谁知盘中餐,
粒粒皆辛苦。
这首诗通过描写农民在烈日下辛勤耕作的情景,表达了对农民劳动的同情与敬意。
四、Message组件
在之前介绍聊天模型ChatOpenAI的案例中,调用模型后返回了一条AI消息,在LangChain中,消息有几种不同的类型。所有消息都有 type
、 content
、 response_metadata
等属性。
下面是这几个属性的作用:
属性名 | 属性作用 |
---|---|
type | type 描述了是哪个类型的消息,包含类型有"user"、"ai"、"system" 和 "tool" |
content | 通常是字符串,有些情况下可能是字典列表,这个字典列表用于大模型的多模态输出。 |
name | 用来区分当消息类型相同,对消息进行区分,但不是所有模型都支持这一功能。 |
response_metadata | AI消息才会包含的属性,大语言模型的响应中附加元数据,根据不同模型会有不同,如可能会包含本次 token 使用量等信息。 |
tool_calls | AI消息才会包含的属性,当大语言模型决定调用工具时,在 AIMessage 中就会包含这个属性,可以通过 .tool_calls 属性进行获取该属性返回一个 ToolCall 列表,每个 ToolCall 是一个字典,包含以下字段: name : 应调用的工具名称 args : 调用工具的参数 id : 工具调用的唯一标识 ID |
根据消息类型的不同, Message组件被分为:
HumanMessage
:人类消息,type为"user"
AIMessage
: AI 消息,type为"ai"
SystemMessage
:系统消息,type为"system",告诉大模型当前的背景是什么,应该如何做,并不是所有模型提供商都支持这个消息类型
ToolMessage
:工具消息,type为"tool"
FunctionMessage
:旧的函数调用消息类型,现已被 ToolMessage 取代。
五、使用其他大语言模型
除了使用OpenAI的大语言模型之外,LangChain还可以使用很多的大语言模型,下面我们以接入阿里巴巴的通义千问聊天模型为例。
首先,申请阿里云百炼平台API KEY:
在.env文件中,加入阿里云百炼平台的API Key
# 阿里云百炼平台API KEY
DASHSCOPE_API_KEY=sk-***********************
安装依赖包
pip install dashscope
调用通义千问模型示例如下:
import dotenv
from langchain_community.chat_models import ChatTongyi
from langchain_core.prompts import PromptTemplate
# 读取env配置
dotenv.load_dotenv()
# 1.构建提示词
prompt = PromptTemplate.from_template("{question}")
# 2.构建通义模型
tongyi_chat = ChatTongyi(
model="qwen-turbo-2025-04-28"
)
prompt_value = prompt.invoke({"question": "请完整输出短歌行"})
# 3.文本生成模型接受promptValue,并输出结果
print(tongyi_chat.invoke(prompt_value).content)
执行结果:
《短歌行》是东汉末年曹操所作的一首乐府诗,全诗如下:
---
**短歌行**
**曹操**
对酒当歌,人生几何!
譬如朝露,去日苦多。
慨当以慷,忧思难忘。
何以解忧?唯有杜康。
青青子衿,悠悠我心。
但为君故,沉吟至今。
呦呦鹿鸣,食野之苹。
我有嘉宾,鼓瑟吹笙。
明明如月,何时可掇?
忧从中来,不可断绝。
越陌度阡,枉用相存。
契阔谈讌,心念旧恩。
月明星稀,乌鹊南飞。
绕树三匝,何枝可依?
山不厌高,海不厌深。
周公吐哺,天下归心。
---
这首诗表达了诗人对人生短暂的感慨、对贤才的渴求以及统一天下的雄心壮志。
接入更多模型的文档在LangChain官网的Integrations中
在 LangChain Integrations 页面点击“More”进行查找
找到阿里巴巴
在这里就可以看到接入ChatTongyi等模型的文档了,点击API Reference,查看具体文档。
开发者可以根据文档说明,快速集成各类主流和国产大语言模型。
六、总结
本文详细介绍了 LangChain 中模型组件(Model)的使用方法与设计思路,首先从模型的分类开始,分析了文本生成模型和聊天模型的区别,接下来通过具体的代码示例,来演示聊天模型ChatOpenAI和文本生成模型OpenAI的基本用法。
我们还学习了聊天模型输入输出都要用到的Message组件,了解了 Message 组件的几种类型(如 HumanMessage
、AIMessage
、SystemMessage
、ToolMessage
),最后,我们以接入阿里巴巴的通义千问的聊天模型为例,展示如何在LangChain中接入其他第三方模型。
总的来说,LangChain 在模型接入方面做了大量抽象,可以灵活支持 OpenAI、Anthropic、阿里通义千问、百度文心一言等主流模型。通过本文,相信你已经理解Model组件的设计思想和使用方法,后续将继续深入介绍LangChain的核心模块和高级用法,敬请期待。
LangChain框架入门04:10分钟优雅接入主流大模型的更多相关文章
- 【Istio实际操作篇】Istio入门,10分钟快速安装
@ 目录 前言 本文说明 请大家务必查看 环境准备 详细版 入门:搭建步骤 Istio软件包下载 下载Istio 卸载 简洁版 安装 卸载 学习不走弯路,gz号「yeTechLog」 前言 上一篇讲了 ...
- Keycloak快速上手指南,只需10分钟即可接入Spring Boot/Vue前后端分离应用实现SSO单点登录
登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种 ...
- 10分钟搭建 App 主流框架
搭建主流框架界面 0.达成效果 我们玩iPhone应用的时候,有没发现大部分的应用都是上图差不多的结构,下面的TabBar控制器可以切换子控制器,上面又有Navigation导航条 我们本文主要是搭建 ...
- .netcore第三方登录授权:10分钟急速接入
前言 很多对外应用的开发都考虑接入第三方登录来提高用户的体验感,避免用户进行繁琐的注册登录(登录后的完善资料必不可免). 而QQ.微信.支付宝.淘宝.微博等应用就是首选目标(无他,用户群体大,支持发开 ...
- 【Fungus入门】10分钟快速构建Unity中的万能对话系统 / 叙事系统 / 剧情系统
我真的很久没有写过一个完整的攻略了(笑),咸鱼了很久之后还是想来写一个好玩的.这次主要是梳理一下Unity的小众插件Fungus的核心功能,并且快速掌握其使用方法. 官方文档:http://fungu ...
- 微信小程序开发入门:10分钟从0开始写一个hello-world
小程序开发需要三个描述整体程序的app文件 和 一个描述多个页面的 pages文件夹. (1)三个app文件分别是app.js,app.json,app.wxss. app.js文件是脚本文件处理一些 ...
- Apache Shiro系列三,概述 —— 10分钟入门
一.介绍 看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro.以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定. 二.概述 关于Shiro的废话就不多说了 ...
- JavaScript 10分钟入门
JavaScript 10分钟入门 随着公司内部技术分享(JS进阶)投票的失利,先译一篇不错的JS入门博文,方便不太了解JS的童鞋快速学习和掌握这门神奇的语言. 以下为译文,原文地址:http://w ...
- [入门到吐槽系列] Webix 10分钟入门 一 管理后台制作
前言 本人是服务端程序员,同时需要兼职前端开发.常用的就是原生态的HTML.Javascript,也用过ExtJS.Layui.可是ExtJS变公司后非常难用.Layui上手还行,用过一段时间,会觉得 ...
- [入门到吐槽系列] Webix 10分钟入门 二 表单Form的使用
前言 继续接着上一篇的webix入门:https://www.cnblogs.com/zc22/p/15912342.html.今天完成剩下两个最重要的控件,表单和表格的使用.掌握了这两个,整个Web ...
随机推荐
- 阿里云手工配置Nginx
Nginx服务器是网站反向代理,负载均衡,以及动静分离的神器,由于是第一次在阿里云上配置这个,花费了大半天,终于配置成功了.下面简要的介绍下其流程,以备后面又搞忘了.前提是自动装装不上 购买阿里云服务 ...
- 用鼠标画圆点(java GUI)
话不多说,先看效果 当然你也可以发挥脑洞绘制更更棒的 源码如下: package javaBasic; import java.awt.*; import java.awt.event.*; impo ...
- Partition to K Equal Sum Subsets——LeetCode进阶路
原题链接https://leetcode.com/problems/partition-to-k-equal-sum-subsets/ 题目描述 Given an array of integers ...
- Longest Palindromic Substring-----LeetCode进阶路⑤
题目描述 Given a string s, find the longest palindromic substring in s. You may assume that the maximum ...
- maven安装教程(亲测有用)
先去https://maven.apache.org/download.cgi下第二个: 自己下不下来的,微信搜我公众号[勾玉技术]发送关键字[maven]获取百度云链接下载. 解压到任意文件夹,记得 ...
- 线下IDC数据中心迁移至阿里云详细方案
一.迁移前准备 1. 迁移规划 资源评估 统计需迁移的数据库类型.版本.数据量(如 MySQL 5.7.SQL Server 2019.文件存储系统等). 评估应用依赖关系,明确停机窗口(建议业务低峰 ...
- JDK网站最终的拼图
"JDK源码剖析网"目前只上线了一小部分的内容(而且还未更新完成),Javac编译器,HotSpot基础.垃圾收集器以及HotSpot运行时将在今年10月份之前做为付费内容努力更新 ...
- 参加 Hugging Face 组织的 Gradio & MCP 智能体主题黑客松
欢迎参加 Gradio & MCP 智能体主题黑客松! 准备好了吗?一场以智能体(Agent)和模型上下文协议(Model Context Protocol,简称 MCP)为核心的全球在线黑客 ...
- 可视化理解共识协议Raft
一.分布式共识协议引入 什么是分布式共识协议呢?让我们从一个简单的例子开始. 看看我们只有一个节点的系统,在这个系统中,你可以将节点想象为一个数据库系统,这个系统存储了一个值X. 我们有一个客户端(绿 ...
- HarmonyOS 实战:给笔记应用加防截图水印
最近在做笔记类应用时,遇到一个头疼的需求:防止用户内容被非法截图传播.思来想去,加水印是个直接有效的方案.研究了 HarmonyOS 的开发文档后,发现用 Canvas 配合布局组件能轻松实现动态水印 ...