首页 > 其他分享 >LangChain补充一:一些小且有用的点

LangChain补充一:一些小且有用的点

时间:2024-07-17 20:42:17浏览次数:15  
标签:调用 prompt chain 模型 langchain 有用 LangChain import 小且

一:LangChain 表达式语言LCEL(LangChain Expression Language)

chain:我们可以将包括大模型调用在内的一组操作组成“链条”,即所谓“调用链”

(一)概念

LangChain 提供的 LangChain Expression Language(LCEL) 让开发可以很方便地将多个组件连接成 AI 工作流(或者说是调用链)。如下是一个简单的工作流:
chain = prompt | chatmodel | outputparser
chain.invoke({"input":"What's your name?")
View Code 其中,通过由|管道操作符连接而成的 LangChain 表达式,我们方便地将三个组件 prompt chatmodel outparser 按顺序连接起来,这就形成了一个 AI 工作流。 invoke()则是实际运行这个工作流。 我们还可以组织较为复杂的 AI 工作流,如下所示,其中进行两次模型调用,并且示例中用的两个不同的模型。
chain = (
        prompt | chatmodel | outputparser |
        second_prompt | model2 | finalparser
        )
chain.invoke("input":"waht's AI?")
View Code

(二):通过LCEL实现多次调用模型

多次调用模型,分步来进行操作,从而利用模型的能力得到更符合期待的结果。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from IPython.display import Markdown

llm = ChatOpenAI(
    model_name="gpt-4-1106-preview"    #创建聊天模型示例。这里采用 gpt-4-1106-preview 模型
)

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are world class technical documentation writer."),
    ("user", "{input}")
])    #创建第一次模型调用的提示语模板。其中系统提示语是“You are world class technical documentation writer.”(你是一个世界级的技术文档编写者。)

translate_prompt = ChatPromptTemplate.from_messages([
    ("system", "Translate to simplified Chinese."),
    ("user", "{input}")
])    #创建第二次模型调用的提示语模板。其中系统提示语是“Translate to simplified Chinese.”(翻译为简体中文。)

output_parser = StrOutputParser()    #StrOutputParser,它可将输出解析为易读的文本格式,将 AIMessage 转换成 string

chain = prompt | llm | output_parser \
        | {"input": RunnablePassthrough()} \
        | translate_prompt | llm | output_parser    #建立调用链。其中用 RunnablePassthrough() 将第一次模型的输出作为第二次的输入。

output = chain.invoke({"input": "what's generative ai?"})
View Code 注意:其中用 RunnablePassthrough() 将第一次模型的输出作为第二次的输入

二:结合LCEL实现对输出的处理

之前是第五期 LangChain学习调用模型获取返回结果之后,调用解析器进行解析,这里是通过LCEL链接输出处理步骤。链接调用链时,解析部分parser会注入指令到prompt中去 首先,我们用 Pydnatic 定义一个对象:
# 用 Pydantic 定义输出的 JSON 格式
from langchain_core.pydantic_v1 import BaseModel, Field

# Define your desired data structure.
class Joke(BaseModel):
    setup: str = Field(description="question to set up a joke")
    punchline: str = Field(description="answer to resolve the joke")
View Code 然后,我们调用模型,并指示模型输出 JSON 格式:
from langchain_core.output_parsers import JsonOutputParser
from langchain.prompts import ChatPromptTemplate

chatmodel = ChatOpenAI()

joke_query = "Tell me a joke."

# Set up a parser + inject instructions into the prompt template.
parser = JsonOutputParser(pydantic_object=Joke)

prompt_template = ChatPromptTemplate.from_messages(
    [
      ("system", "Answer the user query.\n{format_instructions}"),
      ("user", "{query}")
    ])

chain = prompt_template | chatmodel | parser

#print(parser.get_format_instructions())

chain.invoke(
    {"query": joke_query,
     "format_instructions": parser.get_format_instructions()
    })
View Code 其中get_format_instructions指示我们如何将llm的输出进行格式化,需要注入到prompt中

