有了大语言模型还需要 RAG 做什么

news2025/3/18 5:25:09

一、百炼平台简介

阿里云的百炼平台就像是一个超级智能的大厨房,专门为那些想要做出美味AI大餐的企业和个人厨师准备的。你不需要从头开始做每一道菜,因为这个厨房已经为你准备了很多预制食材(预训练模型),你可以根据自己的口味(业务需求)对这些食材进行调味和烹饪(微调)。
在这里插入图片描述

百炼平台主要特点:

  • 啥都能做:无论是文字处理、图像生成还是语音识别,甚至是推荐系统,“百炼平台”就像一个多才多艺的大厨,什么都能搞定。

  • 火力全开:有了阿里云强大的计算能力作为后盾,比如高性能的GPU和TPU,即使是最复杂的食谱(大规模数据集上的训练任务)也能轻松完成。

  • 食材管理:提供一整套工具来挑选最好的原材料(数据清洗、标注及增强技术),确保菜肴(模型)既美味又健康。

  • 快速上手:即使是新手,也可以利用平台提供的现成配方(预训练模型)和自动化的烹饪助手(AutoML),让制作过程变得简单快捷。

  • 轻松出餐:无论是想通过外卖(API接口开发)还是在自家餐厅(云端部署)为顾客服务,“百炼平台”都提供了简便的操作流程,迅速把美食送到客人面前。

  • 各式菜品:已经在金融、医疗、零售等多个领域成功地做出了不少受欢迎的菜品,展示了它在不同行业中的应用潜力。

二、加载阿里大模型

接下来展示如何利用Python脚本通过langchain_community库访问阿里云的大规模语言模型(以Qwen-Turbo为例)和服务,包括聊天交互功能和文本嵌入功能。

它提供了一个简单的入口点,允许开发者快速测试与阿里云模型的交互过程。这对于希望集成阿里云AI能力到自己应用中的开发者来说是一个很好的起点。

注意,实际运行这段代码之前,需要确保已经正确配置了相关的环境变量,例如API密钥等,这通常是通过.env文件完成的。下面这段代码保存在models.py文件中

from langchain_community.chat_models import ChatTongyi
from langchain_community.embeddings.dashscope import DashScopeEmbeddings
from dotenv import load_dotenv
load_dotenv()

def get_tongyi_chat_model():
    """加载阿里大模型"""
    return ChatTongyi(model="qwen-turbo", temperature=0.1, top_p=0.3, max_tokens=512)

def get_tongyi_embed_model():
    """加载阿里向量化大模型"""
    return DashScopeEmbeddings(model="text-embedding-v3")

if __name__ == "__main__":
    """测试"""
    chat = get_tongyi_chat_model()
    response = chat.invoke("你好")
    print(response)

输出结果:

AIMessage(content='你好!很高兴为你提供帮助。', 
additional_kwargs={}, 
response_metadata={'model_name': 'qwen-turbo', 'finish_reason': 'stop', 'request_id': 'b97d9cd6-f2d7-9f31-b210-dc8b77cbe200', 'token_usage': {'input_tokens': 9, 'output_tokens': 7, 'total_tokens': 16}}, id='run-049c4807-7310-4b50-be44-e29a52472fcd-0')

代码解释

  1. 加载环境变量

    from dotenv import load_dotenv
    load_dotenv()
    

    这部分代码用来加载项目根目录下的.env文件中的环境变量。这些环境变量通常包含API密钥、模型ID等敏感信息,避免直接在代码中暴露,此处调用阿里的大模型,就需要在百炼平台申请自己专属的API_KEY,填写到.env文件中

    DASHSCOPE_API_KEY=sk-0d5a1111*****111de0b2f
    
  2. 导入所需模块

    • langchain_community.chat_models导入ChatTongyi,这是用来与阿里云的对话模型进行交互的接口。
    • langchain_community.embeddings.dashscope导入DashScopeEmbeddings,用于获取文本的向量表示。
  3. 定义函数

    • get_tongyi_chat_model():该函数返回一个配置好的ChatTongyi实例,这里指定了模型版本为qwen-turbo,并设置了生成回复时的一些参数,如temperature(创造力)、top_p(核采样),以及max_tokens(最大输出长度)。
    • get_tongyi_embed_model():此函数返回一个配置好的DashScopeEmbeddings实例,专门用于将文本转换成向量表示,这里指定了使用的模型为text-embedding-v3
  4. 测试功能
    if __name__ == "__main__":块中,首先调用get_tongyi_chat_model()来初始化聊天模型,然后通过chat.invoke("你好")发送一条消息给模型,并打印出模型的响应结果。

