LangChain:解锁AI开发的超级钥匙

LangChain

LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它旨在帮助开发者更高效地构建与大语言模型(LLMs)交互的应用程序,通过提供一系列工具和模块化功能,使得开发者能够更加轻松地在复杂应用场景中管理语言模型的能力.后面主要实现了几行代码实现一个复杂的AI应用,对于大模型开发的过程抽象.

资料链接

官网:https://www.langchain.com/

github: https://github.com/langchain-ai/langchain

特性

  1. 模型 I/O 封装

  2. 数据连接封装

  3. 对话历史管理

  4. 架构封装

  5. Callbacks

一、模型 I/O 封装

把不同的模型,统一封装成一个接口,方便更换模型而不用重构代码。

1.1 模型 API:LLM vs. ChatModel

# !pip install --upgrade langchain
# !pip install --upgrade langchain-openai
# !pip install --upgrade langchain-community
import os
os.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxxxxxxxx"
# 设置基本URL(可选)
# 如果OpenAI更改了API的主机地址,你需要更新这个配置项
os.environ["OPENAI_BASE_URL"] = "https://xxxxxx.plus/v1"  
1.1.1 OpenAI 模型封装
from langchain_openai import ChatOpenAI
# 保证操作系统的环境变量里面配置好了OPENAI_API_KEY, OPENAI_BASE_URL,如何获取key,可以网上搜索,有很多渠道.
llm = ChatOpenAI(model="gpt-4o-mini")  # 默认是gpt-3.5-turbo
response = llm.invoke("请给我介绍下NBA球星科比.布莱恩特")
print(response.content)
科比·布莱恩特(Kobe Bryant)是美国职业篮球史上最著名的球员之一,广泛被认为是NBA历史上最伟大的球员之一。他于1978年8月23日出生在宾夕法尼亚州的费城,1996年高中毕业后直接进入NBA,成为当时历史上最年轻的球员之一。

### 职业生涯
科比的整个职业生涯都在洛杉矶湖人队度过,1996年至2016年间,他为球队效力了20个赛季。科比是一名得分后卫,以其卓越的得分能力、出色的技术以及对比赛的独特理解而闻名。在他的职业生涯中,他获得了多项荣誉,包括:

- **5次NBA总冠军**(2000, 2001, 2002, 2009, 2010)
- **2次NBA总决赛MVP**(2008, 2010)
- **1次常规赛MVP**(2008)
- **18次入选明星赛**(1998, 2000-2016)
- **2次获得奥运金牌**(2008, 2012)

### 比赛风格
科比以其''黑曼巴''心态著称,他的比赛风格结合了技术、力量和绝对的竞争精神。科比以其突破、投射和后仰跳投著称,依靠勤奋的训练和对细节的关注,他能够在关键时刻表现出色。

### 退役与遗产
科比在2016年正式宣布退役。在他的退役战中,他以60分的高分结束了职业生涯,创造了NBA历史上退役战最高得分的记录。2017年,他入选了奈史密斯篮球名人堂,成为篮球历史上的一位传奇人物。

### 逝世
科比于2020年1月26日在一次直升机事故中不幸去世,享年41岁。他的去世令全球篮球迷感到震惊和悲痛,同时也引发了对其职业生涯和贡献的广泛缅怀。

科比·布莱恩特的精神和影响力不仅限于篮球场,他在职业生涯后期更多地参与慈善和创意工作,包括动画短片《亲爱的篮球》,为他赢得了奥斯卡奖。他的传奇故事和影响力将继续激励着一代又一代的球员和球迷。
1.1.2 多轮对话 Session 封装
from langchain.schema import (
    AIMessage,  # 等价于OpenAI接口中的assistant role
    HumanMessage,  # 等价于OpenAI接口中的user role
    SystemMessage  # 等价于OpenAI接口中的system role
)

messages = [
    SystemMessage(content="你是一个资深NBA专家,了解每一个球员的特点,以及所有的球队故事"),
    HumanMessage(content="我是一个资深球迷,我非常喜欢约基奇,亚历山大,爱德华兹"),
    AIMessage(content="欢迎!"),
    HumanMessage(content="我喜欢球员都有谁?")
]

ret = llm.invoke(messages)

print(ret.content)
你提到的球员中:

1. **尼古拉·约基奇(Nikola Jokić)** - 丹佛掘金的中锋,因其出色的传球能力和篮球智商而闻名,是现代篮球中最优秀的大个子之一。他的低位进攻、篮板能力和控球技术使他成为全能型球员,曾多次获得NBA最有价值球员(MVP)奖。

2. **谢伊·吉尔杰斯-亚历山大(Shai Gilgeous-Alexander)** - 俄克拉荷马城雷霆的后卫,以其全能的得分能力和出色的突破能力而著称。他的精准中距离投篮和罚球能力,使他成为一名极具威胁的进攻者。

3. **安东尼·爱德华兹(Anthony Edwards)** - 明尼苏达森林狼的年轻得分后卫,这位新星以其爆发力和得分能力备受瞩目。他在进攻端展现出的潜力和斗志,使他成为未来的明星球员。

这几位球员各具特色,展现了不同位置的精彩风格。你为什么喜欢这三位球员呢?

上面实例,展示了LangChian便捷之处,只需要几行代码调用以及多轮对话。

1.2 模型的输入与输出

1.2.1 Prompt 模板封装
  1. PromptTemplate 可以在模板中自定义变量
from langchain.prompts import PromptTemplate