补充1:两种引入prompt模板的方式其实最后都是走到langchain_core.prompts,如果要使用第二个,需要使用pip install langchain安装

from langchain_core.prompts import ChatPromptTemplate
from langchain.prompts import ChatPromptTemplate
View Code

补充2:目前的例子中我们对prompt提示语的输入参数都是在最后面invoke时填充进去的,还可以使用partial()逐步的填充提示语的输入参数

# 4. 创建模板
prompt_template = ChatPromptTemplate.from_messages(
    [
      ("system", "Answer the user query.\n{format_instructions}"),
      ("user", "{query}")
    ])

# 5. 在模板中部分填充输出要求
prompt_partial_filled = prompt_template.partial(
  format_instructions=parser.get_format_instructions()
)

# 6. 生成调用链
chain = prompt_partial_filled | chatmodel | parser

# 7. 调用模型
joke_query = "Tell me a joke."

chain.invoke({"query": joke_query})
View Code

三:将结果流式输出

  • 将模型设为流式输出;
  • 调用采用stream()而非invoke()
  • 从开始接收到输出时就逐一打印。
chatmodel = ChatOpenAI(
    streaming=True
)

prompt_template = ChatPromptTemplate.from_messages([
    ("system", "You are world class technical documentation writer."),
    ("user", "{query}")
])

output_parser = StrOutputParser()
chain = prompt_template | chatmodel | output_parser
response = chain.stream({"query": "what's generative ai?"})

for value in response:
print(value, end='', flush=True)    #end=''使得后续的输出会紧接着前面的输出;flush=True意味着每次print调用后,输出缓存都会被清空,确保value被直接显示。
View Code

四:使用OpenAI SDK调用其他兼容/非兼容模型

(一)模型完全兼容OpenAI SDK

采用更改 openai_api_base (alias base_url)和model_name来调用这些模型:
from langchain_openai import ChatOpenAI
api_key = userdata.get('deepseek')
base_url= 'https://api.deepseek.com/v1'
model_name='deepseek-chat'

chatmodel = ChatOpenAI(
     base_url=base_url,
     api_key=api_key,
     model_name=model_name)

chatmodel.invoke("what's generative ai?")
View Code

(二)模型没有完全兼容OpenAI SDK

需要有对应模型的SDK、API,调用对应模型的方法即可,以文心为例:
  1. 注册百度千帆账号,开启相关的模型服务,并充值。你需要获得 API KEY 与 API Secret。我们这里配置的是百度文心(ErnieBot)模型。
  2. 安装 Qianfan SDK:
 pip install qianfan
  1. 设置API key、secret
  2. 调用对应的SDK
from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint

chat = QianfanChatEndpoint(
    qianfan_ak = qf_api_key,
    qianfan_sk = qf_secrect_key,
)

chat([HumanMessage(content="hello there, who are you?")])
View Code

五:少样本模板的构建FewShotChatMessagePromptTemplate

大语言模型是“少样本学习者”(Few shot learner),它能够直接从我们在提示语中提供的样例中学习。除了手工模拟AIMessage和HumanMessage之外,还可以通过FewShotChatMessagePromptTemplate协助完成创建少样本。

1.创建少样本

from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
from langchain_openai import ChatOpenAI

examples = [
    {"input": "2+2", "output": "4"},
    {"input": "2+3", "output": "5"},
]

# This is a prompt template used to format each individual example.
example_prompt = ChatPromptTemplate.from_messages(
    [
        ("human", "{input}"),
        ("ai", "{output}"),
    ]
)
few_shot_prompt = FewShotChatMessagePromptTemplate(
    example_prompt=example_prompt,
    examples=examples,
)

print(few_shot_prompt.format())
View Code

2.添加少样本到message

final_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a wondrous wizard of math."),
        few_shot_prompt,
        ("human", "{input}"),
    ]
)

print(final_prompt.format(input="What's the square of a triangle?"))
 
View Code

 

<iframe style="display: none !important"></iframe>

