内容参考于:图灵AI大模型全栈

在LangChain1.0版本它引入了LCEL,全称LangChain Expression Language

未使用Chain链

# 导入LangChain中的提示模板
from langchain_core.prompts import PromptTemplate
# 导入LangChain中的OpenAI模型接口
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv

load_dotenv()
import os

# 原始字符串模板
template = "桌上有{number}个苹果,四个桃子和 3 本书,一共有几个水果?"

# 创建LangChain模板
prompt_temp = PromptTemplate.from_template(template)

# 根据模板创建提示
prompt = prompt_temp.format(number=2)

model = ChatOpenAI(api_key=os.getenv("api_key"),
                   base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
                   model='qwen-plus',
                   temperature=0)
# 传入提示,调用模型返回结果
result = model.invoke(prompt)
print(result)

使用链

from langchain_classic.chains.llm import LLMChain
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv

load_dotenv()

# 原始字符串模板
template = "桌上有{number}个苹果,四个桃子和 3 本书,一共有几个水果?"

# 创建模型实例
llm = ChatOpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),
                 base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
                 model='qwen-max',
                 temperature=0)

# 创建LLMChain
llm_chain = LLMChain(
    llm=llm,
    prompt=PromptTemplate.from_template(template)
)

# 调用LLMChain,返回结果
result = llm_chain.invoke({"number": 2})
print(type(result))
print(result['text'])

区别:

上方的链是最早的版本,LCEL链是最新的

如下图红框,我们在执行上方链的代码,会出现下图红框位置的提示,|这个符号是管道符,它要我们使用管道符传参

LCEL链的实现,效果图:可以看到通过管道符,把num里的值全部进行了乘以2的操作

# 导入管道工具select,专门用来逐个处理数据
from pipe import select

# 定义原始数据列表,里面有3个数字:1、2、3
num = [1,2,3]

# 核心逻辑(完全按你的理解注释):
# 1. 管道符 | :把左边的num列表 传给 右边的select
# 2. select :会把num里的值 一个一个读出来
# 3. lambda x:x的值来自于num,读出来的每个数字都会放到x里
# 4. x*2 :把x里的数字乘以2
# 5. list() :把处理完的所有结果打包成列表
aa = list(num | select(lambda  x: x*2))

# 打印最终结果 [2,4,6]
print(aa)

实现核心原理,如下图:通过Python语言提供的魔法方法__or__来实现

class Chain():
    def __init__(self, value):
        self.value = value

    def __or__(self, other):
        # 调用 | 运算符  触发的魔法方法
        return other(self.value)

def prompt(text):
    return "请求回答问题:{}".format(text)

# 从这开始往下看!!!!!
# 创建一个类,创建完self.value的值是 人工智能是什么?
aa = Chain('人工智能是什么?')
# aa现在是Chain类型,Chain类型中有__or__方法,它在Python中叫魔法方法,通过|这个管道符号可以执行它,也就是说执行了 aa | 就来到了__or__里面
#  __or__(self, other),self是aa,other就是|后面的值,也就是prompt,prompt是一个函数,然后在__or__中other(self.value)就调用了也就是prompt方法
#  它的入参是self.value也就是 人工智能是什么? 这句话,然后prompt中执行了 "请求回答问题:{}".format(text) 格式化字符串,并返回,所以res的值是prompt方法的返回值
# print打印的内容就是 请求回答问题:人工智能是什么?
res = aa | prompt
print(res)

LangChain最终链的使用

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
import os

load_dotenv()

# 创建提示词
prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic},用中文回答,并带着中英对应")

# 创建llm模型
model = ChatOpenAI(api_key=os.getenv("api_key"),
                   base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
                   model="qwen-plus")
# 创建输出解释器
output_parser = StrOutputParser()
# 使用chain链在一起
chain = prompt | model | output_parser
print(chain.invoke({"topic": "ice cream"}))


img

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