一、(基础)构建一个简单的 LangChain 应用

0 阅读5分钟

前言

  1. 这是一个一系列教程 LangChain 上手教程,总结和记录学习 LangChain 的过程,欢迎持续关注。
  2. 文章对应LangChain官网教程,但是本文更加符合国内使用,LangChain官网很多教程需要魔法,本文不需要使用魔法,不需要花模型费用等。

LangChain 是什么

LangChain 是一个用于构建大语言模型(LLM)应用的开发框架。它简化了LLM与外部工具、数据源和流程的集成,让开发者能快速搭建功能丰富的AI应用(如问答机器人、智能助手等)。

准备工作

  • 需要会使用或读懂 python 语言
  • 建议使用 python 虚拟环境,具体怎么创建这里不过多赘述
  • pip安装LangChain:pip install langchain
  • 调用大模型key,我们主要是学习为主,能白嫖自然白嫖,不需要多么快速的响应,下面是对应的申请方式,都是免费的,其他模型都是需要对应token花费钱的。注意:我们只要申请openai的key,openai更加通用
    • 腾讯元宝:hunyuan-lite,申请地址
    • 智谱AI:GLM-4-Flash-250414,申请地址,更推荐,响应速度快,更精准,对 openai 接口兼容性更好
  • 以上两个模型都是免费的,可以放心使用,注意申请 openai 访问方式的key
  • 建议使用 Jupyter Notebook,更加方便,安装教程

1. langchain调用大模型简单的示例

1.1. 构建一个模型对象

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="hunyuan-lite", api_key="申请的key", base_url="https://api.hunyuan.cloud.tencent.com/v1/")

1.1.1. 要简单地调用模型,我们可以将消息列表传递给.invoke方法。

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

model = ChatOpenAI(model="hunyuan-lite", api_key="申请的key", base_url="https://api.hunyuan.cloud.tencent.com/v1/")

messages = [
    SystemMessage(content="将以下内容从英语翻译成意大利语"),
    HumanMessage(content="你好"),
]
print(model.invoke(messages))

当执行完我们可以看到已经输出了

AIMessage(
	content='Ciao', 
	additional_kwargs={'refusal': None}, 
	response_metadata={'token_usage': {'completion_tokens': 3, 'prompt_tokens': 13, 'total_tokens': 16, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'hunyuan-lite', 'system_fingerprint': '', 'id': '5b729dc85e44d45b8dbdf0fb58bf7984', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, 
	id='run--68f13b2a-f54c-4862-a03c-3def1c3c512a-0', 
	usage_metadata={'input_tokens': 13, 'output_tokens': 3, 'total_tokens': 16, 'input_token_details': {}, 'output_token_details': {}}
)

1.2. 输出解析器

模型的响应是一个AIMessage。这包含一个字符串响应以及关于响应的其他元数据。我们通常只想处理字符串响应。可以通过使用简单的输出解析器来解析出这个响应。

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser

# 解析器
parser = StrOutputParser()

model = ChatOpenAI(model="hunyuan-lite", api_key="申请的key", base_url="https://api.hunyuan.cloud.tencent.com/v1/")
messages = [
    SystemMessage(content="将以下内容从英语翻译成意大利语"),
    HumanMessage(content="你好"),
]
result = model.invoke(messages)

# 解析器解析
print(parser.invoke(result))

运行后我们需要的结果已经出来了,并且其他的数据已经没了

Ciao

这样写还是有点繁琐,我们可以使用 | 运算符轻松创建链。| 运算符在 LangChain 中用于将两个元素组合在一起。

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser

model = ChatOpenAI(model="hunyuan-lite", api_key="申请的key", base_url="https://api.hunyuan.cloud.tencent.com/v1/")

messages = [
    SystemMessage(content="将以下内容从英语翻译成意大利语"),
    HumanMessage(content="你好"),
]
parser = StrOutputParser()
chain = model | parser
print(chain.invoke(messages))

2. 提示词模板

直接将消息列表传递给语言模型。这些消息列表来自哪里?通常,它是由用户输入和应用逻辑的组合构建而成的。这个应用逻辑通常会将原始用户输入转换为准备传递给语言模型的消息列表。常见的转换包括添加系统消息或使用用户输入格式化模板。

PromptTemplates 是 LangChain 中的一个概念,旨在帮助进行这种转换。它们接收原始用户输入并返回准备传递给语言模型的数据(提示)。

在这里创建一个 PromptTemplate。它将接收两个用户变量:

from langchain_core.prompts import ChatPromptTemplate

# 创建一个字符串,我们将格式化为系统消息:
system_template = "将以下内容从中文翻译成{language}:"

# 创建 PromptTemplate。这将是 system_template 和一个更简单的模板的组合
prompt_template = ChatPromptTemplate.from_messages(
    [("system", system_template), ("user", "{text}")]
)
# 此提示词模板的输入是一个字典。我们可以单独使用这个提示词模板
result = prompt_template.invoke({"language": "italian", "text": "hi"})

输出后可以看到它返回一个 ChatPromptValue,由两个消息组成。

ChatPromptValue(
	messages=[
		SystemMessage(
			content='将以下内容从英语翻译成意大利语:', 
			additional_kwargs={}, 
			response_metadata={}
		), 
		HumanMessage(content='你好', additional_kwargs={}, response_metadata={})
	]
)

完整示例

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.prompts import ChatPromptTemplate

model = ChatOpenAI(model="hunyuan-lite", api_key="申请的key", base_url="https://api.hunyuan.cloud.tencent.com/v1/")

system_template = "将以下内容从中文翻译成{language}:"
prompt_template = ChatPromptTemplate.from_messages(
    [("system", system_template), ("user", "{text}")]
)
result = prompt_template.invoke({"language": "意大利语", "text": "你好"})
print(result)

我们也可以使用 | 运算符创建链解析操作

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

model = ChatOpenAI(model="hunyuan-lite", api_key="申请的key", base_url="https://api.hunyuan.cloud.tencent.com/v1/")

system_template = "将以下内容从中文翻译成{language}:"
prompt_template = ChatPromptTemplate.from_messages(
    [("system", system_template), ("user", "{text}")]
)
parser = StrOutputParser()
chain = prompt_template | model | parser
chain.invoke({"language": "意大利语", "text": "你好"})

'Ciao'

本章讲解了如何构建一个简单的 LangChain 应用,现在调用大模型还没有记忆功能,下一篇将讲解如何实现对话的上下文