langchain的官方地址: LangChain
API的地址: LangChain Python API Reference — 🦜🔗 LangChain documentation(这里面可以看到不同厂家的大模型在langchain该如何去调用其api和langchain提供的封装功能的api接口)
学习langchain需要注意的几个点:
- LangChain 也是一套面向大模型的开发框架(SDK)
- LangChain 是 AGI 时代软件工程的一个探索和原型
- 学习 LangChain 要关注接口变更
langchain主要由三部分构成:
- Build:使用 LangChain 构建应用
- Run:使用 LangGraph Platform 大规模运行
- Manage:使用 LangSmith 管理 LLM 性能
langchain和langgraph:
- LangChain: LLM 构建的可组合框架
- LangGraph:可控代理工作流的编排框架。
langchain的核心主件
1. 模型 I/O 封装
- LLMs:大语言模型
- Chat Models:一般基于 LLMs,但按对话结构重新封装
- PromptTemple:提示词模板
- OutputParser:解析输出
2. 数据连接封装
- Document Loaders:各种格式文件的加载器
- Document Transformers:对文档的常用操作,如:split(分割)、filter(过滤)、translate(翻译)、extract metadata(提取元数据)等
- Text Embedding Models:文本向量化表示,用于检索等操作
- Vectorstores:(面向检索的)向量的存储
- Retrievers:向量的检索
3. 对话历史管理
- 对话历史的存储、加载与剪裁
4. 架构封装
- Chain(链):实现一个功能或者一系列顺序功能组合
- Agent(工具):根据用户输入,自动规划执行步骤,自动选择每步需要的工具,最终完成用户指定的功能
- Tools:调用外部功能的函数,例如:调 Google 搜索、文件 I/O、Linux Shell 等
- Toolkits:操作某软件的一组工具集,例如:操作数据库、操作 Gmail 等
内容分析
- 模型 I/O 封装:
- 涉及大语言模型(LLMs)、对话模型(Chat Models)、提示词模板(PromptTemple)和输出解析(OutputParser)。
- 数据连接封装:
- 包括文档加载、转换、文本向量化、向量存储和检索等功能。
- 对话历史管理:
- 管理对话历史的存储、加载和剪裁。
- 架构封装:
- 通过 Chain 和 Agent 实现功能组合和自动化任务执行,支持调用外部工具和操作特定软件。
LangChain 相关资源链接
- 功能模块:https://python.langchain.com/docs/get_started/introduction
- API 文档:LangChain Python API 参考 — 🦜🔗 LangChain 文档
- 三方组件集:https://python.langchain.com/docs/integrations/platforms/
- 官方应用案例:Use cases | 🦜️🔗 LangChain
- 调试部署等指导:Debugging | 🦜️🔗 LangChain
以下是代码的一些操作:
第一节: 模型 I/O 封装
- 把不同的模型统一封装成一个接口,方便更换模型而不用重构代码。
1.1 模型 API:LLM vs. ChatModel
- LLM:大语言模型
- ChatModel:基于 LLM 的对话模型
安装依赖
pip install --upgrade langchain
pip install -U langchain-deepseek
pip install --upgrade langchain-community
1.1.1 DeepSeek 模型封装
# 导入模型
from langchain_deepseek import ChatDeepSeek
# 初始化 deepseek 模型,需要提前为设置deepseek的api_key全局环境,
# 具体如何设置可到langchain官网API文档查看,提供了各个大模型的设置方法
llm = ChatDeepSeek(model="deepseek-reasoner")
if __name__ == "__main__":
response = llm.invoke("你是谁") # 调用模型
print(response.content)
1.1.2 多轮对话 Session 封装
from langchain.schema import ( AIMessage, # 等价于 OpenAI 接口中的 assistant role HumanMessage, # 等价于 OpenAI 接口中的 user role SystemMessage # 等价于 OpenAI 接口中的 system role ) # 导入模型 from deepseek import llm # 定义多轮对话消息 if __name__ == "__main__": messages = [ SystemMessage(content="你是同欣AI的课程助理。"), # 设定助手的角色。 HumanMessage(content="我是学员,我叫大拿。"), # 用户输入,介绍自己 AIMessage(content="欢迎!"), # 助手的回复 HumanMessage(content="我是谁") # 用户的提问 ] # 调用模型进行多轮对话 ret = llm.invoke(messages) print(ret.content)
- Format:展示了如何将变量x 和 y 插入到模板字符串中,生成具体的句子。
- 示例:"Does foo like bar, and why?"。
- Predict:使LLM(大语言模型)或 Chat Model(对话模型)进行预测。
- Parse:输出需要格式的内容(如json)
1.2.1 Prompt 模板封装
创建PromptTemplate类模板
#从 langchain.prompts 模块导入 PromptTemplate 类 from langchain.prompts import PromptTemplate # 创建 PromptTemplate 对象 template = PromptTemplate.from_template("给我讲个关于{subject}的笑话") #使用 PromptTemplate.from_template 方法创建一个模板,模板中包含一个变量 {subject} if __name__ == '__main__': # 打印模板 print("===Templates==") print(template) # 格式化模板并打印 print("===Prompts==") print(template.format(subject='小明'))
使用模板
from deepseek import llm if __name__ == '__main__': # 通过 Prompt 调用 LLM #使用template.format(subject='小明') 格式化提示词模板,生成具体的提示词。 #调用llm.invoke 方法,将格式化后的提示词传递给模型,获取模型的响应。 ret = llm.invoke(template.format(subject='小明')) # 打印输出 print(ret.content)
创建ChatPromptTemplate类模板
from langchain.prompts import ( ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate, )
from deepseek import llm
if __name__ == '__main__':
#使用ChatPromptTemplate.from_messages 创建一个多角色提示词模板。 #包含两条消息: #SystemMessagePromptTemplate:系统消息,定义助手的角色和名字。 #HumanMessagePromptTemplate:用户消息,定义用户的查询。
template = ChatPromptTemplate.from_messages( [ SystemMessagePromptTemplate.from_template("你是{product}的客服助手。你的名字叫{name}"), HumanMessagePromptTemplate.from_template("{query}"), ] )
# 格式化提示词
prompt = template.format_messages( product="同欣AI研究院", name="大吉", query="你是谁" )
# 使用 template.format_messages 格式化提示词模板,传入具体的参数
# 打印格式化后的提示词 print(prompt)
# 调用 LLM
ret = llm.invoke(prompt)
# 打印模型输出
print(ret.content)
3. MessagesPlaceholder 把多轮对话变成模板
定义ChatPromptTemplate类模板
from langchain.prompts import ( ChatPromptTemplate, HumanMessagePromptTemplate, MessagesPlaceholder, ) # 定义用户消息模板 human_prompt = "Translate your answer to {language}." human_message_template = HumanMessagePromptTemplate.from_template(human_prompt) # 定义 ChatPromptTemplate chat_prompt = ChatPromptTemplate.from_messages( [ # 使用 MessagesPlaceholder 占位符,表示多轮对话历史 # MessagesPlaceholder是一个占位符,用于在模板中插入多轮对话历史。 # variable_name="history"指定了占位符的变量名,后续可以通过 history 变量传入多轮对话历史。 MessagesPlaceholder(variable_name="history"), # 添加用户消息模板 human_message_template ] )
传入多轮历史对话形成多轮对话模板并调用大模型生成对话
from langchain_core.messages import AIMessage, HumanMessage from deepseek import llm from messages_placeholder import chat_prompt if __name__ == '__main__': # 定义用户消息和 AI 消息(历史对话) human_message = HumanMessage(content="Who is Elon Musk?") ai_message = AIMessage( content="Elon Musk is a billionaire entrepreneur, inventor, and industrial designer" ) # 格式化提示词,加传入历史对话和参数 messages = chat_prompt.format_prompt( # 对 "history" 和 "language" 赋值 history=[human_message, ai_message], language="中文" ) # 打印格式化后的消息 print(messages.to_messages()) # 调用 LLM result = llm.invoke(messages) print(result.content)
以上都是一些写死的Prompt模板,下面我们来看如何从文件中加载提示词模板
1.2.2 从文件加载 Prompt 模板
from langchain.prompts import PromptTemplate # 从文件加载 Prompt 模板 # 传入文件的路径和编码格式 template = PromptTemplate.from_file("../prompt/example_prompt_template", encoding='utf-8') # 打印模板 print("===Template===") print(template) # 格式化模板并打印 print("===Prompt===") print(template.format(topic='黑色幽默'))# 传入参数
后续还会继续更新。
Langchain快速入门