引言LangChain 是一个强大的框架主要用于简化基于大语言模型的应用开发。它像乐高积木一样将各种组件模型、提示模板、输出解析器等组合起来让新手能快速搭建出功能丰富的 AI 应用。本篇文章将从零开始一步步学习的LangChain 的核心概念与用法。1、基础与模型对话在开始使用 LangChain 之前我们需要先学会如何与一个具体的模型对话。这里我们使用阿里云的“通义千问”模型通过 ChatOpenAI 接口调用因为它兼容 OpenAI 的 API 格式。首先安装必要的库pip install langchain langchain-openai通过LangChain框架调用qwen-plus模型构建包含系统角色设定和用户提问的消息列表调用模型生成回答并打印输出。from langchain_openai import ChatOpenAI model ChatOpenAI( modelqwen-plus, openai_api_key你的API_KEY, # 替换为你的真实密钥 openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1, temperature1.2, # 控制随机性越高越有创造力 max_tokens300 # 最多生成300个token ) from langchain.schema.messages import HumanMessage, SystemMessage messages [ SystemMessage(content请你作为我的数学课助教用通俗易懂且直接的语言帮我解释数学原理。), HumanMessage(content什么是勾股定理), ] response model.invoke(messages) print(response.content)ChatOpenAI 是 LangChain 中用于调用兼容 OpenAI API 的模型的类。我们指定了模型名、API 密钥和基础 URL。SystemMessage 和 HumanMessage 是两种消息类型分别代表系统设定和用户输入。LangChain 支持多种消息角色模拟真实对话。model.invoke(messages) 发送消息给模型并返回响应。2、提示模板Prompt Templates在实际应用中我们往往需要动态生成提示词而不是写死固定的字符串。LangChain 提供了多种提示模板让我们能像填空一样构造消息。1、使用独立的SystemMessagePromptTemplate和HumanMessagePromptTemplate通过LangChain的提示模板功能分别定义了系统消息和人类消息的模板系统模板指定将输入语言翻译成输出语言并按用户要求调整风格人类模板包含待翻译文本和风格要求。随后使用format方法填充模板中的变量为系统模板指定源语言和目标语言均为汉语最后打印出填充后的具体消息对象。from langchain.prompts import ( SystemMessagePromptTemplate, HumanMessagePromptTemplate, ) # 定义系统消息模板 system_template_text 你是一位专业的翻译能够将{input_language}翻译成{output_language}并且输出文本会根据用户要求的任何语言风格进行调整。请只输出翻译后的文本不要有任何其它内容。 system_prompt_template SystemMessagePromptTemplate.from_template(system_template_text) # 查看模板中的变量 print(system_prompt_template.input_variables) # 输出[input_language, output_language] # 定义人类消息模板 human_template_text 文本{text}\n语言风格{style} human_prompt_template HumanMessagePromptTemplate.from_template(human_template_text) print(human_prompt_template.input_variables) # 输出[text, style] # 填充模板生成具体的消息 system_prompt system_prompt_template.format(input_language汉语, output_language汉语) human_prompt human_prompt_template.format( text勿以善小而不为勿以恶小而为之, style白话文 ) print(system_prompt) print(human_prompt)然后我们可以将这两个消息传给模型from langchain_openai import ChatOpenAI model ChatOpenAI( modelqwen-plus, openai_api_key你的API_KEY, openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1 ) response model.invoke([system_prompt, human_prompt]) print(response.content)为了批量处理多个翻译任务我们可以循环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([ system_prompt_template.format(input_languageinput[input_language], output_languageinput[output_language]), human_prompt_template.format(textinput[text], styleinput[style]) ]) print(response.content)2、使用ChatPromptTemplate组合多个消息更方便的方式是使用 ChatPromptTemplate.from_messages()将多条消息模板组合在一起from langchain.prompts import ChatPromptTemplate prompt_template ChatPromptTemplate.from_messages([ (system, 你是一位专业的翻译能够将{input_language}翻译成{output_language}并且输出文本会根据用户要求的任何语言风格进行调整。请只输出翻译后的文本不要有任何其它内容。), (human, 文本{text}\n语言风格{style}), ]) print(prompt_template.input_variables) # [input_language, output_language, text, style] # 填充模板生成 PromptValue prompt_value prompt_template.invoke({ input_language: 汉语, output_language: 汉语, text: 勿以善小而不为勿以恶小而为之。, style: 白话文 }) print(prompt_value.messages) # 包含 SystemMessage 和 HumanMessage接着可以直接用 model.invoke(prompt_value) 获取结果也可以批量处理for input in input_variables: response model.invoke(prompt_template.invoke(input)) print(response.content)3、少量示例提示模板有时我们需要给模型提供几个例子让它模仿这些例子的输出格式。LangChain 提供了 FewShotChatMessagePromptTemplate 来轻松实现。我们通过LangChain构建了一个少样本学习提示模板首先定义了示例消息模板然后提供了两个客户信息格式化的具体示例接着利用FewShotChatMessagePromptTemplate将这些示例整合并与新的请求模板组合成最终提示模板。最后用新的客户信息填充模板并调用invoke方法生成了包含示例和当前请求的完整消息列表。from langchain_openai import ChatOpenAI from langchain.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate # 定义示例中每一条消息的模板human 和 ai 对 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: 27, customer_city: 长沙, formatted_name: 张三, formatted_age: 27岁, formatted_city: 湖南省长沙市 }, { customer_name: 李四, customer_age: 42, customer_city: 广州, formatted_name: 李四, formatted_age: 42岁, formatted_city: 广东省广州市 }, ] # 构建 few-shot 模板 few_shot_template FewShotChatMessagePromptTemplate( example_promptexample_prompt, examplesexamples, ) # 最终的 prompt 由 few-shot 示例 新的用户请求组成 final_prompt_template ChatPromptTemplate.from_messages([ few_shot_template, (human, {input}), ]) # 填充新的输入 final_prompt final_prompt_template.invoke({ input: 格式化以下客户信息\n姓名 - 王五\n年龄 - 31\n 城市 - 郑州 }) print(final_prompt.messages)example_prompt 定义了每个示例中人类消息和 AI 回复的格式。examples 列表提供了两个具体示例。FewShotChatMessagePromptTemplate 将这些示例转换为具体的消息列表依次为 human1, ai1, human2, ai2。最后将 few-shot 示例与新的用户请求拼接形成完整的提示。然后调用模型model ChatOpenAI( modelqwen-plus, openai_api_key你的API_KEY, openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1 ) response model.invoke(final_prompt) print(response.content)模型会按照示例的格式输出
小白从零开始勇闯人工智能:LangChain 入门指南(上)
引言LangChain 是一个强大的框架主要用于简化基于大语言模型的应用开发。它像乐高积木一样将各种组件模型、提示模板、输出解析器等组合起来让新手能快速搭建出功能丰富的 AI 应用。本篇文章将从零开始一步步学习的LangChain 的核心概念与用法。1、基础与模型对话在开始使用 LangChain 之前我们需要先学会如何与一个具体的模型对话。这里我们使用阿里云的“通义千问”模型通过 ChatOpenAI 接口调用因为它兼容 OpenAI 的 API 格式。首先安装必要的库pip install langchain langchain-openai通过LangChain框架调用qwen-plus模型构建包含系统角色设定和用户提问的消息列表调用模型生成回答并打印输出。from langchain_openai import ChatOpenAI model ChatOpenAI( modelqwen-plus, openai_api_key你的API_KEY, # 替换为你的真实密钥 openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1, temperature1.2, # 控制随机性越高越有创造力 max_tokens300 # 最多生成300个token ) from langchain.schema.messages import HumanMessage, SystemMessage messages [ SystemMessage(content请你作为我的数学课助教用通俗易懂且直接的语言帮我解释数学原理。), HumanMessage(content什么是勾股定理), ] response model.invoke(messages) print(response.content)ChatOpenAI 是 LangChain 中用于调用兼容 OpenAI API 的模型的类。我们指定了模型名、API 密钥和基础 URL。SystemMessage 和 HumanMessage 是两种消息类型分别代表系统设定和用户输入。LangChain 支持多种消息角色模拟真实对话。model.invoke(messages) 发送消息给模型并返回响应。2、提示模板Prompt Templates在实际应用中我们往往需要动态生成提示词而不是写死固定的字符串。LangChain 提供了多种提示模板让我们能像填空一样构造消息。1、使用独立的SystemMessagePromptTemplate和HumanMessagePromptTemplate通过LangChain的提示模板功能分别定义了系统消息和人类消息的模板系统模板指定将输入语言翻译成输出语言并按用户要求调整风格人类模板包含待翻译文本和风格要求。随后使用format方法填充模板中的变量为系统模板指定源语言和目标语言均为汉语最后打印出填充后的具体消息对象。from langchain.prompts import ( SystemMessagePromptTemplate, HumanMessagePromptTemplate, ) # 定义系统消息模板 system_template_text 你是一位专业的翻译能够将{input_language}翻译成{output_language}并且输出文本会根据用户要求的任何语言风格进行调整。请只输出翻译后的文本不要有任何其它内容。 system_prompt_template SystemMessagePromptTemplate.from_template(system_template_text) # 查看模板中的变量 print(system_prompt_template.input_variables) # 输出[input_language, output_language] # 定义人类消息模板 human_template_text 文本{text}\n语言风格{style} human_prompt_template HumanMessagePromptTemplate.from_template(human_template_text) print(human_prompt_template.input_variables) # 输出[text, style] # 填充模板生成具体的消息 system_prompt system_prompt_template.format(input_language汉语, output_language汉语) human_prompt human_prompt_template.format( text勿以善小而不为勿以恶小而为之, style白话文 ) print(system_prompt) print(human_prompt)然后我们可以将这两个消息传给模型from langchain_openai import ChatOpenAI model ChatOpenAI( modelqwen-plus, openai_api_key你的API_KEY, openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1 ) response model.invoke([system_prompt, human_prompt]) print(response.content)为了批量处理多个翻译任务我们可以循环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([ system_prompt_template.format(input_languageinput[input_language], output_languageinput[output_language]), human_prompt_template.format(textinput[text], styleinput[style]) ]) print(response.content)2、使用ChatPromptTemplate组合多个消息更方便的方式是使用 ChatPromptTemplate.from_messages()将多条消息模板组合在一起from langchain.prompts import ChatPromptTemplate prompt_template ChatPromptTemplate.from_messages([ (system, 你是一位专业的翻译能够将{input_language}翻译成{output_language}并且输出文本会根据用户要求的任何语言风格进行调整。请只输出翻译后的文本不要有任何其它内容。), (human, 文本{text}\n语言风格{style}), ]) print(prompt_template.input_variables) # [input_language, output_language, text, style] # 填充模板生成 PromptValue prompt_value prompt_template.invoke({ input_language: 汉语, output_language: 汉语, text: 勿以善小而不为勿以恶小而为之。, style: 白话文 }) print(prompt_value.messages) # 包含 SystemMessage 和 HumanMessage接着可以直接用 model.invoke(prompt_value) 获取结果也可以批量处理for input in input_variables: response model.invoke(prompt_template.invoke(input)) print(response.content)3、少量示例提示模板有时我们需要给模型提供几个例子让它模仿这些例子的输出格式。LangChain 提供了 FewShotChatMessagePromptTemplate 来轻松实现。我们通过LangChain构建了一个少样本学习提示模板首先定义了示例消息模板然后提供了两个客户信息格式化的具体示例接着利用FewShotChatMessagePromptTemplate将这些示例整合并与新的请求模板组合成最终提示模板。最后用新的客户信息填充模板并调用invoke方法生成了包含示例和当前请求的完整消息列表。from langchain_openai import ChatOpenAI from langchain.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate # 定义示例中每一条消息的模板human 和 ai 对 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: 27, customer_city: 长沙, formatted_name: 张三, formatted_age: 27岁, formatted_city: 湖南省长沙市 }, { customer_name: 李四, customer_age: 42, customer_city: 广州, formatted_name: 李四, formatted_age: 42岁, formatted_city: 广东省广州市 }, ] # 构建 few-shot 模板 few_shot_template FewShotChatMessagePromptTemplate( example_promptexample_prompt, examplesexamples, ) # 最终的 prompt 由 few-shot 示例 新的用户请求组成 final_prompt_template ChatPromptTemplate.from_messages([ few_shot_template, (human, {input}), ]) # 填充新的输入 final_prompt final_prompt_template.invoke({ input: 格式化以下客户信息\n姓名 - 王五\n年龄 - 31\n 城市 - 郑州 }) print(final_prompt.messages)example_prompt 定义了每个示例中人类消息和 AI 回复的格式。examples 列表提供了两个具体示例。FewShotChatMessagePromptTemplate 将这些示例转换为具体的消息列表依次为 human1, ai1, human2, ai2。最后将 few-shot 示例与新的用户请求拼接形成完整的提示。然后调用模型model ChatOpenAI( modelqwen-plus, openai_api_key你的API_KEY, openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1 ) response model.invoke(final_prompt) print(response.content)模型会按照示例的格式输出