首页 > 其他分享 >RAG与LLM原理及实践(2)--- RAG结合LLM function调用的原理及落地实践

RAG与LLM原理及实践(2)--- RAG结合LLM function调用的原理及落地实践

时间:2024-06-22 12:29:08浏览次数:21  
标签:RAG get tool 实践 current LLM response

花一点时间继续写下,RAG结合LLM。通过上一篇文章你应该知道为什么RAG要结合LLM,或者说为什么LLM要结合RAG使得LLM更强大,特别是当LLM 应用在人机对话等方面的时候。只要涉及一问一答,并通过上下文继续丰富对话,就会涉及到他。这个是看事情的两个维度。就像是买钟送电池还是买电池送闹钟。一方面,RAG的专家知识库上因为加入了LLM,而使得RAG对应更自然,不再是生硬的回答,借助LLM,可以帮助RAG的回答润色。另一方面,LLM因为专业知识的相对缺乏,毕竟是AIGC,不是垂直领域的AI,所以需要RAG帮忙加持,二者相互完善,彼此成就。好了,不太喜欢写虚的,直接开始干货分享。

在这两者结合的过程中,你要知道一件事,那就是LLM大模型必须知道你所提出的问题,在什么时候需要 LLM来回答, 什么时候需要 RAG 来回答,才是比较好的结果,prompt 起着至关重要的作用。他本质上会告诉LLM,这个问题由RAG来回答是比较好的,因为‘我’是这方面的领域专家。LLM怎么知道他是这方面领域的专家呢?就可以透过一些关键字来描述。当然prompt 的用处很多,很多书上会写他实际上会指导在客户描述的受限条件下,这里的受限条件,可以由prompt 来描述。比如 ‘如果你发现这类问题是医学相关的问题,请尝试使用我的RAG_Medcine 知识库做回答 ’。但在每个模型实现时,又有所差别。

我下面用通义千问 model 来进行举例说明,通过function式的调用如何实现RAG与LLM结合,并解释他是如何工作的,先附上完整代码:

from datetime import datetime
import random
import json
import dashscope
from dashscope import Generation

dashscope.api_key = '需要自己去申请一个key'

# 定义工具列表,模型在选择使用哪个工具时会参考工具的name和description
tools = [
    # 工具1 获取当前时刻的时间
    {
        "type": "function",
        "function": {
            "name": "get_current_time",
            "description": "当你想知道现在的时间时非常有用。",
            "parameters": {}  # 因为获取当前时间无需输入参数,因此parameters为空字典
        }
    },
    # 工具2 获取指定城市的天气
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "当你想查询指定城市的天气时非常有用。",
            "parameters": {  # 查询天气时需要提供位置,因此参数设置为location
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "城市或县区,比如北京市、杭州市、余杭区等。"
                    }
                }
            },
            "required": [
                "location"
            ]
        }
    }
]


# 模拟天气查询工具。返回结果示例:“北京今天是晴天。”
def get_current_weather(location):
    return f"{location}今天是晴天。 "


# 查询当前时间的工具。返回结果示例:“当前时间:2024-04-15 17:15:18。“
def get_current_time():
    # 获取当前日期和时间
    current_datetime = datetime.now()
    # 格式化当前日期和时间
    formatted_time = current_datetime.strftime('%Y-%m-%d %H:%M:%S')
    # 返回格式化后的当前时间
    return f"当前时间:{formatted_time}。"


# 封装模型响应函数
def get_response(messages):
    response = Generation.call(
        model='qwen-max',
        messages=messages,
        tools=tools,
        seed=random.randint(1, 10000),  # 设置随机数种子seed,如果没有设置,则随机数种子默认为1234
        result_format='message'  # 将输出设置为message形式
    )
    return response


def call_with_messages():
    print('\n')
    messages = [
        {
            "content": input('请输入:'),  # 提问示例:"现在几点了?" "一个小时后几点" "北京天气如何?"
            "role": "user"
        }
    ]

    # 模型的第一轮调用
    first_response = get_response(messages)
    assistant_output = first_response.output.choices[0].message
    print(f"\n大模型第一轮输出信息:{first_response}\n")
    messages.append(assistant_output)
    # 如果模型判断无需调用工具,则将assistant的回复直接打印出来,无需进行模型的第二轮调用
    if 'tool_calls' not in assistant_output:
        print(f"最终答案:{assistant_output.content}")
        return
    # 如果模型选择的工具是get_current_weather
    elif assistant_output.tool_calls[0]['function']['name'] == 'get_current_weather':
        tool_info = {"name": "get_current_weather", "role": "tool"}
        location = json.loads(assistant_output.tool_calls[0]['function']['arguments'])['properties']['location']
        tool_info['content'] = get_current_weather(location)
    # 如果模型选择的工具是get_current_time
    elif assistant_output.tool_calls[0]['function']['name'] == 'get_current_time':
        tool_info = {"name": "get_current_time", "role": "tool"}
        tool_info['content'] = get_current_time()
    print(f"工具输出信息:{tool_info['content']}\n")
    messages.append(tool_info)

    # 模型的第二轮调用,对工具的输出进行总结
    second_response = get_response(messages)
    print(f"大模型第二轮输出信息:{second_response}\n")
    print(f"最终答案:{second_response.output.choices[0].message['content']}")


