Skip to main content

模型输入/输出

模型输入/输出


任何语言模型应用程序的核心要素都是......模型。LangChain 为您提供了与任何语言模型接口的构建模块。


提示: 模板化、动态选择和管理模型输入

语言模型: 通过通用接口调用语言模型

输出解析器: 从模型输出中提取信息

model_io_diagram
提示

对模型进行编程的新方法是通过提示。提示指的是对模型的输入。这种输入通常由多个组件构成。LangChain 提供了多个类和函数,使提示的构建和使用变得简单。

提示模板: 参数化模型输入
示例选择器: 动态选择要包含在提示中的示例

提示模板

语言模型将文本作为输入--这些文本通常被称为提示。通常,提示不是简单的硬编码字符串,而是模板、一些示例和用户输入的组合。LangChain 提供了多个类和函数,可以轻松构建和使用提示。

什么是提示模板?

提示模板指的是生成提示的可重现方式。它包含一个文本字符串("模板"),可接收终端用户的一组参数并生成提示。

提示模板可以包含

对语言模型的说明、
帮助语言模型生成更好回复的一些示例、
向语言模型提出的问题。
下面是一个最简单的例子:

from langchain import PromptTemplate


template = """\
You are a naming consultant for new companies.
What is a good name for a company that makes {product}?
"""

prompt = PromptTemplate.from_template(template)
prompt.format(product="colorful socks")

You are a naming consultant for new companies.
What is a good name for a company that makes colorful socks?

创建提示模板

您可以使用 PromptTemplate 类创建简单的硬编码提示。提示模板可接受任意数量的输入变量,并可按格式生成提示。

from langchain import PromptTemplate

# An example prompt with no input variables
no_input_prompt = PromptTemplate(input_variables=[], template="Tell me a joke.")
no_input_prompt.format()
# -> "Tell me a joke."

# An example prompt with one input variable
one_input_prompt = PromptTemplate(input_variables=["adjective"], template="Tell me a {adjective} joke.")
one_input_prompt.format(adjective="funny")
# -> "Tell me a funny joke."

# An example prompt with multiple input variables
multiple_input_prompt = PromptTemplate(
    input_variables=["adjective", "content"], 
    template="Tell me a {adjective} joke about {content}."
)
multiple_input_prompt.format(adjective="funny", content="chickens")
# -> "Tell me a funny joke about chickens."

如果不想手动指定输入变量,也可以使用 from_template 类方法创建 PromptTemplate。

template = "Tell me a {adjective} joke about {content}."

prompt_template = PromptTemplate.from_template(template)
prompt_template.input_variables
# -> ['adjective', 'content']
prompt_template.format(adjective="funny", content="chickens")
# -> Tell me a funny joke about chickens.

您可以创建自定义提示模板,以您想要的任何方式格式化提示。更多信息,请参阅自定义提示模板。

聊天提示模板

聊天模型将聊天信息列表作为输入,该列表通常称为提示。这些聊天信息不同于原始字符串(您将把原始字符串传入 LLM 模型),因为每条信息都与一个角色相关联。

例如,在 OpenAI 聊天完成 API 中,聊天信息可以与人工智能、人类或系统角色相关联。该模型应该更紧密地遵循系统聊天信息的指令。

LangChain 提供了多个提示模板,可以轻松构建和使用提示。我们鼓励您在查询聊天模型时使用这些与聊天相关的提示模板,而不是 PromptTemplate,以充分挖掘底层聊天模型的潜力。

from langchain.prompts import (
    ChatPromptTemplate,
    PromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)

要创建与角色相关联的消息模板,需要使用 MessagePromptTemplate。

为方便起见,模板上有一个 from_template 方法。如果您要使用这个模板,它会是这个样子:

template="You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

如果您想更直接地构建 MessagePromptTemplate,可以在外部创建一个 PromptTemplate,然后将其传入,例如

prompt=PromptTemplate(
    template="You are a helpful assistant that translates {input_language} to {output_language}.",
    input_variables=["input_language", "output_language"],
)
system_message_prompt_2 = SystemMessagePromptTemplate(prompt=prompt)

assert system_message_prompt == system_message_prompt_2

然后,你可以从一个或多个 MessagePromptTemplate 创建一个 ChatPromptTemplate。您可以使用 ChatPromptTemplate 的 format_prompt -- 它会返回一个 PromptValue,您可以将其转换为字符串或 Message 对象,具体取决于您是否想将格式化后的值作为 llm 或聊天模型的输入。

chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])

# get a chat completion from the formatted messages
chat_prompt.format_prompt(input_language="English", output_language="French", text="I love programming.").to_messages()

    [SystemMessage(content='You are a helpful assistant that translates English to French.', additional_kwargs={}),
     HumanMessage(content='I love programming.', additional_kwargs={})]

Comments

Popular posts from this blog

Think in 2B SaaS

