LangChain六大组件(一)| 豆包MarsCode AI 刷题

204 阅读7分钟

LangChain六大组件(一)

image.png

LangChain六大组件

Model I/O

我们可以把对模型的使用过程拆解成三块,分别是输入提示(对应图中的Format)、调用模型(对应图中的Predict)和输出解析(对应图中的Parse)。这三块形成了一个整体,因此在LangChain中这个过程被统称为 Model I/O(Input/Output)。

功能:Model I/O是LangChain与语言模型交互的接口。它允许用户将输入数据传递给语言模型,并接收模型生成的输出。 image.png

  1. 提示模板:使用模型的第一个环节是把提示信息输入到模型中,你可以创建LangChain模板,根据实际需求动态选择不同的输入,针对特定的任务和应用调整输入。
  2. 语言模型:LangChain允许你通过通用接口来调用语言模型。这意味着无论你要使用的是哪种语言模型,都可以通过同一种方式进行调用,这样就提高了灵活性和便利性。
  3. 输出解析:LangChain还提供了从模型输出中提取信息的功能。通过输出解析器,你可以精确地从模型的输出中获取需要的信息,而不需要处理冗余或不相关的数据,更重要的是还可以把大模型给回的非结构化文本,转换成程序可以处理的结构化数据。

提示模板

基本概念

提示模板是LangChain中用于指导语言模型生成特定类型响应的预定义文本模板。这些模板允许用户根据实际需求动态选择不同的输入,并针对特定的任务和应用调整输入内容。通过提示模板,用户可以更加灵活地利用语言模型,实现更精准的输出控制。

功能与特点

  • 动态选择输入:提示模板允许用户根据任务需求动态选择输入内容,这使得模板能够适用于各种特定任务和应用场景。
  • 增强可读性: 清晰易懂的提示模板可以提高文本的可读性,使得模型更容易理解输入内容,并生成相关且连贯的输出。
  • 提高重用性: 使用模板可以在多个地方重复使用,无需重复构建提示字符串,从而简化了代码并提高了开发效率。
  • 简化维护:当需要更改提示内容时,只需修改模板即可,无需逐个查找所有用到该提示的地方,这大大降低了维护成本。
  • 智能处理变量: 模板可以自动处理变量的插入,无需手动拼接字符串,这提高了输入的准确性和效率。
  • 参数化生成: 模板可以根据不同的参数生成不同的提示,这有助于个性化文本生成,满足不同用户的需求。

样例

from langchain import PromptTemplate

template = """\
你是一名资深的大学计算机学院的教师。\
你需要为一个学生的{lesson}课程提供学习方法。\
请你用中文回答。\
"""
prompt = PromptTemplate.from_template(template)

print(prompt.format(lesson="Java编程"))

我们构建好这个提示模板之后,把提示输入到大语言模型中。

import os
from langchain_openai import ChatOpenAI

chat = ChatOpenAI(
    model=os.environ.get("LLM_MODELEND"),
)

print(chat(prompt.format(lesson="Java编程")))

你就会得到:

image.png

语言模型

LangChain中支持的模型有三大类。

  1. 大语言模型(LLM) ,也叫Text Model,这些模型将文本字符串作为输入,并返回文本字符串作为输出。Open AI的text-davinci-003、Facebook的LLaMA、ANTHROPIC的Claude,都是典型的LLM。
  2. 聊天模型(Chat Model),主要代表Open AI的ChatGPT系列模型。这些模型通常由语言模型支持,但它们的 API 更加结构化。具体来说,这些模型将聊天消息列表作为输入,并返回聊天消息。
  3. 文本嵌入模型(Embedding Model),这些模型将文本作为输入并返回浮点数列表,也就是Embedding。而文本嵌入模型如OpenAI的text-embedding-ada-002,我们之前已经见过了。文本嵌入模型负责把文档存入向量数据库,和我们这里探讨的提示工程关系不大。

重复使用提示模板,可以同时生成多个鲜花的文案。