三、引入模型

新建一个文件,把上面保存的models.py 代码引入。

from models import get_tongyi_chat_model
model = get_tongyi_chat_model()
model.invoke(input="你好")

四、阅读理解

这段代码使用langchain_core库来构建一个基于文本的问答系统,具体来说是利用预定义的提示模板和语言模型来回答关于给定文章的问题。给一个段落,按照段落的描述来回答问题!

from langchain_core.messages import SystemMessage
from langchain_core.messages import HumanMessage
from langchain_core.prompts import SystemMessagePromptTemplate
from langchain_core.prompts import HumanMessagePromptTemplate
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

sys_msg = SystemMessage(content="""
你是一个阅读理解机器人!
请认真阅读用户提供的文章,并根据文章的内容来回答用户的问题!、
请注意:如果问题没有在文章中出现,请直接使用你自己的知识来回答!
""")
user_msg = HumanMessage(content="""
文章为:

孙中山(1866年11月12日-1925年3月12日),名文,字载之,号日新,又号逸仙,又名帝象,化名中山樵,伟大的民族英雄、伟大的爱国主义者、中国民主革命的伟大先驱 [1],中华民国和中国国民党的缔造者,三民主义的倡导者,创立了《五权宪法》。他首举彻底反帝反封建的旗帜,“起共和而终两千年封建帝制”。 [2]
孙中山1866年11月12日生于广东省广州府香山县(今中山市)翠亨村。孙中山原在香港学医,并成为西医医师。孙中山目睹中华民族有被西方列强瓜分的危险,决定抛弃“医人生涯”,进行“医国事业”。孙中山早期受郑观应的改良思想影响,后看清了清政府的腐败,决心推翻清王朝,建立民主共和国。 [3-4] [44]
1894年11月24日,孙中山在檀香山创立兴中会 [4]。1905年(光绪三十一年)成立中国同盟会。1911年10月10日(宣统三年)新军中的革命党人暗中联络,决定当天晚上起义。辛亥革命后被推举为中华民国临时大总统(任期1912年1月1日——1912年4月1日)。1925年3月12日,孙中山因癌症在北京逝世。1929年6月1日,根据其生前遗愿,葬于南京紫金山中山陵。1940年,国民政府通令全国,尊称其为“中华民国国父”。
孙中山著有《建国方略》、《建国大纲》、《三民主义》等。其著述在逝世后多次被结集出版,有中华书局1986年出版的十一卷本《孙中山全集》,台北1969、1973、1985年出版的《国父全集》等。

问题为:

孙中山跟毛泽东是什么关系?

答案为:
""")
messages = [sys_msg, user_msg]
model.invoke(input=messages)

输出内容:

AIMessage(content='文章中没有提及孙中山与毛泽东的关系。根据我自己的知识,孙中山是中国近代民主革命的先行者,而毛泽东是中华人民共和国的主要缔造者之一。两人都是中国历史上的重要人物,但他们在不同的时代活跃,孙中山是毛泽东早年的革命导师之一,对中国共产党的成立和发展有着重要的影响。', 
additional_kwargs={}, 
response_metadata={'model_name': 'qwen-turbo', 'finish_reason': 'stop', 'request_id': '7fc32746-ab86-9a82-a95b-a059a6d30c74', 'token_usage': {'input_tokens': 550, 'output_tokens': 69, 'total_tokens': 619}}, id='run-b2e9813c-daba-4c88-a564-6844fba0d82b-0')