template = PromptTemplate.from_template("给我讲个关于{subject}的故事")
print("===Template===")
print(template)
print("===Prompt===")
print(template.format(subject='湖人队'))
===Template===
input_variables=['subject'] input_types={} partial_variables={} template='给我讲个关于{subject}的故事'
===Prompt===
给我讲个关于湖人队的故事
from langchain_openai import ChatOpenAI

# 定义 LLM
llm = ChatOpenAI(model="gpt-4o-mini")
# 通过 Prompt 调用 LLM
ret = llm.invoke(template.format(subject='斯蒂芬.库里'))
# 打印输出
print(ret.content)
斯蒂芬·库里(Stephen Curry)是美国职业篮球运动员,广受欢迎,以其出色的投篮能力和球场智慧而闻名。他是在1988年出生于亚特兰大,父亲德尔·库里是一位前NBA球员,母亲则是一位非常支持他篮球事业的家长。

库里的大学生涯在戴维逊大学开始。在那里,他迅速崭露头角,带领球队在2008年 NCAA 锦标赛中取得了惊人的表现,成为全国媒体关注的焦点。尽管他在大学时期的身高(约1.91米)和体重(约86公斤)在职业篮球中并不算突出,但他以其精准的三分投篮和出色的控球能力成功打破了很多对篮球运动员的传统认识。

2009年,库里以第七位被金州勇士队选中,开始了他的NBA职业生涯。起初,他的表现并不算惊艳,但随着时间的推移,他逐渐成为球队的核心球员。在2015年,库里带领勇士队赢得了他们40年来的首个NBA总冠军,并因此获得NBA最有价值球员(MVP)奖。他在2016赛季更是创造了单赛季投中402个三分球的惊人纪录,这一成就至今无人打破。

库里的影响不仅仅体现在场上,他还在场外积极参与公益活动。2019年,他和妻子艾莎·库里共同创立了“我们承诺”基金会,致力于改善儿童和家庭的生活条件。

斯蒂芬·库里的故事体现了坚持与努力的重要性,他不仅通过出色的篮球技术改变了比赛的方式,更以自己的行为激励了许多人去追求自己的梦想。无论是场上的亮眼表现,还是场外的公益事业,库里都在不断地诠释着运动员的责任与担当。
  1. ChatPromptTemplate 用模板表示的对话上下文
from langchain.prompts import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    SystemMessagePromptTemplate,
)
from langchain_openai import ChatOpenAI

template = ChatPromptTemplate.from_messages(
    [
        SystemMessagePromptTemplate.from_template("你是{product}的客服助手。你的名字叫{name}"),
        HumanMessagePromptTemplate.from_template("{query}"),
    ]
)

llm = ChatOpenAI(model="gpt-4o-mini")
prompt = template.format_messages(
    product="篮球解说员",
    name="詹姆斯.欧文",
    query="你是谁"
)
print(prompt)

ret = llm.invoke(prompt)

print(ret.content)
[SystemMessage(content='你是篮球解说员的客服助手。你的名字叫詹姆斯.欧文', additional_kwargs={}, response_metadata={}), HumanMessage(content='你是谁', additional_kwargs={}, response_metadata={})]
我是詹姆斯·欧文,一个篮球解说员的客服助手。请问有什么我可以帮助您的吗?
  1. MessagesPlaceholder 把多轮对话变成模板
from langchain.prompts import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    MessagesPlaceholder,
)

human_prompt = "Translate your answer to {language}."
human_message_template = HumanMessagePromptTemplate.from_template(human_prompt)

chat_prompt = ChatPromptTemplate.from_messages(
    # variable_name 是 message placeholder 在模板中的变量名
    # 用于在赋值时使用
    [MessagesPlaceholder("history"), human_message_template]
)
from langchain_core.messages import AIMessage, HumanMessage

human_message = HumanMessage(content="Who is Elon Musk?")
ai_message = AIMessage(
    content="Elon Musk is a billionaire entrepreneur, inventor, and industrial designer"
)

messages = chat_prompt.format_prompt(
    # 对 "history" 和 "language" 赋值
    history=[human_message, ai_message], language="中文"
)

print(messages.to_messages())
[HumanMessage(content='Who is Elon Musk?', additional_kwargs={}, response_metadata={}), AIMessage(content='Elon Musk is a billionaire entrepreneur, inventor, and industrial designer', additional_kwargs={}, response_metadata={}), HumanMessage(content='Translate your answer to 中文.', additional_kwargs={}, response_metadata={})]
result = llm.invoke(messages)
print(result.content)
埃隆·马斯克(Elon Musk)是一位亿万富翁企业家、发明家和工业设计师。

把Prompt模板看作带有参数的函数

1.2.2 从文件加载 Prompt 模板
from langchain.prompts import PromptTemplate

template = PromptTemplate.from_file("example_prompt_template.txt")
print("===Template===")
print(template)
print("===Prompt===")
print(template.format(topic='黑色幽默'))
===Template===
input_variables=['topic'] input_types={} partial_variables={} template='举一个关于{topic}的例子'
===Prompt===
举一个关于黑色幽默的例子

1.3 结构化输出

1.3.1 直接输出 Pydantic 对象

Pydantic 是一个 Python 数据验证和设置管理库,它使用 Python 类型注解来验证数据。Pydantic 的核心功能是数据验证和数据模型的定义,它通过类型注解来确保数据的正确性和一致性。Pydantic 通常用于构建 API、数据处理和配置管理等场景。

from pydantic import BaseModel, Field

# 定义你的输出对象
class Date(BaseModel):
    year: int = Field(description="Year")
    month: int = Field(description="Month")
    day: int = Field(description="Day")
    era: str = Field(description="BC or AD")

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值