一、LLM接入LangChain
1. LangChain中LLM组成
与LLM API
原生调用方法不同,在LangChain
中,LLM调用过程高度抽象,其由模型(Model)、提示词模版(Prompt Template)、输出解析器(Output parser) 组成;如上图所示:
-
提示词模版
:将用户输入添加到一个提示词模板中,这个提示词模版提供有关当前特定任务的附加上下文,构建出适用于特定任务的提示词; -
模型
:LangChain
集成的各大平台模型,如ChatGPT、Claude、Mistral、ChatGLM; -
**
输出解析器
**:OutputParsers
将LLM的原始输出转换为可以在下游使用的格式,如json
;
具体内容如下:
①提示词模版
作者在本系列的第一篇文章中就强调:**提示词工程是LLM开发者重要的知识基础和必备技能,而此处的提示词模版就是提示词工程的一个应用载体
;通过构建提示词模版,我们可以减少开发过程中的输入,优化用户体验,提高RAG应用处理速度;**
unsetunset核心思想unsetunset
-
1. 模版创建
-
2. 用户输入
-
3. 提示词打包
unsetunset原生实现unsetunset
# 原生构建提示词模版 template = """请你将由三个反引号分割的文本翻译成英文!\ text: ```{text}```""" # 用户输入 text = "Babylon是一个开源的JavaScript解析器和代码转换工具,用于分析和转换JavaScript代码。它是由Microsoft开发的,旨在提供一个高性能、可扩展和可靠的解析器,用于支持各种JavaScript工具和框架。" # prompt打包 prompt = template.format(text=text) print(prompt)
运行查看结果:
unsetunsetLangChain实现unsetunset
# LangChain实现 from langchain.prompts.chat import ChatPromptTemplate # system prompt template template = "你当前是一个翻译助手,请将 {input_language} 翻译成 {output_language}." human_template = "翻译内容:{text}" chat_prompt = ChatPromptTemplate.from_messages([ ("system", template), ("human", human_template), ]) text = "Babylon是一个开源的JavaScript解析器和代码转换工具,用于分析和转换JavaScript代码。" messages = chat_prompt.format_messages(input_language="中文", output_language="英文", text=text) print(messages) print("---------") print(messages[0].content)
运行查看结果:
可以看到,在LangChain
中,ChatPromptTemplate
不仅支持用户输入HumanMessage
的提示词模版,也支持系统提示system prompt
的提示词模版;通过区分系统提示词和用户输入提示词,可以在进行重复性任务时,固定system prompt
,只改变用户输入以降低工作量和时间成本;
Langchain中,一个
ChatPromptTemplate
是一个ChatMessageTemplate
的列表。
ChatMessageTemplate
系统提示词模版,
ChatMessageTemplate
用户输入提示词模版
我们将打包好的提示词输入给LLM输出一下:
# 运行测试 import os import openai from dotenv import load_dotenv, find_dotenv from langchain_mistralai.chat_models import ChatMistralAI # 读取本地/项目的环境变量。 # find_dotenv()寻找并定位.env文件的路径 # load_dotenv()读取该.env文件,并将其中的环境变量加载到当前的运行环境中 _ = load_dotenv(find_dotenv()); # 如果环境变量是全局的,这行代码可以省略 # 获取环境变量 OPENAI_API_KEY api_key = os.environ['MISTRAL_API_KEY'] # 实例化一个ChatMistralAI类:然后设置其Mistral API_KEY; llm = ChatMistralAI(api_key=api_key) print(llm) # 做一个输出 output = llm.invoke(messages) print(output.content) # 其返回结果也是一个Message对象
可以看到,内容已经成功翻译;
②模型
在过去的文章中,作者说明了LLM是RAG应用的核心,而LangChain
提供了对于多种大模型的封装,基于 LangChain
的接口可以便捷地调用 LLM
并将其集成在以 LangChain
为基础框架搭建的RAG个人应用中