让用户传过一篇文章和一个问题,我们根据用户的文章来回答用户的问题

sys_prompt = SystemMessagePromptTemplate.from_template(template="""
你是一个阅读理解机器人!
请认真阅读用户提供的文章,并根据文章的内容来回答用户的问题!
请注意:
    1, 如果问题没有在文章中出现,请直接使用你自己的知识来回答!
    2, 不需要做任何的解释,直接回答问题的结果即可!
""")
user_prompt = HumanMessagePromptTemplate.from_template(template="""
文章为:
{passage}
问题为:
{question}
答案为:
""")
prompt = ChatPromptTemplate.from_messages(messages=[sys_prompt, user_prompt])
output_parser = StrOutputParser()
chain = prompt | model | output_parser
passage = """
孙中山,名文,字载之,号日新,又号逸仙,又名帝象,化名中山樵,伟大的民族英雄、伟大的爱国主义者、中国民主革命的伟大先驱 [1],中华民国和中国国民党的缔造者,三民主义的倡导者,创立了《五权宪法》。他首举彻底反帝反封建的旗帜,“起共和而终两千年封建帝制”。 [2]
孙中山生于广东省广州府香山县(今中山市)翠亨村。孙中山原在香港学医,并成为西医医师。孙中山目睹中华民族有被西方列强瓜分的危险,决定抛弃“医人生涯”,进行“医国事业”。孙中山早期受郑观应的改良思想影响,后看清了清政府的腐败,决心推翻清王朝,建立民主共和国。 [3-4] [44]
1894年11月24日,孙中山在檀香山创立兴中会 [4]。1905年(光绪三十一年)成立中国同盟会。1911年10月10日(宣统三年)新军中的革命党人暗中联络,决定当天晚上起义。辛亥革命后被推举为中华民国临时大总统(任期1912年1月1日——1912年4月1日)。1925年3月12日,孙中山因癌症在北京逝世。1929年6月1日,根据其生前遗愿,葬于南京紫金山中山陵。1940年,国民政府通令全国,尊称其为“中华民国国父”。
孙中山著有《建国方略》、《建国大纲》、《三民主义》等。其著述在逝世后多次被结集出版,有中华书局1986年出版的十一卷本《孙中山全集》,台北1969、1973、1985年出版的《国父全集》等。
"""

question = """
Please list 孙中山's other names!
"""
chain.invoke(input=dict(passage=passage, question=question))

输出结果:

孙中山的其他名字包括:日新、逸仙、帝象、中山樵。

代码解释

  1. 导入必要的模块

    • from langchain_core.messages import SystemMessage, HumanMessage:用于创建系统消息和用户消息对象。
    • from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate, ChatPromptTemplate:用于创建提示模板,这些模板定义了模型应该如何理解和响应输入。
    • from langchain_core.output_parsers import StrOutputParser:用于解析模型输出为字符串格式。
  2. 初始化系统和用户消息

    • 定义了一个系统消息sys_msg,告诉模型它应该扮演的角色(即阅读理解机器人)以及如何处理用户的提问。
    • 创建了一个用户消息user_msg,其中包含了文章内容和问题,但在这个例子中直接在后续部分重新定义了passagequestion
  3. 创建提示模板

    • 使用SystemMessagePromptTemplate.from_template创建系统提示模板,明确说明了模型的行为准则。
    • 使用HumanMessagePromptTemplate.from_template创建用户提示模板,允许动态插入文章内容({passage})和问题({question})。
    • 结合系统提示和用户提示,通过ChatPromptTemplate.from_messages创建完整的聊天提示模板。
  4. 配置链式调用

    • 通过将提示模板、模型和输出解析器链接起来(prompt | model | output_parser),形成一个可以接受输入并产生输出的完整链条。
  5. 执行推理

    • 最后,通过调用chain.invoke(input=dict(passage=passage, question=question)),向模型发送具体的输入(文章和问题),并获取模型的回答。