if __name__ == '__main__':
    call_with_messages()

我们看看他的输出:

我们可以看到我们自己定义了专业的函数,这就相当于是 RAG,他的 "description": "当你想知道现在的时间时非常有用。" 为LLM指明了什么情况下 LLM 应该调用‘我’。当大模型发现需要调用‘我’RAG时,就会调用。同时我们将RAG生成的答案再经过一次LLM,他会在已有答案上进行之前我说的润色,得到最终答案。附上一个解释说明,你会更加明白:

时间有限,今天先写到这里,后面继续补充

标签:RAG,get,tool,实践,current,LLM,response
From: https://blog.csdn.net/talentyiyy/article/details/139865098

相关文章

  • RAG与LLM原理及实践(3)--- RAG结合LLM的local实现并附完整代码
    在写RAG结合LLM时,如果你读了我前面写的文章,你应该对里面的技术原理及流程有了很详细的了解。在上一篇文章讲了如何在通义千问中使用function的方式来完成LLM与RAG的结合。其实LLM结合RAG的方式可以有很多种,但是原理都是上一节介绍的,其实本质上就是要LLM知道,哪一类问题‘我’......
  • Dragon Boat Festival
    Asthesuncastitsgoldenraysoverthebustlingmarket,theairwasfilledwiththericharomaofbambooleavesandsteamingglutinousrice,whichsignaledthearrivaloftheDragonBoatFestival.Thescentofzongzi,wrappedtightlywiththesoundsof......
  • 【C#入门超简单】简单的项目实践
    学习C#时,通过创建控制台应用程序来实践文件操作、用户输入与输出处理是非常好的方式。下面我将引导你完成一个简单的项目:一个文本记录器,它能让你输入一些文本,保存到文件中,还能读取并显示之前保存的内容。第一步:创建控制台应用程序项目打开VisualStudio或VisualStudioCode。......
  • [题解]AT_abc236_e [ABC236E] Average and Median
    思路直接将输出的答案分为两个分考虑。(1)考虑二分+DP。设当前二分出的平均数为\(x\),如果合法,那么有(其中\(p\)为选出数下标的集合):\[\frac{a_{p_1}+a_{p_2}+\dots+a_{p_k}}{k}\geqx\]即:\[\frac{(a_{p_1}-x)+(a_{p_2}-x)+\dots+(a_{p_......
  • Camtasia 中视频制作和编辑的能力,让你能够创建更具创意和专业性的视频内容。随着实践
    Camtasia的初级应用,以下是一个简单的大纲,帮助你了解如何开始使用这款视频编辑和屏幕录制软件:1. 软件介绍和安装介绍Camtasia的功能和用途。下载和安装Camtasia软件。注册和激活软件(如果需要)。2. 录制屏幕启动Camtasia并了解用户界面。设置录制参数(如屏幕区域、......
  • Spring (73)Spring项目中的事务管理最佳实践
    Spring项目中的事务管理是确保数据一致性和完整性的关键组成部分。Spring提供了一套灵活而强大的事务管理框架,允许开发者以声明式和编程式两种方式来管理事务。为了确保高效和安全的事务管理,遵循最佳实践是非常重要的。下面深入探讨Spring事务管理的最佳实践,并结合源码分析......
  • Django REST framework安全实践:轻松实现认证、权限与限流功能
    系列文章目录Django入门全攻略:从零搭建你的第一个Web项目DjangoORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作DjangoORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解DjangoORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践跨域问题与Django解......
  • The Dragon Boat Festival Revise
    TheDragonBoatFestival,celebratedonthefifthdayofthefifthlunarmonth,isatimeofgreatjoyandexcitementinChina.Itisafestivalrichinhistoryandtradition,honoringthememoryoftheancientpoetQuYuan.Lastdragonboatfestivalfor......
  • 生成式AI和LLM的一些基本概念和名词解释
    1.MachineLearning机器学习是人工智能(AI)的一个分支,旨在通过算法和统计模型,使计算机系统能够从数据中学习并自动改进。机器学习算法使用数据来构建模型,该模型可用于预测或决策。机器学习应用于各种领域,包括计算机视觉、自然语言处理、语音识别和欺诈检测等。2.DeepLearnin......
  • Dragon Boat Festival
    DragonBoatFestivalTheDragonBoatFestival,atraditionalholidayinChina,fallsonthefifthdayofthefifthlunarmonth,anditsfestivitiesarefilledwithcolor,excitement,anddeepculturalsignificance.Andinmycommunity,weattachgreatimport......