首页 > 编程语言 >使用 langchain 框架,构建一个简单的 LLM 应用程序

使用 langchain 框架,构建一个简单的 LLM 应用程序

时间:2024-08-12 23:15:49浏览次数:16  
标签:prompt template 应用程序 langchain LLM dotenv import model

介绍

使用 langchain 框架,构建一个简单的 LLM 应用程序

本文中出现的每段代码都是可以完整执行的

注意

大语言模型和各类框架迭代飞快,再看本文时,部分代码可能已经过时了

本文所用到的 python 包 版本
dashscope 1.20.3
langchain 0.2.12
langchain-community 0.2.11
langserve 0.2.2

配置环境变量

在项目中创建一个 .env 文件,保存程序运行时所需的环境变量:

(或者你用其他方式保存环境变量也行)

# 把通义千问的 API KEY 放这里
DASHSCOPE_API_KEY="sk-xxxx"

程序运行时,使用 dotenv.load_dotenv().env 文件中加载环境变量

pip install python-dotenv
import os
import dotenv

# 从文件中加载运行程序所需的环境变量
dotenv.load_dotenv(".env")

print(os.getenv("DASHSCOPE_API_KEY"))

快速开始

通义千问是阿里云研发的大语言模型;灵积是阿里云推出的模型服务平台,DashScope 是灵积的英文名

langchain 把与第三方大模型的集成都放在了 langchain_community 这个包中,其中就有通义千问大模型

pip install dashscope
pip install langchain
pip install langchain_community

将一段字符串传递给 .invoke() 方法,实现简单的对话:

from langchain_community.chat_models import ChatTongyi
import dotenv

dotenv.load_dotenv(".env")

model = ChatTongyi(model="qwen-turbo")

response = model.invoke("你好,请问你是谁?")

print(response.content)

也可以将消息列表传递给 .invoke() 方法:

from langchain_community.chat_models import ChatTongyi
import dotenv

dotenv.load_dotenv(".env")

model = ChatTongyi(model="qwen-turbo")

messages = [
    ("system", "请你扮演一名翻译助手"),
    ("user", "你好,请问你是谁?")
]

response = model.invoke(messages)

print(response.content)

prompt template

prompt(提示)是给大模型的输入,上述示例中传入 .invoke() 方法的参数就是 prompt

prompt 不仅仅是用户的输入,还可以包含有系统预设、角色信息、历史对话等等内容

from langchain.prompts import ChatPromptTemplate

# 创建模板
prompt_template = ChatPromptTemplate.from_messages([
    ("system", "将下列文本翻译成{language}"),
    ("user", "{text}")
])

# 将渲染模板渲染成字符串
formatted_prompt = prompt_template.format(
    language="中文",
    text="Hello, how are you?"
)

# 将渲染模板渲染成消息列表
invoked_prompt = prompt_template.invoke({
    "language": "中文",
    "text": "Hello, how are you?"}
)

print(formatted_prompt, end="\n--------\n")
print(invoked_prompt)

之后可以根据需要渲染模板,让模型完成不同的翻译工作

from langchain.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatTongyi
import dotenv

dotenv.load_dotenv(".env")

model = ChatTongyi(model="qwen-turbo")

prompt_template = ChatPromptTemplate.from_messages([
    ("system", "将下列文本翻译成{language}"),
    ("user", "{text}")
])


def translate(text: str, language: str) -> str:
    invoked_prompt = prompt_template.invoke({"language": text, "text": language})
    response = model.invoke(invoked_prompt)
    return response.content


print(translate("Hello, how are you?", "中文"))
print(translate("你是谁?", "英文"))

chain、LCEL

我们可以使用 | 运算符,将 prompt_template.invoke() -> model.invoke() 的流程封装成一个链

这种将 LangChain 组件的以声明式的方式链接在一起的写法,叫 LCEL(LangChain Expression Language)

