大语言模型应用与传统程序的不同

news2024/11/22 23:59:42

        大语言模型(LLM) 被描述的神乎其神,无所不能,其实,大语言模型只是一个模型,它能够理解和生成自然语言,唯有依靠应用程序才能够发挥作用。例如,基于大模型可以构建一个最简单的会话机器人,需要有IO 模型,将用户的提问发送给大模型,大模型得到回应后,通过输出模块将问答反馈给用户。为了使大模型能够准确地理解用户的提问,LLM 应用程序要给它合适的提示(Prompt),所有的函数都有合适的描述(Description)。

        可以将大语言模型应用是看作一个基于自然语言描述的的程序。传统的条件,循环,状态判断也都是由LLM 完成的。所以,同样结构的LLM 应用,使用不同的LLM,或者不同的提示和描述,其效果的是不同的。这一点与传统的程序是不同的。

  从关注程序的语法转向语义的表达是AI时代的最大转变。

各种大语言模型应用架构

AI应用的五层基石理论

AI应用的的架构, 初创公司Seednapse AI创始人提出构建AI应用的五层基石理论,受到业界关注。

  • Models,也就是我们熟悉的调用大模型API。
  • Prompt Templates,在提示词中引入变量以适应用户输入的提示模版。
  • Chains,对模型的链式调用,以上一个输出为下一个输入的一部分。
  • Agent,能自主执行链式调用,以及访问外部工具。
  • Multi-Agent,多个Agent共享一部分记忆,自主分工相互协作。

提示工程

        提示工程,也称为上下文提示,是指如何与 LLM 通信以在不更新模型权重的情况下引导其行为以获得所需结果的方法。这是一门实证科学,提示工程方法的效果在模型之间可能会有很大差异,因此需要大量的实验和启发式方法。

langchain 链

    如同计算机程序一样,当AI 完成复杂的任务时,需要若干的步骤,或者称为组件,这些组件通过一定的顺序链接起来执行,这便是langchain 的核心思想。

       链( Chains )是一个非常通用的概念,它指的是将一系列模块化组件(或其他链)以特定方式组合起来,以实现共同的用例。

链(Chain)是对多个独立组件进行端到端封装的一种方式。

     简单的说,就是把自然语言输入、关联知识检索、Prompt组装、可用Tools信息、大模型调用、输出格式化等这些LLM 应用中的常见动作,组装成一个可以运行的“链”式过程。链可以直接调用。    

     最常用的链类型是LLMChain(LLM链),它结合了PromptTemplate(提示模板)、Model(模型)和Guardrails(守卫)来接收用户输入,进行相应的格式化,将其传递给模型并获取响应,然后验证和修正(如果需要)模型的输出。

LCEL表达式语言

LCEL 的全称是"LangChain Expression Language",langchain 表达语言。是一种声明式方法,可以轻松地将链组合在一起。

      最基本和常见的用例是将提示模板和模型链接在一起。为了了解这是如何工作的,

       创建一个链条,它接受一个主题并生成一个笑话:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}")
model = ChatOpenAI(model="gpt-4")
output_parser = StrOutputParser()

chain = prompt | model | output_parser

chain.invoke({"topic": "ice cream"})

输出

"为什么冰淇淋从不被邀请参加派对?\n\n因为当事情变热时,它们总是滴下来!

 使用LCEL将不同的组件组合成一个单一的链条:

chain = prompt | model | output_parser

例子

from langchain_community.vectorstores import DocArrayInMemorySearch
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain_openai.chat_models import ChatOpenAI
from langchain_openai.embeddings import OpenAIEmbeddings

vectorstore = DocArrayInMemorySearch.from_texts(
    ["harrison worked at kensho", "bears like to eat honey"],
    embedding=OpenAIEmbeddings(),
)
retriever = vectorstore.as_retriever()

