一、什么是LangChain
1、介绍
LangChain是一个用于开发由大型语言模型提供支持的Python框架。它提供了一系列工具和组件,帮助我们将语言模型集成到自己的应用程序中。
有了它之后,我们可以更轻松地实现对话系统、文本生成、文本分类、问答系统等功能。
2、LangChain官网文档
官网:https://python.langchain.com/docs/introduction/
3、LangChain的核心组件
- 语言模型(Model):如OpenAI的GPT-3。
- 提示管理(Prompt):Prompt管理。
- 链(chain):允许将多个组件(如语言模型、提示模板、记忆等)串联起来,形成一个工作流。
- 记忆(Memory):记忆模块用于保存对话历史或上下文信息,以便在后续对话中使用。
- 代理(Agent):代理是一种智能组件,可以根据用户的输入自动选择和执行不同的操作。
- 工具(Tool):工具是一些内置的功能模块,如文本处理工具、数据查询工具等。
二、语言模型
1、介绍
把不同的模型,统一封装成一个接口,方便更换模型而不用重构代码。以下是使用语言模型从输入到输出的基本流程:
一下是对每一块的总结:
- Format(格式化):将原始数据格式化成模型可以处理的形式,插入到一个模版问题中,然后送入模型进行处理。
- Predict(预测):接受被送进来的问题,然后基于这个问题进行预测或生成回答。
- parse(生成):预测输出被进一步格式化成一个结构化的JSON对象。
2、单轮对话
3、多轮对话
# 1、创建模型
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_ollama import ChatOllama
ollama = ChatOllama(base_url='http://localhost:11434', model="qwen2")
messages = [
SystemMessage(content="你是langchain的课程助理。"),
HumanMessage(content="我是学员,我叫 Tom"),
AIMessage(content="欢迎"), # 提前模拟场景,为后续交互做准备
HumanMessage("我是谁,你是谁")
]
print(ollama.invoke(messages).content)
通过这种方式,我们可以:
- 测试AI模型在特定上下文下的表现。
- 确保AI模型能够正确理解并响应用户的输入。
- 调整和优化对话流程,以便在实际应用中提供更好的用户体验。
三、Prompt模板封装
Prompt作为输入的控制是相当重要的。langchain也提供了多种管理方法
1、PromptTemplate
基本的提示模板,可以定义输入变量和模板文本。适用于大多数自定义的提示需求。
from langchain_core.prompts import PromptTemplate
template = """
You are an expert data scientist with an expertise in building deep Learning models. Explain the concept of {concept} in a couple of lines
"""
# 实例化模版的第一种方式
one_prompt = PromptTemplate(template = template, input_variables=["concept"])
# 实例化模版的第二种方式
two_prompt = PromptTemplate.from_template(template)
# 将用户的输入通过format方法嵌入提示模版,并且做格式化处理
final_prompt = two_prompt.format(concept = "hello")
print(final_prompt)
2、ChatPromptTemplate
针对聊天场景的提示模板,支持定义多个角色的消息(用户、AI和系统)
from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate, ChatPromptTemplate
template = """
You are an expert data scientist with an expertise in building deep learning models.
"""
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = """
Explain the concept of {concept} in a couple of lines
"""
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([
system_message_prompt,
human_message_prompt
])
print(chat_prompt.format_prompt(concept = "hello").to_string())
3、FewShotPromptTemplate
Prompt中给几个例子可以让大模型更好地生成正确的结果。这个模板就是给例子的。
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_ollama import ChatOllama
examples = [
{"input":"高", "output":"矮"},
{"input":"胖","output":"瘦"},
{"input":"精力充沛","output":"萎靡不振"},
{"input":"快乐","output":"伤心"},
{"input":"黑", "output":"白"}
]
example_prompt = PromptTemplate(input_variables=["input","output"], template="""
词语:{input}\n
反义词:{output}\n
""")
example_message = example_prompt.format(**examples[0])
#print(example_message)
few_shot_prompt = FewShotPromptTemplate(
examples = examples,
example_prompt = example_prompt,
example_separator = "\n",
prefix = "来玩个反义词接龙游戏,我说词语,你说它的反义词\n",
suffix = "现在轮到你了,词语:{input}\n反义词:",
input_variables = ["input"]
)
ollama = ChatOllama(base_url='http://localhost:11434', model="qwen2")
chain = few_shot_prompt | ollama
print(chain.invoke("精力充沛"))
4、文档模板
simple_prompt.json
{
"_type":"prompt",
"input_variables":[
"name",
"love"
],
"template":"我的名字叫{name},我喜欢{love}"
}
四、格式化输出
1、OutputParser
CSV parser当您想要返回以逗号分隔的项目列表时,可以使用此输出解析器。
from langchain_core.output_parsers import CommaSeparatedListOutputParser
output_parser = CommaSeparatedListOutputParser()
# 返回一些指令或模版,这些指令告诉系统如何解析或格式化输出数据
print(output_parser.get_format_instructions())
# 输入的字符串按照特定的规则进行解析和转换
reply = 'foo,bar,baz'
print(output_parser.parse(reply))