上面这段代码演示如何使用langchain_core库来搭建一个简单的问答系统。首先定义模型应该如何根据提供的文章内容回答问题的规则,然后通过特定的提示模板和实际的文章及问题实例化这些规则,并最终通过调用语言模型来获得答案。这种方式非常适合需要对特定文档进行问答的应用场景,比如知识库查询、教育辅助等。

五、私有知识库怎么使用

通过上述代码示例,我们可以看到如何使用预定义的提示模板和语言模型来根据给定的文章内容回答问题。然而,在实际应用场景中,尤其是当涉及到公司内部大量私有知识资料时,直接使用这样的方式可能并不高效或有效。这就引出了RAG(检索增强生成, Retrieval-Augmented Generation)的作用。

设想一下,如果我们要让大模型根据公司的私有知识资料(如产品说明、规章制度、对外文案等)来回答员工或客户的问题。这里存在几个挑战:

  1. 私有知识资料数量庞大:如果完全参考所有资料,不仅效率低下,而且可能会导致信息过载。
  2. 只提取相关知识:理想情况下,我们希望仅提供与具体问题相关的那部分知识给大模型,以提高回答的准确性和效率。

如何解决这些问题?

  • 文本相似度检索:一种解决方案是基于文本相似度来筛选出与问题最相关的知识片段。这可以通过两种方式实现:
    • 关键词匹配:虽然简单直接,但需要预先准备大量的关键词,并且在多语言环境下不够灵活。
    • 语义化匹配:这种方法更加智能,它不依赖于具体的词汇,而是试图理解文本的真正含义,从而支持跨语言和表达习惯的理解。

实现步骤

  1. 准备阶段

    • 加载/读取私有知识:首先收集并准备好所有的私有知识资料。
    • 切分私有知识:将这些资料按照逻辑独立的单元进行分割。
    • 向量化:使用类似BERT的模型将每个知识片段转化为向量表示。
    • 入库:将这些向量化的知识片段存储到一个高效的向量数据库中,以便快速检索。
  2. 使用阶段

    • 提问:用户提出一个问题。
    • 检索:利用之前提到的方法,将问题转换为向量,并在向量数据库中查找最相似的知识片段。
    • 增强:在原始提示中整合问题及其相关的上下文信息。
    • 生成:最终由大模型基于增强后的输入生成答案。

这种模式不仅解决了直接处理大量数据的问题,还提高了回答的精准度和相关性。这就是RAG的核心思想——通过结合检索和生成技术,既能够精确地定位相关信息,又能灵活地生成符合用户需求的答案。因此,RAG对于构建更加智能和高效的问答系统具有重要意义。

六、RAG和百度等搜索引擎有什么区别

RAG(Retrieval-Augmented Generation,检索增强生成)和传统的搜索引擎如百度之间存在几个关键的不同点。虽然两者都涉及信息的检索,但它们的目标、方法以及最终的应用场景有所不同。

目标与功能

  • RAG

    • RAG的核心目标是利用外部知识库来增强语言模型的回答能力,使回答更加准确、具体,并且基于最新的信息。
    • 它不仅查找相关信息,还会对找到的信息进行加工处理,并生成一段自然流畅的回答。
    • 更适合于需要深度理解和分析的任务,比如专业咨询、法律建议等。
  • 百度等搜索引擎

    • 搜索引擎的主要任务是根据用户的查询提供一系列可能相关的网页链接。
    • 它们通常不直接生成答案,而是让用户自己去浏览搜索结果中的内容以获取所需信息。
    • 更适用于广泛的搜索需求,包括但不限于新闻、娱乐、教育资料等。

工作流程

  • RAG

    • 首先通过检索组件从外部知识库中寻找相关的信息片段。
    • 然后,这些信息被用作上下文输入给生成模型,帮助其理解问题并生成针对性的答案。
    • 这种方式可以确保答案是基于最新且最相关的数据。
  • 百度等搜索引擎

    • 使用复杂的算法评估网页的相关性和质量,然后按照一定的顺序展示搜索结果。
    • 用户点击感兴趣的链接后,自行阅读页面内容来解答自己的问题。