直接调用 chain.invoke(),便相当与依次调用了 prompt_template.invoke()model.invoke()

from langchain.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatTongyi
import dotenv

dotenv.load_dotenv(".env")

model = ChatTongyi(model="qwen-turbo")

prompt_template = ChatPromptTemplate.from_messages([
    ("system", "请将下列文本翻译成{language}"),
    ("user", "{text}")
])

# 将组件链接在一起
chain = prompt_template | model

response = chain.invoke({"language": "今天天气真好", "text": "英文"})
print(response.content)

output parser

定义一个 my_log() 函数,用于输出每次对话的 token 消耗情况

from langchain.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatTongyi
import dotenv

dotenv.load_dotenv(".env")

model = ChatTongyi(model="qwen-turbo")

prompt_template = ChatPromptTemplate.from_messages([
    ("system", "请将下列文本翻译成{language}"),
    ("user", "{text}")
])

chain = prompt_template | model


def my_log(chain_output):
    # 输出本次问答的 token 消耗情况
    print(f"\033[35m[info] token_usage: {chain_output.response_metadata['token_usage']}\033[0m")
    return chain_output


def translate(text, language):
    response = chain.invoke({"language": language, "text": text})
    my_log(response)
    return response.content


print(translate("今天天气真好", "英文"))

上述示例中,我们对模型的输出做了两层处理:一是打印输出 token 消耗情况,二是通过 .content 拿到模型的输出文本内容。我们可以将这两层处理封装成一个函数

langchain 把用作“解析模型输出”的函数叫做 output parser

output parser 也可以通过 | 加入到链中,这时调用 chain.invoke() 所拿到的的结果,就是经过 output parser 处理的结果

from langchain.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatTongyi
import dotenv

dotenv.load_dotenv(".env")

model = ChatTongyi(model="qwen-turbo")

prompt_template = ChatPromptTemplate.from_messages([
    ("system", "请将下列文本翻译成{language}"),
    ("user", "{text}")
])


def my_output_parser(model_output):
    print(f"\033[35m[info] token_usage: {model_output.response_metadata['token_usage']}\033[0m")
    return model_output.content


chain = prompt_template | model | my_output_parser

print(chain.invoke({"language": "今天天气真好", "text": "英文"}))

小结

在 LangChain 中,prompt template、model、output parser 是构建和执行链条的三个关键组件

prompt template 用来处理输入,output parser 用来处理输出

output parser 中也可以调用其他 chain 来处理当前 model 返回的结果

部署

LangServe 帮助开发者将 LangChain 链部署为 REST API

pip install "langserve[all]"
from fastapi import FastAPI
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_models import ChatTongyi
from langchain.prompts import ChatPromptTemplate
import langserve
import dotenv

dotenv.load_dotenv(".env")

prompt_template = ChatPromptTemplate.from_messages([
    ("system", "将下列文本翻译成{language},你只需返回翻译结果,不要返回其他内容"),
    ("user", "{text}")
])

model = ChatTongyi(model="qwen-turbo")

chain = prompt_template | model | StrOutputParser()

app = FastAPI(title="翻译")

langserve.add_routes(app, chain, path="/translate")

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="localhost", port=8000)

运行程序,访问 http://localhost:8000/translate/playground/

标签:prompt,template,应用程序,langchain,LLM,dotenv,import,model
From: https://www.cnblogs.com/SZDXDXDX/p/18355913

