明天你会感谢今天奋力拼搏的你。
ヾ(o◕∀◕)ノヾ
LangChain 是一个用于构建大语言模型(LLM)驱动应用的开发框架,旨在帮助开发者更高效地将 LLM(如 GPT、Claude 等)与外部数据、工具及计算逻辑结合,实现复杂任务的自动化与智能化。
LangChain 简化了 LLM 应用程序生命周期的每个阶段:
LangChain的官方的各产品开源情况:
LangChain 开源框架的结构如下:
在此我们主要介绍开源的LangChain组件,官方文档(以 Python 版为例):
更多LangChain组件可查看官方文档
LangChain支持很多种模型(具体查看官网),它把不同的模型,统一封装成一个接口,方便更换模型而不用重构代码。同时还为监控、调试和优化使用大语言模型(LLMs)的应用程序性能提供了额外功能。
LangChain 拥有许多聊天模型集成,这些集成分为两种类型:
具体哪些是官方模型,哪些是社区模型,可以通过官方网站都有详细介绍。
LangChain 聊天模型的命名遵循一种约定,即在它们的类名前加上“Chat”前缀(例如,ChatOllama、ChatAnthropic、ChatOpenAI 等)。
LangChain为聊天模型定义的统一接口是BaseChatModel。由于 BaseChatModel 也实现了 Runnable(可运行)接口,因此聊天模型支持标准的流式接口、异步编程、优化批处理等功能。
BaseChatModel模型的主要方法:
其他更详细的方法,可查看官方API文档
BaseChatModel提供的标准参数:
标准参数目前仅在具有自身集成包的集成中强制执行(例如 langchain-openai、langchain-anthropic 等),在 langchain-community 中的模型上不强制执行。
聊天模型还接受特定于该集成的其他参数。要查找聊天模型支持的所有参数,请参阅该模型的相应 API 参考文档 。
LangChain 支持两种消息格式来与聊天模型交互:
在此主要介绍下LangChain的消息格式,LangChain 提供了一种统一的消息格式,可在不同的聊天模型中使用,使用户能够在不同聊天模型之间切换,而无需担心每个模型提供商所使用的具体消息格式细节 。
LangChain 消息有五种主要的消息类型,都是继承与BaseMessage,达到统一消息格式的目的:
更详细的LangChain消息内容可查看官网的Messages指南
基于本地的Ollama进行测试,如果本地没部署Ollama的可参考我的另一篇文章
from langchain_ollama import ChatOllama
from langchain.schema import (
HumanMessage, # 等价于OpenAI接口中的user role
SystemMessage # 等价于OpenAI接口中的system role
)
llm = ChatOllama(
model="llama3.1",
temperature=0,
base_url="http://127.0.0.1:11434",
client_kwargs={"timeout": 60},
)
# openAI的消息格式示例
messages = [
(
"system",
"你是一个将英语翻译成中文的有用助手。翻译用户的句子 。",
),
("human", "I love programming."),
]
ai_result = llm.invoke(messages) # 返回的是AIMessage类型
print(ai_result.content)
# langchain的消息格式示例
messages = [
SystemMessage(content="你是一个将英语翻译成中文的有用助手。翻译用户的句子 。"),
HumanMessage(content="I love programming.")
]
ai_result = llm.invoke(messages) # 返回的是AIMessage类型
print(ai_result.content)
其它关于聊天模型的工具调用、多模态、结构化输出等,请自行查看官方文档。
提示模板有助于将用户输入和参数转化为语言模型的指令。这可用于引导模型的回复,帮助其理解上下文并生成相关且连贯的基于语言的输出。
提示模板以一个字典作为输入,其中每个键代表提示模板中要填充的一个变量。
提示模板输出一个提示值(PromptValue),这个提示值可以传递给一个大型语言模型(LLM)或聊天模型,并且还可以被转换为字符串或消息列表。
下面介绍两种类型的提示词模板:
消息占位符(MessagesPlaceholder):在ChatPromptTemplate中,如果我们希望用户传入一个消息列表,并将其插入到特定位置,该怎么做呢?这时候就可以使用消息占位符。
示例:
from langchain.prompts import PromptTemplate
from langchain.prompts.chat import ChatPromptTemplate, MessagesPlaceholder
from langchain.schema import SystemMessage, HumanMessage
# 创建一个PromptTemplate示例
template = "你是一个{职业},请回答以下问题:{问题}"
prompt_template = PromptTemplate(template=template, input_variables=["职业", "问题"])
# 打印生成的提示
filled_prompt = prompt_template.invoke({"职业": "码农", "问题": "什么是人工智能?"})
print("PromptTemplate示例:")
print(filled_prompt)
# 创建一个ChatPromptTemplate示例
system_message = SystemMessage(content="你是一个智能助手,请回答用户的问题。")
messages_placeholder = MessagesPlaceholder(variable_name="messages")
chat_template = ChatPromptTemplate.from_messages([system_message, messages_placeholder, ('system','你猜我是什么人?')])
# 模拟一些对话消息
messages = [
HumanMessage(content="你好,我是CYX。"),
SystemMessage(content="你好,CYX!有什么可以帮助你的吗?"),
HumanMessage(content="什么是人工智能?")
]
# 打印生成的聊天提示
filled_chat_prompt = chat_template.format_prompt(messages=messages)
print("\nChatPromptTemplate示例:")
for message in filled_chat_prompt.to_messages():
print(f"{message.type}: {message.content}")
执行结果:
PromptTemplate示例:
text='你是一个码农,请回答以下问题:什么是人工智能?'
ChatPromptTemplate示例:
system: 你是一个智能助手,请回答用户的问题。
human: 你好,我是CYX。
system: 你好,CYX!有什么可以帮助你的吗?
human: 什么是人工智能?
system: 你猜我是什么人?
更多详细信息可以查看官方提示词模板导航。
扩展:一种实现更好性能的常见提示技巧是将示例作为提示的一部分。有时这些示例会被硬编码到提示中,但对于更高级的情形,动态选择这些示例可能更好。示例选择器是负责选择示例并将其格式化为提示的类,详情可以查看官方文档。
在 LangChain 中,数据连接封装是其核心功能之一,它允许开发者轻松地将不同来源的数据与大型语言模型(LLMs)集成,以实现更强大和个性化的应用。
LangChain 支持多种类型的数据源,常见的包括:
更多的数据源加载器可以查看文档加载器的官方介绍。
文档加载器都实现了 BaseLoader 接口。每个文档加载器都有其特定的参数,但它们都可以通过 .load 方法或 .lazy_load方法调用。以下是一个简单的示例:
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("http://www.baidu.com")
print(loader.load())
当加载的文档较大时,需要将其分割成较小的文本块(chunk),以便后续处理。LangChain 提供了多种文本分割器,如CharacterTextSplitter、RecursiveCharacterTextSplitter等。
文档拆分有多种策略,每种策略都有其自身的优势:
具体可以查看官方手册,在此仅以长度拆分为示例:
from langchain.text_splitter import TokenTextSplitter, CharacterTextSplitter
# 示例文本
text = "这是一个示例文本,用于展示LangChain的中文本分割器。"
# 基于Token分割
token_splitter = TokenTextSplitter(chunk_size=10, chunk_overlap=0)
token_splits = token_splitter.split_text(text)
print("基于Token分割结果:")
for split in token_splits:
print(split)
# 基于字符分割
char_splitter = CharacterTextSplitter(
separator="。",
keep_separator=True,
chunk_size=20,
chunk_overlap=5,
is_separator_regex=False
)
char_splits = char_splitter.split_text(text)
print("\n基于字符分割结果:")
for i, split in enumerate(char_splits):
print(f"段落 {i+1}: {split} (长度: {len(split)})")
四、对话历史管理
未完成,待续。。。。。。
五、Chain和Lang Chain Expression Language(LCEL)
六、Agent
七、LangServe
全部评论