首页 > 其他分享 >基于LangChain构建RAG应用

基于LangChain构建RAG应用

时间:2024-08-06 11:54:52浏览次数:13  
标签:RAG task 模型 LangChain api 构建 langchain key import

一、LLM接入LangChain

1. LangChain中LLM组成

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

  • 提示词模版:将用户输入添加到一个提示词模板中,这个提示词模版提供有关当前特定任务的附加上下文构建出适用于特定任务的提示词

  • 模型LangChain集成的各大平台模型,如ChatGPT、Claude、Mistral、ChatGLM

  • **输出解析器**:OutputParsers 将LLM的原始输出转换为可以在下游使用的格式,如json;

具体内容如下:

①提示词模版

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

unsetunset核心思想unsetunset
  • 1. 模版创建

  • 2. 用户输入

  • 3. 提示词打包

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

运行查看结果:

unsetunsetLangChain实现unsetunset
# 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)   

运行查看结果:

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

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

  • ChatMessageTemplate 系统提示词模版

  • ChatMessageTemplate 用户输入提示词模版

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

# 运行测试   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对象   

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

②模型

在过去的文章中,作者说明了LLM是RAG应用的核心,而LangChain 提供了对于多种大模型的封装,基于 LangChain 的接口可以便捷地调用 LLM 并将其集成在以 LangChain 为基础框架搭建的RAG个人应用中

标签:RAG,task,模型,LangChain,api,构建,langchain,key,import
From: https://blog.csdn.net/2301_76161259/article/details/140951548

相关文章

  • “码农接单坊”:构建全球程序员与技术需求的桥梁
    摘要在数字化时代,技术项目的高效实施与创新发展离不开高效的人才匹配与资源对接。本文深入探讨了“码农接单坊”这一专业的程序员在线接单与服务交流平台,通过分析其目标客户、平台定位、技术架构、核心功能及优势,揭示了其在连接全球程序员精英与项目需求方中的重要作用。同时,......
  • Android开发 - DialogFragment 类解析
    DialogFragment是什么DialogFragment是一种用于显示对话框的工具,同时它也是一个抽象类。在Android应用中,对话框是一种小窗口,通常用于显示重要信息或提示用户进行某些操作。通过使用DialogFragment,我们可以在应用中方便地显示和管理对话框DialogFragment的好处使用Dialo......
  • Langchain、Ollama 和 Llama 3 提示和响应
    目前,我正在返回多个响应,或者模型不知道何时结束响应,并且似乎在响应中重复系统提示(?)。我只想得到一个回复​​。我的设置非常简单,所以我想我缺少实现细节,但是我该怎么做才能只返回单个响应?fromlangchain_community.llmsimportOllamallm=Ollama(model="llama3")defget_m......
  • 《Advanced RAG》-03-使用 RAGAs + LlamaIndex 进行 RAG 评估
    摘要文章首先介绍了RAG评估的三个主要部分:输入查询、检索上下文和LLM生成的响应。提到了RAGAs提出的RAG评估指标,包括Faithfulness、AnswerRelevance和ContextRelevance,以及RAGAs网站提供的两个额外指标:ContextPrecision和ContextRecall。详细解释了每......
  • 《Advanced RAG》-05-探索语义分块(Semantic Chunking)
    摘要文章首先介绍了语义分块在RAG中的位置和作用,并介绍了常见的基于规则的分块方法。然后,阐述了语义分块的目的是确保每个分块包含尽可能多的独立语义信息。接着,文章分别介绍了三种语义分块方法的原理和实现方法,并对每种方法进行了总结和评估。文章观点语义分块是R......
  • 基于Docker Swarm、Portainer和Jenkins的Spring Cloud服务自动构建和部署
    本文探讨基于DockerSwarm、Portainer和Jenkins的SpringCloud微服务自动构建和部署。相对本文讨论的方案,业界更主流的是基于k8s,显而易见k8s的功能更强大,但也更复杂,也需要投入更多开发和运维成本。对于小公司,集群规模不会很大,DockerSwarm加上Portainer可以满足大部分需求,建议可以......
  • 解锁GraphRag.Net的无限可能:手把手教你集成国产模型和本地模型
        在上次的文章中,我们已经详细介绍了GraphRag的基本功能和使用方式。如果你还不熟悉,建议先阅读前面的文章    通过前两篇文章,相信你已经了解到GraphRag.Net目前只支持OpenAI规范的接口,但许多小伙伴在社区中提议,希望能增加对本地模型(例如:ollama等)的支持。所以这......
  • pnpm-lock.yaml文件对项目构建有影响吗 pnpm-lock.yaml本地变更需要提交相关变更吗
    pnpm-lock.yaml文件是Pnpm包管理器生成的锁文件,用于锁定项目依赖的确切版本。这个文件确保了在不同环境中安装依赖时,所有开发者和部署系统都能获得一致的依赖树。对项目构建的影响:一致性:pnpm-lock.yaml确保了项目依赖的一致性,无论在哪个环境或哪个开发者的机器上构建项目,......
  • 为什么 Langchain HuggingFaceEmbeddings 模型尺寸与 HuggingFace 上所述的不一样
    我使用的是langchainHuggingFaceEmbeddings模型:dunzhang/stella_en_1.5B_v5。当我查看https://huggingface.co/spaces/mteb/leaderboard时,我可以看到型号是8192。但当我这样做时len(embed_model.embed_query("heyyou"))它给了我1024。请问为什么会有这种差......
  • 《构建之法》读后感
    在阅读了邹欣所著的《构建之法》之后,我深受启发,不仅加深了对软件工程的理解,还重新审视了自己在过去的工作和学习中的方法和态度。这本书从多个维度剖析了软件开发的构建过程,让我意识到自己在许多方面存在的不足,并提供了宝贵的改进建议。我过去是怎么做的在接触《构建之法》之前,......