技术实现

  • RAG

    • 利用了先进的自然语言处理技术,特别是预训练的语言模型和向量检索技术。
    • 依赖于语义理解而非简单的关键词匹配,这使得它能够更好地捕捉查询背后的意图。
  • 百度等搜索引擎

    • 虽然也采用了NLP技术,但更侧重于网页抓取、索引构建以及排序算法等方面。
    • 关键词匹配仍然是一个重要的组成部分,尽管现代搜索引擎也开始采用语义搜索技术来提高准确性。

总的来说,RAG更像是一个智能助手,它可以深入理解和处理复杂的问题,而不仅仅是提供链接列表;相比之下,百度等传统搜索引擎则是为了满足广泛的信息探索需求而设计的,它们提供了海量的信息入口,但不一定直接给出精确的答案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【从0到1搞懂大模型】RNN基础(4)

先说几个常用的可以下载数据集的地方 平台:kaggle(https://www.kaggle.com/datasets) 和鲸社区(https://www.heywhale.com/home) 阿里天池(https://tianchi.aliyun.com/) 其他:海量公…

【第K小数——可持久化权值线段树】

题目 代码 #include <bits/stdc.h> using namespace std;const int N 1e5 10;int a[N], b[N]; int n, m, len; int rt[N], idx; // idx 是点分配器struct node {int l, r;int s; } tr[N * 22];int getw(int x) {return lower_bound(b 1, b len 1, x) - b; }int bui…

本地部署Deep Seek-R1,搭建个人知识库——笔记

目录 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 2&#xff1a;部署DeepSeek - R1模型 3&#xff1a;安装Cherry Studio 二、构建私有知识库 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 1.打开Ollama下载安装 未科学上网&#xff0c;I 先打开迅雷再下…

【软考-架构】5.3、IPv6-网络规划-网络存储-补充考点

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 IPv6网络规划与设计建筑物综合布线系统PDS&#x1f4af;考试真题第一题第二题 磁盘冗余阵列网络存储技术其他考点&#x1f4af;考试真题第一题第二题 IPv6 网络规划与设计…

fastapi+angular外卖系统

说明&#xff1a; fastapiangular外卖系统 1.美食分类&#xff08;粥&#xff0c;粉&#xff0c;面&#xff0c;炸鸡&#xff0c;炒菜&#xff0c;西餐&#xff0c;奶茶等等&#xff09; 2.商家列表 &#xff08;kfc&#xff0c;兰州拉面&#xff0c;湘菜馆&#xff0c;早餐店…

鸿蒙路由 HMRouter 配置及使用 三 全局拦截器使用

1、前期准备 简单封装一个用户首选项的工具类 import { preferences } from "kit.ArkData";// 用户首选项方法封装 export class Preferences {private myPreferences: preferences.Preferences | null null;// 初始化init(context: Context, options: preference…

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称 CNNs&#xff09;是一种深度学习架构&#xff0c;专门用于处理具有网格结构的数据&#xff0c;如图像、视频等。它们在计算机视觉领域取得了巨大成功&#xff0c;成为图像分类、目标检测、图像分…

永磁同步电机无速度算法--拓展卡尔曼滤波器

一、原理介绍 以扩展卡尔曼滤波算法为基础&#xff0c;建立基于EKF算法的估算转子位置和转速的离散模型。 实时性是扩展卡尔曼滤波器的一种特征&#xff0c;所以它可实时跟踪系统的状态并进行有效的输出&#xff0c;同时&#xff0c;它可以减少干扰、抑制噪声&#xff0c;其效…

【CF】Day9——Codeforces Round 953 (Div. 2) BCD

B. New Bakery 题目&#xff1a; 思路&#xff1a; 被标签害了&#xff0c;用什么二分&#xff08; 很简单的思维题&#xff0c;首先如果a > b&#xff0c;那么全选a就行了&#xff0c;还搞啥活动 否则就选 b - a 天来搞活动&#xff0c;为什么&#xff1f; 首先如果我…

harmonyOS NEXT开发与前端开发深度对比分析

文章目录 1. 技术体系概览1.1 技术栈对比1.2 生态对比 2. 开发范式比较2.1 鸿蒙开发范式2.2 前端开发范式 3. 框架特性对比3.1 鸿蒙 Next 框架特性3.2 前端框架特性 4. 性能优化对比4.1 鸿蒙性能优化4.2 前端性能优化 5. 开发工具对比5.1 鸿蒙开发工具5.2 前端开发工具 6. 学习…

Unity小框架之单例模式基类

单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的创建型设计模式&#xff0c;其核心目标是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。它常用于需要控制资源访问、共享配置或管理全局状态的场景&#xff08;如数据库连接池、日志管理器、应用配置…

cesium 实现万级管网数据渲染,及pickImageryLayerFeatures原生方法改写

需求背景解决效果getFeatureInfo 需求背景 在用 geoserver 渲染图层时&#xff0c;会自动触发 GetFeatureInfo &#xff0c;与服务器通信&#xff0c;在万级海量数据渲染下&#xff0c;这个性能消耗就可以感受到了 需要考虑的点&#xff1a; 1.通过enablePickFeatures&#xf…

基于金融产品深度学习推荐算法详解【附源码】

深度学习算法说明 1、简介 神经网络协同过滤模型(NCF) 为了解决启发式推荐算法的问题&#xff0c;基于神经网络的协同过滤算法诞生了&#xff0c;神经网络的协同过滤算法可以 通过将用户和物品的特征向量作为输入&#xff0c;来预测用户对新物品的评分&#xff0c;从而解决…

LVS + Keepalived 高可用集群

一、LVSKeepalived 原理 1.1.LVS 负载均衡原理 LVS&#xff08;Linux Virtual Server&#xff09;是一种基于 Linux 内核的负载均衡技术&#xff0c;它通过 IPVS&#xff08;IP Virtual Server&#xff09;模块来实现。LVS 可以将客户端的请求分发到多个后端服务器上&#xf…

PHP与数据库连接常见问题及解决办法

PHP与数据库连接常见问题及解决办法 在现代Web开发中&#xff0c;PHP与数据库的连接是不可或缺的一部分。无论是构建动态网站、内容管理系统&#xff08;CMS&#xff09;还是电子商务平台&#xff0c;PHP与数据库的交互都是核心功能之一。然而&#xff0c;在实际开发过程中&am…

HarmonyOS-应用程序框架基础

应用程序框架与应用模型的区别 应用框架可以看做是应用模型的一种实现方式&#xff0c;开发人员可以用应用模型来描述应用程序的结构和行为的描述&#xff0c;然后使用应用程序框架来实现这些描述。 应用模型 应用模型是一个应用程序的模型&#xff0c;它是一种抽象的描述&a…

使用 Doris 和 LakeSoul

作为一种全新的开放式的数据管理架构&#xff0c;湖仓一体&#xff08;Data Lakehouse&#xff09;融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势&#xff0c;帮助用户更加便捷地满足各种数据处理分析的需求&#xff0c;在企业的大数据体系中已经得到越来越…

【C语言】函数和数组实践与应用:开发简单的扫雷游戏

【C语言】函数和数组实践与应用&#xff1a;开发简单的扫雷游戏 1.扫雷游戏分析和设计1.1扫雷游戏的功能说明&#xff08;游戏规则&#xff09;1.2游戏的分析与设计1.2.1游戏的分析1.2.2 文件结构设计 2. 代码实现2.1 game.h文件2.2 game.c文件2.3 test.c文件 3. 游戏运行效果4…

国内Mac,nimi安装homebrew完整过程

安装命令&#xff1a; 常规安装脚本&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 极速安装脚本&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.…

C++基础——从C语言快速入门

目录 输入输出 标准输出流 ( cout ) 标准输入流 ( cin ) 标准错误流 ( cerr ) 和标准日志流 ( clog ) 编程示例 基本变量类型 宽字符的用法 climits 如何使用 编程示例 注意事项 流程控制 条件语句 循环语句 跳转语句 函数 函数的基本结构 编程示例 函数的组成…