相关文章

  • Docker 的基本概念和优势,以及在应用程序开发中的实际应用
    Docker是一种用于虚拟化和部署应用程序的开源平台,它采用容器化技术,可以将应用程序及其依赖项打包成一个独立的、可移植的容器。以下是Docker的基本概念和优势:容器:Docker利用操作系统层面的虚拟化技术,将应用程序及其依赖项打包成一个独立的容器。每个容器都是独立的、可互......
  • JVM参数详解:优化应用程序性能的关键
    Java虚拟机(JVM)是Java程序的运行环境,它负责将Java字节码转换为机器码,并在实际计算机上执行。为了优化应用程序的性能,我们需要了解JVM的参数设置。本文将详细介绍JVM的常见参数及其作用,帮助您更好地理解和配置JVM。JVM参数分类JVM参数分为两大类:启动参数和系统属性。1.启......
  • 京粉智能推广助手-LLM based Agent在联盟广告中的应用与落地
    一、前言拥有一个帮你躺着赚钱的助手,听起来是不是有点心动?依托于京东联盟广告平台,借助AIGC大语言模型出色的理解、推理、规划能力,我们推出了京粉智能推广助手机器人,帮助合作伙伴拥有自己的智能助理,为京东联盟的推客提供更加智能的一站式经营服务。1、京东联盟是什么?《京东联盟......
  • 如何训练一个大语言模型(LLMs)?
    前言在当今数字时代,语言模型已经成为自然语言处理任务的强大工具,从文本生成到情感分析和机器翻译等各个方面都有涉猎。然而,训练这些模型需要仔细的规划、大量的计算资源以及机器学习技术方面的专业知识。那么一个大型语言模型(LLMs)到底是如何训练出来的呢?在查阅了解之后,我......
  • 无缝融入,即刻智能[一]:Dify-LLM大模型平台,零编码集成嵌入第三方系统,42K+星标见证专属智
    无缝融入,即刻智能[一]:Dify-LLM大模型平台,零编码集成嵌入第三方系统,42K+星标见证专属智能方案1.Dify简介1.1功能情况Dify,一款引领未来的开源大语言模型(LLM)应用开发平台,革新性地融合了后端即服务(BackendasaService,BaaS)与LLMOps的精髓,为开发者铺设了一条从创意原型到高效生......
  • LLM分类模式驱动一
      今天给大家带来的文章是LLM分类模式驱动,希望能对学习LLM的同学们有所帮助。文章目录1.前言2.模式驱动生成1.前言  随着这两年大语言模型的应用,各种语言模型已经在很多领域带来了许多颠覆性的成果,但是在融入各种程序环境时,大语言模型也遇到了一些阻碍。为了......
  • 打开Office(word、excel、ppt)显示操作系统当前的配置不能运行此应用程序最全解决方案
    我以前用过分区助手把office从c盘挪到d盘了,从那以后office就用不了了,然后我就删了(貌似没删干净)。最近由于有使用word的需求,所以我从学校官网找到正版软件的安装包,按照步骤重新卸载电脑中office残留并安装好之后,打开word会提示“操作系统当前的配置不能运行此应用程序”,ppt......
  • LangChain 安全特性全解析与实践指南
    LangChain安全特性全解析与实践指南引言在人工智能的浪潮中,LangChain以其卓越的能力,成为开发大型语言模型(LLM)应用程序的佼佼者。然而,随着技术的发展,安全问题逐渐浮出水面。本文将深入探讨LangChain的安全特性,并提供详细的代码示例和最佳实践,以确保开发者能够在保障安全......
  • OpenWebUI + Ollma 构建本地AI知识库
    本机环境:rocky_linux9.4,10G8核,100G磁盘部署的实验 安装Docker#step1:安装必要的一些系统工具sudoyuminstall-yyum-utilsdevice-mapper-persistent-datalvm2#Step2:添加软件源信息sudoyum-config-manager--add-repohttps://mirrors.aliyun.com/docker-ce/......
  • Struts2基础1--创建一个Struts2 Web应用程序
    Struts2不仅仅是Struts1的升级版本,更是一个全新的Struts架构,是当前较为普及和成熟的基于MVC设计模式的Web应用程序框架,并在RIA(RichInternetApplications)Web应用程序开发中得到了广泛应用,成为最好的Web框架之一。本文将通过详细的步骤来说明如何下载获取相关资源、安装设置......