这数年2B SaaS创业经历,让我自己从一个对2B SaaS有着盲目疯狂热情的人,变的逐渐趋于冷静。如何推动建立一个健康的SaaS产品和公司,成了我特别想去思考和解决的问题。 这几年,个人和公司一直都是在野蛮生长,销售驱动的模型下,产品,销售,交付,客户成功都在疲于奔命完成财务业绩。在没有坚持跑出一套聚焦于SaaS领域,可以合力的运作体系下,争执和冲突便成了家常便饭。 销售往往因产品没有某个功能,吐槽产品不给力。因为研发不能按时做出一个客户要的功能,吐槽产品无能,因为找不到客户,所以开始盯着老客户的增购业绩,盯着传统实施项目规模带来的业绩收益。 交付因为销售的过度承诺,卖出产品没有的功能,或者实施过程中细节点产品不支持的能力,吐槽销售,吐槽研发,实施过程变得举步维艰。 CS因为交付质量,产品功能,系统服务的稳定性,导致客户关系紧张,出问题后花费大量时间灭火。或者处理因为bug带来的系统数据不一致的问题。在发生了集成对接的情况下,甚至要协调下游各个系统修复数据,带来的服务成本的增长。增购也就自然而然变得困难。 产研觉得产品功能自己都无法进行规划管理,总是被动的被销售和交付过程中客户的紧急需求干扰,仓促设计的结果就是应用架构设计上的疏忽,开发的bug,业务场景的缺失。 上述的过程,可能很多初始的SaaS创业团队都会碰到,特别是2B领域的。协同的不好,矛盾冲突屡屡发生,不产生合力的情况下,为了维持高业绩增长的要求,内部的负担愈发严重,跑的越来越慢,整体的服务质量情况却没有一个明显的提升。由此引发的各个职能的一线的员工的工作感受也越来越差。推诿,委屈,困惑,气忿等负面情绪也与日俱增。 因此,如何科学的构建一个可以上下协同的组织,如何管理需求,如何管理迭代,如何找到目标客户,如何快速的实施落地,如何更好的保持客户粘性,给客户带来持续不断的新鲜感,配合客户业务的发展需要,就需要进行一套科学的管理办法。无序和杂乱只会让增长越来越缓慢。

MAC Homebrew安装了zookeeper 但是stop时报错

执行下面的命令的时候报错,找不到对应路径下的pid文件。 zkserver stop /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/etc/zookeeper/zoo.cfg Stopping zookeeper ... no zookeeper to stop (could not find file /usr/local/var/run/zookeeper/data/zookeeper_server.pid) 查了网上很多地方,很多人说是data路径中的空格问题,但是查了配置文件发现并不是。 错误信息里面说是pid文件找不到路径,所以,怀疑是读写权限或者是别的什么异常原因导致当时pid文件没有生成。 试着用sudo权限重新执行 sudo zkserver restart Password: /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/etc/zookeeper/zoo.cfg /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/etc/zookeeper/zoo.cfg Stopping zookeeper ... no zookeeper to stop (could not find file /usr/local/var/run/zookeeper/data/zookeeper_server.pid) /usr/bin/java ZooKeeper JMX enabled by default 结果在目录下找到了对应的pid文件。 查看pid文件内容,发现就是一个进程id。这时候考虑修改pid文件的内容,把当前停不下来的进程编号写进去。 然后重新执行了zkserver stop命令。 sudo zkserver stop /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/etc/zookeeper/zoo.cfg Stopping zookeeper ... STOPPED 搞定...

FAISS Vector DB 学习笔记(一)

 1. 安装Faiss: 按照Faiss官方资源库提供的安装说明,确保你有必要的依赖和兼容的硬件(如果使用GPU加速)。 2. 2.准备好你的数据: Faiss使用密集向量工作,所以确保你的数据以浮点数组或矩阵的形式表示,其中每一行对应一个向量。确保你的向量的尺寸是一致的。 3. 导入必要的模块: 在你的Python脚本中,导入所需的Faiss模块: ``python import faiss import numpy as np ``` 4. 创建一个索引: 根据你的需要,选择适当的索引类型。下面是一个创建IndexFlatL2索引的例子: ```python d = 128  # Dimension of your vectors index = faiss.IndexFlatL2(d)  # Initialize the index ``` 你可以探索其他的索引类型,比如IndexIVFFlat或IndexHNSW,这取决于你愿意做出的折衷。 5. 为索引添加向量: 一旦你初始化了你的索引,使用`add'方法将你的向量添加到它里面。传入一个NumPy数组或一个兼容的数据结构: ``python vectors = np.random.random((1000, d)).astype('float32')  # Example vectors index.add(vectors)  # Add the vectors to the index ``` 6. 进行相似性搜索: 要为一个查询向量找到最近的邻居,可以使用`search`方法。传入查询向量和需要检索的近邻数量: ``python k = 5  # Number of nearest neighbors to retrieve query_vector = np.random.random((1, d)).astype('float32')  # Example query vector D, I = index.search(query_vector, k)  # Perform the search ``` 返回的`D`数组包含与最近的邻居的距离,`I`数组包含它们在原始数据集中的相应索引。 7. 自定义和优化: Faiss...