当前位置:   article > 正文

【LLM大模型】基于LangChain构建RAG应用_custom get token ids

custom get token ids

本文将基于上一篇文章的结果进行开发,主要内容为:

  • 将LLM接入LangChain:选择LLM,然后在LangChain中使用;
  • 构建检索问答链:使用语法构建RAG问答链
  • 部署知识库助手:使用streamlit部署项目;

帮助读者快速构建RAG应用并部署在阿里云服务器上


一、LLM接入LangChain

1. LangChain中LLM组成

LLM API原生调用方法不同,在LangChain中,LLM调用过程高度抽象,其由模型(Model)提示词模版(Prompt Template) 输出解析器(Output parser) 组成;如上图所示:

  • 提示词模版 :将用户输入添加到一个提示词模板中,这个提示词模版提供有关当前特定任务的附加上下文构建出适用于特定任务的提示词
  • 模型 LangChain集成的各大平台模型,如ChatGPT、Claude、Mistral、ChatGLM
  • 输出解析器OutputParsers 将LLM的原始输出转换为可以在下游使用的格式,如json;

具体内容如下:

①提示词模版

作者在本系列的第一篇文章中就强调:提示词工程是LLM开发者重要的知识基础和必备技能,而此处的提示词模版就是提示词工程的一个应用载体 ;通过构建提示词模版,我们可以减少开发过程中的输入,优化用户体验,提高RAG应用处理速度;

核心思想
  • 1. 模版创建
  • 2. 用户输入
  • 3. 提示词打包
原生实现
ini
复制代码
# 原生构建提示词模版
template = """请你将由三个反引号分割的文本翻译成英文!\
text: ```{text}```
"""
# 用户输入
text = "Babylon是一个开源的JavaScript解析器和代码转换工具,用于分析和转换JavaScript代码。它是由Microsoft开发的,旨在提供一个高性能、可扩展和可靠的解析器,用于支持各种JavaScript工具和框架。"
# prompt打包
prompt = template.format(text=text)
print(prompt)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行查看结果:

LangChain实现
ini
复制代码
# LangChain实现
from langchain.prompts.chat import ChatPromptTemplate

# system prompt template
template = "你当前是一个翻译助手,请将 {input_language} 翻译成 {output_language}."


human_template = "翻译内容:{text}"

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", template),
    ("human", human_template),
])

text = "Babylon是一个开源的JavaScript解析器和代码转换工具,用于分析和转换JavaScript代码。"
messages  = chat_prompt.format_messages(input_language="中文", output_language="英文", text=text)
print(messages)
print("---------")
print(messages[0].content)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

运行查看结果:

可以看到,在LangChain中,ChatPromptTemplate不仅支持用户输入HumanMessage的提示词模版,也支持系统提示system prompt的提示词模版;通过区分系统提示词和用户输入提示词,可以在进行重复性任务时,固定system prompt,只改变用户输入以降低工作量和时间成本

Langchain中,一个 ChatPromptTemplate 是一个 ChatMessageTemplate 的列表。

  • ChatMessageTemplate 系统提示词模版
  • ChatMessageTemplate 用户输入提示词模版

我们将打包好的提示词输入给LLM输出一下:

ini
复制代码
# 运行测试
import os
import openai
from dotenv import load_dotenv, find_dotenv
from langchain_mistralai.chat_models import ChatMistralAI

# 读取本地/项目的环境变量。
# find_dotenv()寻找并定位.env文件的路径
# load_dotenv()读取该.env文件,并将其中的环境变量加载到当前的运行环境中  
_ = load_dotenv(find_dotenv()); # 如果环境变量是全局的,这行代码可以省略

# 获取环境变量 OPENAI_API_KEY
api_key = os.environ['MISTRAL_API_KEY']

# 实例化一个ChatMistralAI类:然后设置其Mistral API_KEY;
llm = ChatMistralAI(api_key=api_key)
print(llm)

# 做一个输出
output = llm.invoke(messages)
print(output.content) # 其返回结果也是一个Message对象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

可以看到,内容已经成功翻译;

②模型

在过去的文章中,作者说明了LLM是RAG应用的核心,而LangChain 提供了对于多种大模型的封装,基于 LangChain 的接口可以便捷地调用 LLM 并将其集成在以 LangChain 为基础框架搭建的RAG个人应用中 本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/972413

推荐阅读
相关标签