template = """Answer the question based only on the following context:
{context}

Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()
output_parser = StrOutputParser()

setup_and_retrieval = RunnableParallel(
    {"context": retriever, "question": RunnablePassthrough()}
)
chain = setup_and_retrieval | prompt | model | output_parser

chain.invoke("where did harrison work?")

 在这种情况下,组合的链条是: 

chain = setup_and_retrieval | prompt | model | output_parser

智能体(Agent)

在大模型语境下,可以理解成能自主理解、规划、执行复杂任务的系统。

Agent 包含了一组工具,由大模型不断地思考,选择合适的工具,获得最后的结果。

上面的循环也能够使用下面的流程图来表达。

        从这个意义上讲,Agent 是一个循环体。在Agent 中,LLM 起到了推理的作用,它可以讲用户的需求分解成若干的任务,选择合适的工具去执行。 Agent 就像一个“小工”(比如一个瓦匠),告诉他要完成的工作,以及一些工具。并且简单的教他一些注意事项,小工就开干了。他会选择不同的工具,直到工作完成。

        Agent 的效果很大程度上取决于大模型的理解能力,同样的Agent ,使用不同的大语言模型,其效果变化很大。另外一个重要的因素是提示和描述,在大语言模型应用中,每个工具(函数) 都有一段描述,大语言模型依靠阅读并理解工具的描述来决定使用哪一个工具。

    agent 内部有一个类似运行时(runtime) 的程序(AgentExecutor )。

next_action = agent.get_action(...)
while next_action != AgentFinish:
    observation = run(next_action)
    next_action = agent.get_action(..., next_action, observation)
return next_action

multi-Agent(langGraph )

 langGraph 是langchain的库,用于构建多Agent 工作流(multi-Agent workFlow)

       LangGraph 的核心概念之一是状态。每个图形执行都会创建一个状态,该状态在执行时在图形中的节点之间传递,并且每个节点在执行后使用其返回值更新此内部状态。图形更新其内部状态的方式由所选图形类型或自定义函数定义。

        LangGraph本质上是一个状态机。这里的图就是状态图。与传统的状态图类似,它也具有节点(Node)和边(edges)。它被称为认知架构的一类。

LangGraph 将黑盒的 AgentExecutor 透明化,允许开发者定义内部的细节结构(用图的方式),从而实现更强大的功能。那么就可以用LangGraph 来重新实现原来的 AgentExecutor,即实现一个最基础的 ReAct范式的 Agent 应用。

     每个代理都可以有自己的提示符、LLM、工具和其他自定义代码,以便与其他代理进行最佳协作。

 下面是一个基于langGraph 的例子

from langchain_openai import ChatOpenAI
from langchain_core.messages import BaseMessage, HumanMessage
from langgraph.graph import END, MessageGraph
from langchain_core.tools import tool
from langgraph.prebuilt import ToolNode
from typing import Literal
import os
os.environ['OPENAI_API_KEY'] ="sk-xxxxxxxxxxxxxxxxx"
os.environ['OPENAI_BASE_URL'] ="https://api.chatanywhere.tech/v1"
model = ChatOpenAI(temperature=0)



@tool
def multiply(first_number: int, second_number: int):
    """Multiplies two numbers together."""
    return first_number * second_number
model = ChatOpenAI(temperature=0)
model_with_tools = model.bind_tools(tools=[multiply])

graph = MessageGraph()

graph.add_node("oracle", model_with_tools)

tool_node = ToolNode([multiply])
graph.add_node("multiply", tool_node)
graph.add_edge("multiply", END)
graph.set_entry_point("oracle")
def router(state: list[BaseMessage]) -> Literal["multiply", "__end__"]:
    tool_calls = state[-1].additional_kwargs.get("tool_calls", [])
    if len(tool_calls):
        return "multiply"
    else:
        return END


graph.add_conditional_edges("oracle", router)
runnable = graph.compile()
result=runnable.invoke(HumanMessage("What is 123 * 456??"))
print(result)

构建的图结构 

大模型应用的关键是大模型本身

      尽管大模型应用程序看上去与传统的程序架构相似的。但是它们是截然不同的,传统程序的循环和跳转是根据条件判断的,是确定的。而大语言模型的跳转,循环是依靠大模型的判断和推理,使用不同的大语言模型,应用执行的效果是不同的。LLM 应用的另一个重要的地方,就是各种提示和描述。比较确切的描述能够提升大语言模型应用的效果。说句不太贴切的话“大语言模型的应用程序的执行全靠大模型”猜“。调试LLM 应用的感觉就像训练一个小狗。很多程度靠”狗脑子十分灵光“。

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

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

相关文章

黑马python-JavaScript

1.JavaScript的定义&#xff1a; JavaScript是运行在浏览器端的脚步语言&#xff0c;是由浏览器解释执行的、简称js。它能够让网页和用户有交互功能&#xff0c;增加良好的用户体验效果 2.使用方式&#xff1a; 1.行内式&#xff08;主要用于事件&#xff09; <input type&q…

24-unittest简介

一、unittest简介 unittest是Python中常用的单元测试框架&#xff0c;与Java中的Junit单元测试框架类似。 二、示例程序 1&#xff09;导入unittest模块 import unittest 2&#xff09;使用help()函数查看源码中的示例程序 help(unittest) Simple usage:import unittestc…

Unity DOTS技术(二)ECS

文章目录 一.ECS简介二.基本操作实例三.实体查看组件四.位置实体修改五.旋转实体六.了解原有属性七.禁止自动创建八.动态实例化 一.ECS简介 ECS全称 (Entity Component System).即(E:实体 C:组件 S:系统). 实际上即是数据方法分离.数据放在组件里,具体实现放在系统里.组件挂载…

【excel】设置二级可变联动菜单

文章目录 【需求】在一级菜单选定后&#xff0c;二级菜单联动显示一级菜单下的可选项【步骤】step1 制作辅助列1.列转行2.在辅助列中匹配班级成员 step2 名称管理器step3 制作二级下拉菜单step4 消除二级菜单中的空白 【总结】 之前做完了 【excel】设置可变下拉菜单&#xff…

NPDP|智造业产品经理的战略智慧与行动之道

在智能制造风起云涌的时代&#xff0c;智造业产品经理的角色愈发重要。他们不仅需要具备深厚的行业知识&#xff0c;更要拥有前瞻的战略眼光和高效的行动能力。那么&#xff0c;智造业产品经理如何进行战略思考与行动呢&#xff1f;本文将为您揭示其中的奥秘。 洞察市场趋势&am…

01_初识微服务

文章目录 一、微服务概述1.1 什么是微服务1.2 对比微服务架构与单体架构1.3 微服务设计原则1.4 微服务开发框架1.5 简单理解分布式部署与集群部署 二、微服务的核心概念2.1 服务注册与发现2.2 微服调用&#xff08;通信&#xff09;2.3 服务网关2.4 服务容错2.5 链路追踪参考链…

用友NC pagesServlet SQL注入致RCE漏洞复现(XVE-2024-13067)

0x01 产品简介 用友NC是由用友公司开发的一套面向大型企业和集团型企业的管理软件产品系列。这一系列产品基于全球最新的互联网技术、云计算技术和移动应用技术,旨在帮助企业创新管理模式、引领商业变革。 0x02 漏洞概述 用友NC /portal/pt/servlet/pagesServlet/doPost接口…

焦化超低排平台改造指南

在当今社会&#xff0c;环保已成为各行各业的共识&#xff0c;焦化行业也不例外。随着环保政策的日益严格&#xff0c;焦化超低排平台改造成为了行业内的热点话题。本文旨在为广大焦化企业提供一份全面、实用的改造指南&#xff0c;帮助企业顺利实现超低排放&#xff0c;迈向绿…

python 字符串(str)、列表(list)、元组(tuple)、字典(dict)

学习目标: 1:能够知道如何定义一个字符串; [重点] 使用双引号引起来: 变量名 "xxxx" 2:能够知道切片的语法格式; [重点] [起始: 结束] 3:掌握如何定义一个列表; [重点] 使用[ ]引起来: 变量名 [xx,xx,...] 4:能够说出4个列表相关的方法; [了解] ap…

解决在Windows11上新安装的Docker Desktop一直显示“starting the Docker Engine“登录不上去的问题

解决在Windows11上新安装的Docker Desktop一直显示“starting the Docker Engine“登录不上去的问题 管理员权限运行cmd 还需要安装wsl(适用于Linux的Windows子系统)。注意windows powershell也要以管理员权限打开 这个是小羊用错窗口了&#xff0c;but好像也没错吧&#xff…

shell的编程方式

文章目录 变量俩种方式第一种方式第二种方式 取消变量数组创建数组获取数组元素的方式 read输出的方式限制输入的方式 流程控制方式for循环输出的方式第一种方式第二种方式while循环输出的方式select选择输出的方式 判断方式判断的四种方式第一种方式第二种方式第三种方式 算术…

C++之RTTI

1、RTTI&#xff08;runtime type information&#xff09;运行时类型信息 static_cast&#xff1a;用在编译器认可的转型 reinterpret_cast&#xff1a;用在编译器不认可的转型&#xff08;不做任何的对齐操作&#xff09; const_cast&#xff1a;去除常量属性 dynamic_ca…

国产开发板——香橙派Kunpeng Pro的上手初体验

开发板&#xff08;Development Board&#xff09;是一种特殊的电子产品&#xff0c;它的主要目的是为了帮助开发者快速地设计、测试和验证电子产品的硬件和软件设计。开发板通常提供了一个完整的硬件平台&#xff0c;包括微控制器、存储器、接口和其他外围设备&#xff0c;开发…

开源Mamba-2性能狂飙8倍!多个Mamba超强进化体拿下顶会

MambaOut的热度刚过去没多久&#xff0c;Mamba-2就带着它狂飙8倍的性能炸场了。 Mamba-2的核心层是对Mamba的选择性SSM的改进&#xff0c;同等性能下&#xff0c;模型更小&#xff0c;消耗更低&#xff0c;速度更快。与Mamba不同&#xff0c;新一代的Mamba-2再战顶会&#xff…

机器人舵机:关键要素解析与选择指南

在机器人技术日新月异的今天&#xff0c;舵机作为机器人的核心部件之一&#xff0c;扮演着至关重要的角色。它的性能直接关系到机器人的运动控制、稳定性以及精度等方面。那么&#xff0c;在选择和使用机器人舵机时&#xff0c;我们需要关注哪些关键要素呢&#xff1f;本文将为…

网络协议二

一、套接字Socket 基于 TCP UDP 协议的 Socket 编程&#xff0c;在讲 TCP 和 UDP 协议的时候&#xff0c;我们分客户端和服务端&#xff0c;在写程序的时候&#xff0c;我们也同样这样分。 在网络层&#xff0c;Socket 函数需要指定到底是 IPv4 还是 IPv6&#xff0c;分别对应设…

【数据集划分】oracle数据集划分(总结版)

【数据集划分】假如你有接近百万条oracle数据库数据&#xff08;成真版&#xff09; 写在最前面最终代码原理&#xff1a;生成随机索引并打乱顺序示例作用应用场景 遇到报错&#xff1a;ORA-01795&#xff0c;通过CTE&#xff08;Common Table Expressions&#xff09;和窗口函…

springcloud Feign调用拦截器(统一处理拷贝请求头实现透传信息、内部调用鉴权、打印feign调用)

springcloud Feign调用拦截器&#xff08;统一处理拷贝请求头实现透传信息、内部调用鉴权、打印feign调用日志&#xff09; 实现接口Feign.RequestInterceptor 实现接口 feign.RequestInterceptor 并注入到IOC容器即可生效 示范代码如下 拷贝请求头&#xff0c;将原请求信…

系统安全及其应用

系统安全&#xff1a; 1&#xff09;保护数据安全&#xff0c; 2&#xff09;互联网&#xff0c;网络业务服务等&#xff0c;必须要通过工信部的资质审核 3&#xff09;保护品牌形象 应用&#xff1a; 账号安全 1&#xff09;把不需要或者不想登录的用户设置为nologin us…

C++ 11 【可变参数模板】【lambda】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C修炼之路⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 目录 前言 一、新的类功能 1.1默认成员函数—…