Prompt
对于 Prompt Template,在 LangChain 中,又涵盖了多个子组件,例如:角色提示模板、消息占位符、文本提示模板、聊天消息提示模板、提示、消息等
-
不同 Prompt 组件功能的简介:
- PromptTemplate:用于创建文本消息提示模板,用于用于与大语言模型/文本生成模型进行交互。
- ChatPromptTemplate:用于创建聊天消息提示模板,一般用于与聊天模型进行交互。
- MessagePlaceholder:消息占位符,在聊天模型中对不确定是否需要的消息进行占位。
- SystemMessagePromptTemplate:用于创建系统消息提示模板,角色为系统。
- HumanMessagePromptTemplate:用于创建人类消息提示模板,角色为人类。
- AIMessagePromptTemplate:用于创建AI消息提示模板,角色为AI。
- PipelinePromptTemplate:用于创建管道消息,管道消息可以将提示模板作为变量进行快速复用。
-
Prompt 不同方法的功能简介:
- partial:用于格式化提示模板中的部分变量。
- format:传递变量数据,格式化提示模板为文本消息。
- invoke:传递变量谁,格式化提示模板为提示。
- to_string:将提示/消息提示列表转换成字符串。
- to_messages:用于将消息提示列表转换成字符串
invoke 的结果也就是 prompt_value ,可以直接传递给大模型,所以用invoke的频率比 format 多,invoke的结果,也可以 toString变成文本 py版本,Prompt的模板可以相加当做拼接,js版本不行
Model
- LangChain 为两种类型的模型提供接口和集成
-
LLM:使用纯文本作为输入和输出的大语言模型。
-
Chat Model:使用聊天消息列表作为输入并返回聊天消息的聊天模型。
-
调用大模型最常用的方法为
- invoke:传递对应的文本提示/消息提示,大语言模型生成对应的内容。
- batch:invoke 的批量版本,可以一次性生成多个内容。
- stream:invoke 的流式输出版本,大语言模型每生成一个字符就返回一个字符。
Message组件
- Modal调用 invoke 的结果就是 Message组件
- 在 LangChain 中,Message 是消息组件,并且所有消息都具有 type(类型) 、 content(内容) 、 response_metadata(响应元数据)
OutputParser 输出解析器
- 简单拆解: 输出解析器 = 预设提示 + 解析功能
- 如果使用的模型支持 Function Calling 或者 Tool Calling,可以不使用解析器,而是直接定义一个函数, 规定它的函数参数为对应要解析的格式,并强制模型调用这个函数,模型就可以精准无误地按照特定的 约束输出。
RunnableParallel 并行运行
- RunnableParallel 可以让我们同时执行多条 Chain,然后以字典的形式返回各个 Chain 的结果
- 除了并行执行,RunnableParallel 还可以用于操作 Runnable 的输出,用于产生符合下一个 Runnable 组件的数据。
// 这个返回的是一个 runnable_map
const map_chain = RunnableParallel.from({
a: () => '222',
b: () => '333',
});
console.log('=>res', await map_chain.pipe(chain).invoke({}));
RunnableLambda
- 用于将js的一个函数包装成 runnable 函数
RunnableAssign
- 给后面加参数
// 加了一个 a:666
const mapper = RunnableParallel.from({
a: RunnableLambda.from(() => 666),
});
const runnableAssign = new RunnableAssign({ mapper })
await runnableAssign.pipe(chain).invoke({ b: 222 })
Callbacks 回调
- 实现 BaseCallbackHandler 抽象方法
import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
class LLMOpsCallbackHandler extends BaseCallbackHandler {
name = 'LLMOps';
async handleLLMStart(llm: any, prompts: any, _: any, __: any, ___: any) {
console.log('LLMOps handleLLMStart', llm, prompts);
}
async handleLLMEnd(output: any) {
console.log('LLMOps handleLLMEnd', output);
}
async handleLLMError(err: any) {
console.log('LLMOps handleLLMError', err);
}
}
- 在构建 chain 的时候,加上 callbacks
// 不推荐
const llm = new ChatOpenAI({
modelName: 'gpt-3.5-turbo-16k',
configuration: {
baseURL: this.configService.get('OPENAI_API_BASE_URL'),
},
// callbacks: [new LLMOpsCallbackHandler()], // 不推荐在这里配置
});
// 推荐
const chain = prompt
.pipe(llm)
.pipe(parser)
.withConfig({ callbacks: [new LLMOpsCallbackHandler()] });
相关系列文章
- 5分钟学会LLM开发系列教程(一) Chain的一切都是Runnable
- 5分钟学会LLM开发系列教程(二) 给Chain加上长期记忆吧Memory
- 5分钟学会LLM开发系列教程(三)知识库检索的利器 RAG
- 5分钟学会LLM开发系列教程(四)Agent来源于 Tool 工具的使用
- 5分钟学会LLM开发系列教程(五)Agent的最终形态LangGraph
- 5分钟学会LLM开发系列教程(六)LangChain集成Milvus向量数据库
ps:如果大家有疑惑的地方,可以私信咨询我哦~旨在帮助开发者入门生产级别的AI编程