标签:调用,prompt,chain,模型,langchain,有用,LangChain,import,小且
From: https://www.cnblogs.com/ssyfj/p/18308242

相关文章

  • LangChain补充五:Agent之LangGraph的使用
    一:LangGraph入门https://www.51cto.com/article/781996.htmlhttps://blog.csdn.net/weixin_41496173/article/details/139023846https://blog.csdn.net/wjjc1017/article/details/138518087https://langchain-ai.github.io/langgraph/https://langchain-ai.github.io/langg......
  • LangChain补充四:Agent知识点和案例补充
    https://www.alang.ai/langchain/101/lc07一:基本流程和概念(一)概念LangChainAgent的核心思想是,使用大语言模型选择一系列要执行的动作。在Chain中,一系列动作是硬编码在代码中的。在Agent中,大语言模型被用作推理引擎,以确定要采取的动作及其顺序。它包括3个组件:规划:将任......
  • LangChain让LLM带上记忆
    最近两年,我们见识了“百模大战”,领略到了大型语言模型(LLM)的风采,但它们也存在一个显著的缺陷:没有记忆。在对话中,无法记住上下文的LLM常常会让用户感到困扰。本文探讨如何利用LangChain,快速为LLM添加记忆能力,提升对话体验。LangChain是LLM应用开发领域的最大社区和......
  • 把LangChain跑起来的3个方法
    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来的方法,如有错误欢迎纠正。Langchain官方文档地址:https://python.langchain.com/基......
  • LangChain 快速入门:构建你的第一个智能应用
    引言随着大型语言模型(LLM)的崛起,开发人员现在可以利用这些强大的工具来创建一系列创新的应用程序,从自动文档摘要到聊天机器人,再到智能客服系统。LangChain是一个开源框架,旨在简化与LLM的交互,帮助开发者轻松地构建和部署基于LLM的应用程序。本文将带你快速入门LangChain,通......
  • LangChain与RESTful API的交响曲:开发集成新篇章
    LangChain与RESTfulAPI的交响曲:开发集成新篇章在软件开发中,API(应用程序编程接口)是系统间交互的桥梁。RESTfulAPI作为API的一种风格,以其简洁、无状态和可缓存性而广受欢迎。LangChain作为一个多功能的语言处理工具链,其是否支持RESTfulAPI开发取决于其设计目标和集成的组......
  • 函数式编程的交响曲:探索LangChain对函数式编程特性的支持
    函数式编程的交响曲:探索LangChain对函数式编程特性的支持引言在现代软件开发中,函数式编程(FunctionalProgramming,FP)以其独特的优势,如无副作用、易于并行处理等,逐渐受到开发者的青睐。LangChain作为一个多语言编程工具链,其设计理念在于支持多种编程范式,包括函数式编程。......
  • 探索Web开发的无限可能:LangChain支持的Web框架全景
    探索Web开发的无限可能:LangChain支持的Web框架全景引言在现代Web开发中,选择合适的Web框架对于项目的成功至关重要。LangChain作为一个多语言编程工具链,提供了对多种编程语言的Web框架支持,使得开发者可以根据项目需求和技术栈偏好选择合适的框架。本文将详细介绍LangChain......
  • 释放LangChain潜能:精通性能优化的高级技巧
    释放LangChain潜能:精通性能优化的高级技巧引言LangChain作为一个多语言编程工具链,提供了强大的功能来简化开发流程和增强代码的执行效率。然而,随着项目规模的扩大和需求的增长,性能优化成为保持LangChain项目竞争力的关键。本文将深入探讨LangChain的性能优化技巧,包括代码......
  • 掌握异常处理的艺术:LangChain中的错误与异常管理策略
    掌握异常处理的艺术:LangChain中的错误与异常管理策略引言在软件开发中,错误和异常处理是保证程序稳定性和健壮性的关键。LangChain作为一个多语言编程工具链,提供了一套完善的错误和异常处理机制。本文将详细探讨LangChain如何处理错误和异常,包括错误捕获、异常抛出、自定义......