langchain LCEL,prompt模块,outputparse输出模块

目录

基本代码

prompt模块

prompt模版控制长度

outputparse格式化输出

并行使用调用链


LangChain表达式语言,或者LCEL,是一种声明式的方式,可以轻松地将链条组合在一起

langchian 可以使用 通义千问,我们用通义千问,用法也要申请 api:通义千问API如何使用_模型服务灵积(DashScope)-阿里云帮助中心

然后再代码目录创建一个 .env 文件,用来保存 api-key,例如

DASHSCOPE_API_KEY=sk-xxxxxxxxxx

这样就可以用了,就不需要官网默认示例的 openai 了,那个比较麻烦。

基本代码

python 复制代码
import os
from dotenv import load_dotenv
from langchain_community.llms import Tongyi
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser


load_dotenv('key.env')  # 指定加载 env 文件
key = os.getenv('DASHSCOPE_API_KEY')  # 获得指定环境变量
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]  # 获得指定环境变量

model = Tongyi(temperature=1)
# 设定系统上下文,构建提示词
template = """请扮演一位资深的技术博主,您将负责为用户生成适合在微博发送的中文帖文。
请把用户输入的内容扩展成 140 字左右的文字,并加上适当的 emoji 使内容引人入胜并专业。"""

# 创建提示词对象,用于显示给用户的最终提示
prompt = ChatPromptTemplate.from_messages([("system", template), ("human", "{input}")])

# 通过 LCEL 构建调用链并执行得到文本输出
# StrOutputParser() 模型对象的输出转为字符串
chain = prompt | model | StrOutputParser()
res = chain.invoke({"input": "给大家推荐一本新书《LangChain实战》,让我们一起开始来学习 LangChain 吧!"})
print(res)

prompt模块

上面的提示词不带参数,我们使用 langchain 的 prompt 模块来做一个带参数的提示词

python 复制代码
import os
from dotenv import load_dotenv
from langchain_community.llms import Tongyi
from langchain_core.prompts import ChatPromptTemplate


load_dotenv('key.env')  # 指定加载 env 文件
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]  # 获得指定环境变量
prompt = ChatPromptTemplate.from_template("请编写一篇关于{topic}的中文小故事,不超过100字")
model = Tongyi(temperature=1)
chain = prompt | model
res = chain.invoke({"topic": "小白兔"})
print(res)

对话提示词模版

python 复制代码
import os
from dotenv import load_dotenv
load_dotenv('key.env')  # 指定加载 env 文件
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]  # 获得指定环境变量


from langchain_core.prompts import ChatPromptTemplate

chat_template = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a helpful AI bot. Your name is {name}."),
        ("human", "Hello, how are you doing?"),
        ("ai", "I'm doing well, thanks!"),
        ("human", "{user_input}"),
    ]
)
res = chat_template.format_messages(name="Bob", user_input="What is your name?")
print(res)

prompt模版控制长度

示例选择器

可以根据用户输入的长度,输入较长选择更多示例,输入较短选择更少示例

python 复制代码
import os
from dotenv import load_dotenv
load_dotenv('key.env')  # 指定加载 env 文件
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]  # 获得指定环境变量


from langchain_core.prompts import PromptTemplate
from langchain_core.prompts import FewShotPromptTemplate
from langchain.prompts.example_selector import LengthBasedExampleSelector

# 创建一些反义词输入输出的示例内容
examples = [
    {"input": "happy", "output": "sad"},
    {"input": "tall", "output": "short"},
    {"input": "energetic", "output": "lethargic"},
    {"input": "sunny", "output": "gloomy"},
    {"input": "windy", "output": "calm"},
]

example_prompt = PromptTemplate(
    input_variables=["input", "output"],
    template="Input: {input}\nOutput: {output}",
)
example_selector = LengthBasedExampleSelector(
    examples=examples,
    example_prompt=example_prompt,
    # 设定期望的示例文本长度
    max_length=25
)
dynamic_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    # 设置示例以外部分的前置文本
    prefix="Give the antonym of every input",
    # 设置示例以外部分的后置文本
    suffix="Input: {adjective}\nOutput:\n\n",
    input_variables=["adjective"],
)

# 当用户输入的内容比较少时,所有示例都足够被使用
print(dynamic_prompt.format(adjective="big"))

# 当用户输入的内容足够长时,只有少量示例会被引用
long_string = "big and huge and massive and large and gigantic and tall and much much much much much bigger than everything else"
print(dynamic_prompt.format(adjective=long_string))

outputparse格式化输出

使用 PydanticOutputParser 控制输出格式

python 复制代码
from typing import List

from langchain_core.prompts import PromptTemplate
from langchain_community.llms.ollama import Ollama
from langchain.output_parsers import PydanticOutputParser
from langchain.pydantic_v1 import BaseModel, Field

class Actor(BaseModel):
    name: str = Field(description="name of an author")
    book_names: List[str] = Field(description="list of names of book they wrote")


actor_query = "随机生成一位知名的作家及其代表作品"

parser = PydanticOutputParser(pydantic_object=Actor)

prompt = PromptTemplate(
    template="请回答下面的问题:\n{query}\n\n{format_instructions}\n如果输出是代码块,请不要包含首尾的```符号",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)

input = prompt.format_prompt(query=actor_query)
print(input)

model = Ollama(model="llama2-chinese:13b")
output = model(input.to_string())

print(output)
parser.parse(output)

并行使用调用链

python 复制代码
import os
from dotenv import load_dotenv
from langchain_community.llms import Tongyi
load_dotenv('key.env')  # 指定加载 env 文件
key = os.getenv('DASHSCOPE_API_KEY')  # 获得指定环境变量
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]  # 获得指定环境变量
model = Tongyi(temperature=1)



from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel


joke_chain = ChatPromptTemplate.from_template("讲一句关于{topic}的笑话") | model
poem_chain = ChatPromptTemplate.from_template("写一首关于{topic}的短诗") | model

# 通过 RunnableParallel(也可以叫做 RunnableMap)来并行执行两个调用链
map_chain = RunnableParallel(joke=joke_chain, poem=poem_chain)
print(map_chain.invoke({"topic": "小白兔"}))
相关推荐
有梦想的刺儿4 分钟前
webWorker基本用法
前端·javascript·vue.js
P.H. Infinity8 分钟前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天12 分钟前
java的threadlocal为何内存泄漏
java
caridle24 分钟前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
cy玩具24 分钟前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
萧鼎27 分钟前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸28 分钟前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农28 分钟前
Python 继承、多态、封装、抽象
开发语言·python
^velpro^29 分钟前
数据库连接池的创建
java·开发语言·数据库
苹果醋333 分钟前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx