Langchain框架基础
Long Chain是一项旨在简化大模型应用开发的工具框架,尤其适用于多人协作和企业级及复杂场景。该框架通过将开发工作流程“链化”,降低了开发难度,使开发者可以利用外部工具和数据,充分运用大模型的分析与决策能力。作为一个开源项目,Long Chain在GitHub上有很高的关注度,代表了当前业界的主流技术方向。在定义模型链并拼接提示词后,数据流程涉及将信息顺序送入提示词模板、模型,再到解析器,是一
·
目录
1.Lang Chain框架概述
- Long Chain是一项旨在简化大模型应用开发的工具框架,尤其适用于多人协作和企业级及复杂场景。
- 该框架通过将开发工作流程“链化”,降低了开发难度,使开发者可以利用外部工具和数据,充分运用大模型的分析与决策能力。
- 作为一个开源项目,Long Chain在GitHub上有很高的关注度,代表了当前业界的主流技术方向。
2.Lang Chain核心组件与概念
- 模型IO封装: 重点介绍了两种模型——传统的LLM(语言模型)和用于多轮对话的Chat Model。
- LLM:接收单个字符串作为输入,适用于文本补全生成。
- Chat Model:按对话结构重新封装的经典对话模型,支持系统、用户、AI多种消息类型的交互。
- 明确了content字段用于用户消息,无法直接用于系统指令。
- 引入了Memory Buffer(记忆模块)的概念,用于管理上下文,特别是在多轮对话中。
- 数据连接封装 (RAG流程):
- 介绍了RAG(检索增强生成)的核心流程,包括数据的加载、转换处理、文本向量化以及结果检索。
- 组件关系为:document loaders -> document transforms -> text embedding models -> vector store -> retrievers。
- Agent (智能体):
- Agent能根据用户输入自动规划并执行步骤,选择合适的工具来完成一项复杂任务。
- 其强大之处在于能够自主决策,完成由单个流转多个步骤的动态规划,这不同于简单的function calling。
- Callback (回调):
- Callback用于在工作流程的关键节点进行输出,以实现对整个工作流的监控、调试和成本管控。
3.Chat Model技术概念与统一接口
- 定义了统一的chat model接口,旨在抽象不同供应商(如阿里云、dashescope)的模型,使得在不同模型间切换只需要更换配置项,而无需修改调用代码,提高开发灵活性。
- 主要参数包括模型名称、API Key和API Base URL。
注意:使用longchain库时,必须安装与其代码配套的特定版本,不能随意升级,以避免因版本差异导致的兼容性问题
4. Prompt模板的构建方式讲解
- 将系统提示词和用户提示词组合成一个统一对话提示词模板的两种方法:
- 方法一: 先单独创建系统提示词和用户提示词模板,再合并为一组消息送给模型。
system_template_text="你是一位专业的翻译,能够将{input_language}翻译成{output_language},并且输出文本会根据用户要求的任何语言风格进行调整。请只输出翻译后的文本,不要有任何其它内容。" system_prompt_template = SystemMessagePromptTemplate.from_template(system_template_text) human_template_text="文本:{text}\n语言风格:{style}" human_prompt_template = HumanMessagePromptTemplate.from_template(human_template_text) system_prompt = system_prompt_template.format(input_language="英语", output_language="汉语") human_prompt = human_prompt_template.format(text="I'm so hungry I could eat a horse", style="文言文") from langchain_openai import ChatOpenAI #%% model = ChatOpenAI(model="qwen-plus", openai_api_key="",#自己填入 openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1") response = model.invoke([ system_prompt, human_prompt ]) - 方法二: 使用ChatPromptTemplate(chat_prompt_template)类,一次性定义一个包含系统和用户消息的对话模板。
from langchain.prompts import ChatPromptTemplate #%% prompt_template = ChatPromptTemplate.from_messages( [ ("system", "你是一位专业的翻译,能够将{input_language}翻译成{output_language},并且输出文本会根据用户要求的任何语言风格进行调整。请只输出翻译后的文本,不要有任何其它内容。"), ("human", "文本:{text}\n语言风格:{style}"), ] ) prompt_value = prompt_template.invoke({"input_language": "汉语", "output_language": "汉语", "text":"勿以善小而不为,勿以恶小而为之。", "style": "白话文"}) model = ChatOpenAI(model="qwen-plus", openai_api_key="",#自己填入 openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1") response = model.invoke(prompt_value)
- 方法一: 先单独创建系统提示词和用户提示词模板,再合并为一组消息送给模型。
- 如何使用变量向模板中的不同位置注入值,并通过循环处理多组输入配置。
input_variables = [
{
"input_language": "汉语",
"output_language": "汉语",
"text": "勿以善小而不为,勿以恶小而为之。",
"style": "白话文"
},
{
"input_language": "法语",
"output_language": "英语",
"text": "Je suis désolé pour ce que tu as fait",
"style": "古英语"
},
{
"input_language": "俄语",
"output_language": "意大利语",
"text": "Сегодня отличная погода",
"style": "网络用语"
},
{
"input_language": "韩语",
"output_language": "日语",
"text": "너 정말 짜증나",
"style": "口语"
}
]
#%%
for input in input_variables:
response = model.invoke(prompt_template.invoke({"input_language": input["input_language"], "output_language": input["output_language"], "text":input["text"], "style": input["style"]}))
print(response.content)
5.Langchain内置输出解析器类型
- list parser: 将输出解析为列表格式。
- date time parser: 将输出解析为时间戳格式。
- enum parser: 将输出解析为枚举类型(在给定的元组选项中选择其一)。
- json parser: 将输出解析为JSON格式。
- xml parser: 将输出解析为XML格式。
6.小样本提示 (Few-shot Prompting)
- 通过定义历史对话示例,引导模型学习特定的输出格式。
- 使用longchain框架的few-shot chat message prompt template类,将示例作为参数传入,由框架自动整合示例和新建问题,构成完整的提示给模型。这种方法替代了手动编写多条对话的历史记录。
from langchain_openai import ChatOpenAI
from langchain.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate
#%%
example_prompt = ChatPromptTemplate.from_messages(
[
("human", "格式化以下学生信息:\n姓名 -> {customer_name}\n年龄 -> {customer_age}\n 城市 -> {customer_city}"),
("ai", "##学生信息\n- 学生姓名:{formatted_name}\n- 学生年龄:{formatted_age}\n- 学籍所在地:{formatted_city}")
]
)
#%%
examples = [
{
"customer_name": "张三",
"customer_age": "7",
"customer_city": "郑州",
"formatted_name": "张三",
"formatted_age": "7岁",
"formatted_city": "河南省郑州市"
},
{
"customer_name": "李四",
"customer_age": "9",
"customer_city": "广州",
"formatted_name": "李四",
"formatted_age": "9岁",
"formatted_city": "广东省广州市"
},
]
#%%
few_shot_template = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt,
examples=examples,
)
#%%
final_prompt_template = ChatPromptTemplate.from_messages(
[
few_shot_template,
("human", "{input}"),
]
)
#%%
final_prompt = final_prompt_template.invoke({"input": "格式化以下学生信息:\n姓名 -> 王五\n年龄 -13\n 城市 -> 南昌'"})
model = ChatOpenAI(model="qwen-plus",
openai_api_key="",#自己填入
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1")
response = model.invoke(final_prompt)
print(response.content)
##学生信息
- 学生姓名:王五
- 学生年龄:13岁
- 学籍所在地:江西省南昌市
7.输出解析器详解
- 以输出解析器的JSON Schema能力为例,其核心是利用Pydantic创建数据模型(Data Schema)。
- 开发人员通过定义模型类(如film_info),声明字段类型(如字符串string、列表array等)、描述和示例。
- 输出解析器会将此模型结构作为JSON Schema规则,自动、清晰地约束和格式化模型的输出结果,确保返回数据的结构化和准确性。
from typing import List
from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import ChatPromptTemplate
from langchain.schema import HumanMessage
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
#%%
class FilmInfo(BaseModel):
film_name: str = Field(description="电影的名字", example="拯救大兵瑞恩")
author_name: str = Field(description="电影的导演", example="斯皮尔伯格")
genres: List[str] = Field(description="电影的题材", example=["历史", "战争"])
#BaseModel用于创建数据模式,也就是数据的说明书,Field是字段,用于为Basemodel里的属性提供额外的信息和验证条件
#%%
output_parser = PydanticOutputParser(pydantic_object=FilmInfo)
#%%
print(output_parser.get_format_instructions())
#%%
prompt = ChatPromptTemplate.from_messages([
("system", "{parser_instructions} 你输出的结果请使用中文。"),
("human", "请你帮我从电影概述中,提取电影名、导演,以及电影的体裁。电影概述会被三个#符号包围。\n###{film_introduction}###")
])
#%%
film_introduction = """《复仇者联盟4:终局之战》(Avengers: Endgame)是美国科幻电影,改编自美国漫威漫画,漫威电影宇宙(Marvel Cinematic Universe,缩写为MCU)第22部影片。影片由安东尼·罗素和乔·罗素执导,小罗伯特·唐尼、克里斯·埃文斯、马克·鲁法洛、克里斯·海姆斯沃斯、斯嘉丽·约翰逊、杰瑞米·雷纳、保罗·路德、布丽·拉尔森、乔什·布洛林、汤姆·希德勒斯顿、汤姆·赫兰德等主演。
讲述《复仇者联盟3:无限战争》的毁灭性事件过后,宇宙由于疯狂泰坦灭霸的行动而变得满目疮痍。无论前方将遭遇怎样的后果,复仇者联盟都必须在剩余盟友的帮助下再一次集结,以逆转灭霸的所作所为,彻底恢复宇宙的秩序。
该片于2019年4月26日在美国上映,4月24日在中国上映。
截止2019年7月21日,《复仇者联盟4》全球票房达27.89亿美元,获全球影史票房总冠军。
"""
final_prompt = prompt.invoke({"film_introduction": film_introduction,
"parser_instructions": output_parser.get_format_instructions()})
print(final_prompt)
#%%
model = ChatOpenAI(model="qwen-plus",
openai_api_key="",#自己填入
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1")
response = model.invoke(final_prompt)
print(response.content)
{
"film_name": "复仇者联盟4:终局之战",
"author_name": "安东尼·罗素和乔·罗素",
"genres": ["科幻", "动作", "冒险"]
}
8.Langchain模型链的定义和使用
- 在定义模型链并拼接提示词后,数据流程涉及将信息顺序送入提示词模板、模型,再到解析器,是一种嵌套过程。
- 明确了langchain中构建链的一种简化写法,使用竖线“|”替代复杂的方法调用,这种方式更便捷。
- 重点说明了上述定义仅创建了一个处理流程的框架(chain),具体的输入参数需通过inverse方法传入。
from langchain_openai import ChatOpenAI
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import ChatPromptTemplate
#%%
prompt = ChatPromptTemplate.from_messages([
("system", "{parser_instructions}"),
("human", "列出5个{subject}生产的汽车的品牌。")
])
#%%
output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()
#%%
model = ChatOpenAI(model="qwen-plus",
openai_api_key="",#自己填入
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1")
#%%
result = output_parser.invoke(model.invoke(prompt.invoke({"subject": "中国", "parser_instructions": parser_instructions})))
chat_model_chain = prompt | model | output_parser
result = chat_model_chain.invoke({"subject": "中国", "parser_instructions": parser_instructions})
result
['比亚迪', '吉利', '长城', '荣威', '奇瑞']
更多推荐


所有评论(0)