# 导入LangChain中的提示模板
from langchain import PromptTemplate
# 创建原始模板
template = """您是一位专业的鲜花店文案撰写员。\n
对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?
"""
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template) 
# 打印LangChain提示模板的内容
print(prompt)

# 设置OpenAI API Key
import os
os.environ["OPENAI_API_KEY"] = '你的Open AI API Key'

# 导入LangChain中的OpenAI模型接口
from langchain import OpenAI
# 创建模型实例
model = OpenAI(model_name='gpt-3.5-turbo-instruct')

# 多种花的列表
flowers = ["玫瑰", "百合", "康乃馨"]
prices = ["50", "30", "20"]

# 生成多种花的文案
for flower, price in zip(flowers, prices):
    # 使用提示模板生成输入
    input_prompt = prompt.format(flower_name=flower, price=price)

    # 得到模型的输出
    output = model.invoke(input_prompt)

    # 打印输出内容
    print(output)

输出解析

为什么需要输出解析器?

结构化数据:生成模型的输出通常是非结构化的文本。输出解析器可以将这些文本转换为结构化的数据格式,使其更易于处理和分析。

自动化处理:通过将生成的文本解析为结构化数据,可以更容易地进行自动化处理,例如存储、搜索和计算。

减少错误:通过预定义的解析规则,可以减少人工解析文本时可能出现的错误。

增强可读性:结构化的数据通常比纯文本更易于理解和使用。

————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/datian1234/article/details/141091247

下面,我们就通过LangChain的输出解析器来重构程序,让模型有能力生成结构化的回应,同时对其进行解析,直接将解析好的数据存入CSV文档。

# 导入OpenAI Key
import os
os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'

# 导入LangChain中的提示模板
from langchain.prompts import PromptTemplate
# 创建原始提示模板
prompt_template = """您是一位专业的鲜花店文案撰写员。
对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?
{format_instructions}"""

# 通过LangChain调用模型
from langchain_openai import OpenAI
# 创建模型实例
model = OpenAI(model_name='gpt-3.5-turbo-instruct')

# 导入结构化输出解析器和ResponseSchema
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
# 定义我们想要接收的响应模式
response_schemas = [
    ResponseSchema(name="description", description="鲜花的描述文案"),
    ResponseSchema(name="reason", description="问什么要这样写这个文案")
]
# 创建输出解析器
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

# 获取格式指示
format_instructions = output_parser.get_format_instructions()
# 根据原始模板创建提示,同时在提示中加入输出解析器的说明
prompt = PromptTemplate.from_template(prompt_template, 
                partial_variables={"format_instructions": format_instructions}) 

# 数据准备
flowers = ["玫瑰", "百合", "康乃馨"]
prices = ["50", "30", "20"]

# 创建一个空的DataFrame用于存储结果
import pandas as pd
df = pd.DataFrame(columns=["flower", "price", "description", "reason"]) # 先声明列名

for flower, price in zip(flowers, prices):
    # 根据提示准备模型的输入
    input = prompt.format(flower_name=flower, price=price)

    # 获取模型的输出
    output = model.invoke(input)
    
    # 解析模型的输出(这是一个字典结构)
    parsed_output = output_parser.parse(output)

    # 在解析后的输出中添加“flower”和“price”
    parsed_output['flower'] = flower
    parsed_output['price'] = price

    # 将解析后的输出添加到DataFrame中
    df.loc[len(df)] = parsed_output  

# 打印字典
print(df.to_dict(orient='records'))

# 保存DataFrameCSV文件
df.to_csv("flowers_with_descriptions.csv", index=False)

image.png

总结

提示模板:根据实际需求,创建或使用提示模板,实现动态输入,针对特定的任务和应用调整输入。

语言模型:通过调用大语言模型的接口,得到我们想要的结果。(大语言模型、聊天模型、文本嵌入模型)。

输出解析:为了得到能直接处理的、结构化的数据,通过LangChain的输出解析器来结构化回应,让我们能够的到结构化输出,直接处理输出。