大模型 AI Agent 是怎么进行 Action 的?

有没有大佬知道 AI Agent 是怎么执行一个 Action 的?比如大模型要去调 api 查资料,他是怎么去走到调 api 的代码逻辑里的,我理解大模型只能输出一些文本,这些文本是怎么触发一个应用层操作的。
是底层给他预设了一些 action,让他在里面选一个,然后进入到某个 ifelse 分支里面吗?
收藏者
0
被浏览
109

8 个回答

cuiweizuishuai LV

发表于 5 天前

hi~
上一篇,雄哥把Agent+GraphRAG,在本地用API封装了起来!
今天,在API的基础上,接一个前端UI,让他在企业内部、对外用户等等,提供服务!
实现的前端,是这样的!

大模型 AI Agent 是怎么进行 Action 的?-1.jpg


大模型 AI Agent 是怎么进行 Action 的?-2.jpg


不知道背后如何工作?
这是一个完整的GraphRAG-Agent项目!
整个系列,从数据处理开始,导入知识图谱,然后用它做GraphRAG!再到接入Agent,加餐系列是这样的(可直接点击跳转):
day1:数据处理!把数据,转为知识图谱标准数据!
day2:构建知识图谱!把数据存到Neo4J中!
day3:企业批量创建!工程化批量处理知识数据!
day4:RAG学习合集!深入浅出学langchain核心!
day5:GraphRAG融合!增强RAG,做kg+rag应用!
day6:Agent接入GraphRAG!让它成为Agent决策工具!
day7:将Agent打包成后端服务!微调让他服务!
day8:手把手构建Agent+GraphRAG的产品,提供用户!【本篇】
整个加餐系列的内容,前后延展!非常丰富!从0-1把GraphRAG拆开,然后重新组装!

大模型 AI Agent 是怎么进行 Action 的?-3.jpg

人的专注力只有10分钟,那!话不多说!
① 怎样封装打包的
② 本地环境准备
③ 跑起来,边跑边聊代码

同时!这个系列也是知识图谱课程的补充和延展,此系列持续加餐!
说到这!一定要去知识图谱课程打卡!价值非常高!
这是雄哥主导的课程,市面上找不到的宝藏,代号“灵丹”!
内容以视频+代码+技术支撑+高质量加餐!
报名在末尾联系工程师-小胖!更多介绍,看这!
“灵丹”-知识图谱+RAG项目官方wiki

大模型 AI Agent 是怎么进行 Action 的?-4.jpg

第一部分:如何封装打包的?
非常简单!
上一步,雄哥已经把整个服务都打包到http://localhost:8000/端口了!
今天,做一个http://localhost:8501/端口!
8501-->接入-->8000

大模型 AI Agent 是怎么进行 Action 的?-5.jpg


前端封装上,本次使用docker,直接接入Streamlit!
这是一个动态的前端,Agent调用tools,拿到neo4j最新数据后,在前端交互!
并且!显示支撑的数据库信息,是什么!
def main():
    with st.sidebar:
        st.write("### Settings")
        backend_url = st.text_input(
            "Backend URL",
            value=Config.BACKEND_URL,
            key="backend_url",
            label_visibility="collapsed"
        )
        if backend_url:
            Config.BACKEND_URL = backend_url

        st.session_state.show_steps = st.checkbox(
            "Show context",
            value=False,
            help="展示后台运行的过程,是什么支撑他回答"
        )

        st.divider()

        st.write("##### About")
        st.write("Agent后台的支撑过程,可以问neo4j的数据,他会自动调用tools实时查询")

    st.title("一意AI-Agent+GraphRAG DEMO")

    for message in st.session_state.messages:
        with st.chat_message(message["role"]):
            if message["role"] == "user":
                st.markdown(message["content"])
            else:
                try:
                    output_dict = message["content"]
                    st.markdown(output_dict.get(
                        "Answer", "No answer available"))
                    with st.expander("Context Used To Provide Answer", expanded=st.session_state.show_steps):
                        st.json(output_dict.get("Context", []))
                except:  # noqa: E722
                    st.markdown(message["content"])

    if prompt := st.chat_input("你想问点啥?"):
        with st.chat_message("user"):
            st.markdown(prompt)
        st.session_state.messages.append({"role": "user", "content": prompt})

        with st.chat_message("assistant"):
            response = send_message(prompt)

            if "response" in response and "output" in response["response"]:
                output_str = response["response"]["output"]
                st.markdown(json.loads(output_str).get(
                    "Answer", "No answer available"))
                with st.expander("Context Used To Provide Answer", expanded=st.session_state.show_steps):
                    st.json(json.loads(output_str).get("Context", []))

                st.session_state.messages.append({
                    "role": "assistant",
                    "content": output_str
                })
            else:
                st.error("Unexpected response format")如何在本地实现呢?
跟着雄哥动起手来搭建!
一边搭建一边学!

第二部分:环境准备,边跑边聊代码细节!
所有的环境,还是用上一篇的!
雄哥今天,准备了这个应用的所有代码!
你可以在星球,下载!

大模型 AI Agent 是怎么进行 Action 的?-6.jpg

上面,是现成的,喂饭到嘴!
但你也可以跟着下方操作,自己动手去创建,更深刻!
进入工作目录!
cd services/v1
激活上篇创建的虚拟环境!
source venv/bin/activate
创建Streamlit工作文件夹!
mkdir streamlit_app
进入工作文件夹!
cd streamlit_app
创建本次前端所需的所有文件!
touch __init__.py requirements.txt config.py utils.py app.py
编辑依赖文件!
把下方的文本写入到requirements.txt!
streamlit>=1.31.0
requests>=2.31.0
python-dotenv>=1.0.0
安装依赖!
pip install -r requirements.txt
编辑Streamlit的配置文件!
打开config.py,把下方代码写入!
import os

class Config:
    BACKEND_URL = os.getenv("BACKEND_URL", "http://fastapi_app:8000")
    APP_TITLE = "程序首页"
    APP_DESCRIPTION = "本程序帮助您查询员工信息和其他商业数据."
添加与后端的链接状态!
打开utils.py,把下方代码写入!
import requests
import streamlit as st
from config import Config

def send_message(message: str) -> str:
    """
    Send message to the FastAPI backend and handle response
    """
    try:
        response = requests.post(
            f"{Config.BACKEND_URL}/chat",
            params={"query": message},
            timeout=120
        )
        response.raise_for_status()
        data = response.json()
      
        return data
      
    except requests.exceptions.ConnectionError:
        error_msg = f"Unable to connect to backend at {Config.BACKEND_URL}"
        st.error(error_msg)
        return {"error": error_msg}
    except requests.exceptions.RequestException as e:
        error_msg = f"Error: {str(e)}"
        st.error(error_msg)
        return {"error": error_msg}
构建主程序!
打开app.py,这是主程序的代码!
import streamlit as st
from config import Config
from utils import send_message
import json

st.markdown("""
    <style>
        [data-testid="stSidebar"][aria-expanded="true"]{
            min-width: 250px;
            max-width: 250px;
        }
        [data-testid="stSidebar"][aria-expanded="false"]{
            margin-left: -250px;
        }
        section[data-testid="stSidebarContent"] {
            padding-top: 1rem;
            padding-right: 1rem;
        }
        .stButton button {
            width: 100%;
        }
        div[data-testid="stExpander"] {
            background-color: #262730;
        }
    </style>
"""
, unsafe_allow_html=
True
)

if "messages" not in st.session_state:
    st.session_state.messages = []
if "show_steps" not in st.session_state:
    st.session_state.show_steps = False

def main():
    with st.sidebar:
        st.write("### Settings")
        backend_url = st.text_input(
            "Backend URL",
            value=Config.BACKEND_URL,
            key="backend_url",
            label_visibility="collapsed"
        )
        if backend_url:
            Config.BACKEND_URL = backend_url

        st.session_state.show_steps = st.checkbox(
            "Show context",
            value=False,
            help="展示后台运行的过程,是什么支撑他回答"
        )

        st.divider()

        st.write("##### About")
        st.write("Agent后台的支撑过程,可以问neo4j的数据,他会自动调用tools实时查询")

    st.title("一意AI-Agent+GraphRAG DEMO")

    for message in st.session_state.messages:
        with st.chat_message(message["role"]):
            if message["role"] == "user":
                st.markdown(message["content"])
            else:
                try:
                    output_dict = message["content"]
                    st.markdown(output_dict.get(
                        "Answer", "No answer available"))
                    with st.expander("Context Used To Provide Answer", expanded=st.session_state.show_steps):
                        st.json(output_dict.get("Context", []))
                except:  # noqa: E722
                    st.markdown(message["content"])

    if prompt := st.chat_input("你想问点啥?"):
        with st.chat_message("user"):
            st.markdown(prompt)
        st.session_state.messages.append({"role": "user", "content": prompt})

        with st.chat_message("assistant"):
            response = send_message(prompt)

            if "response" in response and "output" in response["response"]:
                output_str = response["response"]["output"]
                st.markdown(json.loads(output_str).get(
                    "Answer", "No answer available"))
                with st.expander("Context Used To Provide Answer", expanded=st.session_state.show_steps):
                    st.json(json.loads(output_str).get("Context", []))

                st.session_state.messages.append({
                    "role": "assistant",
                    "content": output_str
                })
            else:
                st.error("Unexpected response format")

if __name__ == "__main__":
    main()它的主要功能:

  • 导入库:代码导入了streamlit库用于创建Web应用,config模块用于配置,以及utils模块中的send_message函数用于发送消息。
  • 设置样式:使用HTML和CSS为Streamlit应用设置了一些自定义样式。
  • 状态管理:在Streamlit的会话状态中存储了消息列表和是否显示步骤的选项。
  • 主函数:


  • 在侧边栏中,用户可以输入后端URL和选择是否显示后台运行过程。
  • 页面标题设置为“一意AI-Agent+GraphRAG DEMO”。
  • 显示用户和助手之间的聊天消息。
  • 用户可以在聊天输入框中输入问题,问题会被发送给后端并显示在界面上。
  • 助手的回答也会显示在界面上,如果用户选择了显示步骤,还会展示用于回答问题的上下文。
<li data-pid="nakn1yyB">运行主函数:如果该脚本作为主程序运行,则调用main函数。增加一个dockerfile!
用于构建docker应用!目录在这里ci_cd\docker,文件名streamlit.dockerfile
写入代码!
FROM python:3.10-slim

WORKDIR /app

COPY services/v1/streamlit_app/requirements.txt .
RUN pip install -r requirements.txt

COPY services/v1/streamlit_app .

EXPOSE 8501

CMD ["streamlit", "run", "app.py"]
回到工作的主目录!
有个docker的配置文件,docker-compose.yaml
更新这个文件,新增前端的配置!
services:
  fastapi:
    build:
      context: .
      dockerfile: ./ci_cd/docker/fastapi.dockerfile
    container_name: fastapi_app
    ports:
      - "8000:8000"
    volumes:
      - type: bind
        source: ./services/v1
        target: /src/app
        read_only: true
    env_file: ./.env
    networks:
      - app_network

  streamlit:
    build:
      context: .
      dockerfile: ./ci_cd/docker/streamlit.dockerfile
    container_name: streamlit_app
    ports:
      - "8501:8501"
    volumes:
      - type: bind
        source: ./services/v1/streamlit_app
        target: /app
        read_only: true
    environment:
      - BACKEND_URL=http://fastapi_app:8000
    networks:
      - app_network
    depends_on:
      - fastapi

networks:
  app_network:
    driver: bridgeok!一切就绪!
直接下方指令运行!
docker compose up大概等待5-6分钟!
看你本地的网速!
浏览器,打开下方网址,就可以打开我们的应用了!
http://localhost:8501


好啦!
今天内容,我们就到这!
前端不是重点,关键的是他内里的构造!
如何根据自己的场景,去做搭建!
这是最主要的!

梅雨潭 LV

发表于 5 天前

智能体(Agent)的表现能力高度依赖于底座大模型,如果你想做AI智能体方向的产品,必须对智能体运转的原理有大致了解,不然很有可能项目做到一半发现产品推进不下去。Agent有许多种实现模式,其中ReAct模式是最早出现,也是目前使用最广泛的模式。下面我以React模式为例子介绍Agent由哪几部分组成Agent如何进行Action、以及为什么Agent能够进行Action
Agent组成部分

React模式的典型流程如下图所示,可以用一个有趣的循环来描述:思考(Thought)→ 行动(Action)→ 观察(Observation),简称TAO循环。

  • 思考(Thought):和人一样,面对一个问题,LLM需要进行深入的思考。思考是一个推理步骤,它确定了LLM将如何解决问题并确定要采取的行动。基于思考,LLM 可以采取一些行动。
  • 行动(Action):确定了思考的方向后,接下来就是行动的时刻。根据我们的思考,采取相应的措施或执行特定的任务,以期望推动问题向解决的方向发展。例如调用 Wikipedia API 来搜索数据。根据行动结果提供的新信息,LLM 观察结果
  • 观察(Observation):行动之后,我们必须仔细观察结果。这一步是检验我们的行动是否有效,是否接近了问题的答案。如果LLM明白它得到了答案,那么就结束这个问题。否则根据观察,LLM再次产生新的想法,过程继续重复,直到LLM得到答案。 TAO循环示意图如下所示:
TAO循环示意图如下所示:

大模型 AI Agent 是怎么进行 Action 的?-1.jpg

去年大厂卷大模型本身,今年将重心放在了智能体上,不了解智能体都不好意思说自己懂AI。正好知乎知学堂推出了一门AI解决方案公开课,针对智能体这个热门领域,介绍什么是智能体,我们能用智能体构建什么应用,智能体的应用边界怎么确定以及28个已经落地的商业案列。强烈建议看完本篇文章后,去系统学习公开课,相信你会更加了解智能体这个领域,公开课链接我放下面了。
我自己也仔细看了看公开课,从智能体原理到应用再到商业模式,干货还是不少,赶紧学起来吧!
回到主题上,关于TAO循环,我放上一个实操例子:
1、准备两个工具,其中一个可以通过API查询给定城市的天气信息(包括温度、体感温度、湿度和风速),输入参数为城市位置(eg.北京);另外一个可以查询当前的时间,输入参数无。两个工具的输出均是结构化json数据。
2、用户输入:今天我将从北京飞往三亚,请根据天气情况给我定制穿衣计划。
TAO循环真实案例如下:
{'role': 'user', 'content': '\nQuestion:今天我将从北京飞往三亚,请根据天气情况给我定制穿衣计划'},
{'role': 'assistant', 'content': 'Thought: 需要获取北京和三亚的实时天气信息。\nAction: get_current_weather\nAction Input: {"city_name": "北京"}'},
{'role': 'user', 'content': '\nObservation:{"城市位置": "北京", "温度": "23.94 C°", "体感温度": "23.28 C°", "湿度": "34%", "风速": "2.82 m/s"}'},
{'role': 'assistant', 'content': 'Thought: 需要获取三亚的实时天气信息。\nAction: get_current_weather\nAction Input: {"city_name": "三亚"}'},
{'role': 'user', 'content': '\nObservation:{"城市位置": "三亚", "温度": "30.09 C°", "体感温度": "36.28 C°", "湿度": "74%", "风速": "4 m/s"}'}
{'role': 'assistant', 'content': 'Thought: Thought: 根据获取到的天气信息,可以为从北京前往三亚的旅程制定穿衣计划。\n北京的天气:温度约为23.94°C,体感温度为23.28°C,湿度为34%,风速为2.82 m/s。建议穿着轻薄衣物,如长袖T恤、短裤或裙子,搭配一件轻便外套以应对温差变化。鞋子可以选择舒适的运动鞋或休闲鞋。\n三亚的天气:温度约为30.09°C,体感温度为36.28°C,湿度为74%,风速为4 m/s。建议穿着透气性好的轻薄衣物,如短袖上衣、短裤或裙子,选择凉鞋或拖鞋,以适应热带气候的高温与高湿环境。\n Final Answer: 从北京飞往三亚的旅行中,建议您在北京时穿着轻薄衣物并携带一件轻便外套以应对温差变化;到达三亚后,应穿着透气性好的轻薄衣物,并选择凉鞋或拖鞋,以适应热带气候的高温与高湿环境。'},可以发现TAO循环的具体实现形式仍然是问答的形式。大模型通过思考了解需要分别调用工具查询北京和三亚的天气,并且最后在Final Answer来提出衣服着装方面的建议。
这个时候大家就有疑问了,在上述例子第三行中Observation为工具API调用的结果,那么大模型回答问题的时候为什么能够形成TAO循环、大模型是怎样从Thought到选择正确的Action并且识别出工具的Action Input呢?
这就需要提示工程以及输出数据结构化
Agent如何进行Action

提示工程

首先,需要构造系统提示词(system_prompt),系统提示词也是模型输入的一部分。这里套用React中的提示词模板,并结合上面自己设计两种工具,系统提示词设计如下所示:
Answer the following questions as best you can. You have access to the following tools:

get_current_weather: Call this tool to interact with the 天气查询 API. What is the 天气查询 API useful for? 基于给定的城市获取天气信息,天气信息包括温度、体感温度、湿度和风速。 Parameters: [{'name': 'city_name', 'description': '城市名称', 'required': True, 'schema': {'type': 'string'}}] Format the arguments as a JSON object.

get_current_time: Call this tool to interact with the 获取当前时间 API. What is the 获取当前时间 API useful for? 获取当前的系统时间。 Parameters: [] Format the arguments as a JSON object.

Use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [get_current_weather,get_current_time]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can be repeated zero or more times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

Begin!可以看到在系统提示词中,已经将各个工具以及对应工具的输入输出定义好。此外,也告诉大模型需要按照TAO的模式输出结果。当然,也会有朋友说,为什么我这样定义提示词就能够实现TAO呢?关于为什么的疑问我会在下一节说到。
回到主题上来,通过定义提示工程模板,大模型初步具备了TAO的能力。光有TAO的能力还是不够的,工具调用输入参数的格式和数据类型有严格要求,稍微错一点都会调用失败。所以设计系统提示词后,还需要解析大模型的输出内容,提取出工具API的输入参数。
结构化解析

在上面的示例中,大模型需要调用查询天气工具接口,分别查询北京和三亚的天气。由于大模型本身训练数据中存在天气查询相关的语料,因此输出会存在大模型幻觉问题。因此需要解析大模型输出,提取Action和Action Input。
当然上面说到的提示词工程和结构化解析都是理想情况,如果智能体不太复杂问题一般不大。但是如果你的业务场景比较复杂,就会存在大模型选错工具以及解析大模型输出的时候报错。所以如果你想做智能体方面的产品,一定要弄明白目标场景是否需要私有化部署,再尝试API调用大模型或者说用开源模型能否达到应用条件。毕竟再漂亮的提示词,大模型不行,整体应用效果也很差。
当然,应用不佳的情况也可以尝试微调。
为什么Agent能够进行Action?

单纯预训练和指令微调就算设计提示工程也不能实现TAO循环。
Agent能力也依赖于大模型的训练,与有监督微调(SFT)一样,需要构建基于agent数据的多轮对话问答对。
下面放一个agent能力微调数据示例,格式为:sharegpt.
{
    "conversations": [
      {
        "from": "human",
        "value": "你好,我出生于1990年5月15日。你能告诉我我今天几岁了吗?"
      },
      {
        "from": "function_call",
        "value": "{\"name\": \"calculate_age\", \"arguments\": {\"birthdate\": \"1990-05-15\"}}"
      },
      {
        "from": "observation",
        "value": "{\"age\": 31}"
      },
      {
        "from": "gpt",
        "value": "根据我的计算,你今天31岁了。"
      }
    ],
    "tools": "[{\"name\": \"calculate_age\", \"description\": \"根据出生日期计算年龄\", \"parameters\": {\"type\": \"object\", \"properties\": {\"birthdate\": {\"type\": \"string\", \"description\": \"出生日期以YYYY-MM-DD格式表示\"}}, \"required\": [\"birthdate\"]}}]"
  }在TOB业务场景中,可针对系统内部接口(弄清楚接口的输入以及数据类型),准备数据开展Agent能力微调。在这里,我推荐使用llama_factory,里面已经定义好数据格式,并且支持几乎市面上所有主流LLM。按照标准去准备数据,就可以增强Agent能力啦。
总结

本文以React模式为基础,举例介绍了Agent由哪几部分组成、Agent如何进行Action、以及为什么Agent能够进行Action。本文示例完整实现代码见:
<a href="http://link.zhihu.com/?target=https%3A//github.com/GuoCoder/ai-app" class=" external" target="_blank" rel="nofollow noreferrer">https://github.com/GuoCoder/ai-app

喂喂 LV

发表于 5 天前

一句话,stop参数
stop参数用于控制LLM输出内容的截断,即当LLM的输出内容检测到某些关键字时直接停止输出
举个例子,假设你的prompt是
你可以使用以下工具:
search_api(content: str)

按照以下格式回答问题:
思考:xx
工具:xx
工具参数:xx
观察:xx
回答:xx

现在问题是:
黑神话悟空的销量是多少?如果直接让LLM回答,会得到
思考:要搜索才知道结果
工具:search_api
工具参数:黑神话悟空的销量
观察:黑神话悟空的销量是500万份
回答:500w因为LLM强大的幻觉能力,它会假装自己能够搜索,并返回搜索结果
但是,假设你设置了stop参数,比如
stop="观察:"那么LLM会输出(根据stop截断了输出的内容)
思考:要搜索才知道结果
工具:search_api
工具参数:黑神话悟空的销量
观察:此时,用正则提取工具和工具参数,然后输入到搜索引擎,拿到真正的检索结果,并组装成新的prompt,再次调用LLM,prompt如下
你可以使用以下工具:
search_api(content: str)

按照以下格式回答问题:
思考:xx
工具:xx
工具参数:xx
观察:xx
回答:xx

现在问题是:
黑神话悟空的销量是多少?

思考:要搜索才知道结果
工具:search_api
工具参数:黑神话悟空的销量
观察:黑神话悟空的销量已经突破2000万此时LLM会输出:
回答:2000万由此,LLM完成了一次工具调用并回答的过程

TsMnO LV

发表于 5 天前

先说结论,“大模型只能输出文本”是一种误解。虽然大语言模型(LLM)主要设计用于理解和生成文本,但它们并不直接“触发”应用层操作。实际上,LLM的输出通常被用作输入,传递给Agent,由Agent来执行实际的操作。
在这个过程中,LLM可能提供指令、建议或上下文信息,而实际的执行逻辑则由Agent来完成。Agent调用的工具可能包括第三方API、代码解析器、计算引擎或执行其他类型任务的功能。

大模型 AI Agent 是怎么进行 Action 的?-1.jpg


AI Agent架构

在上面的架构图中,Prompt Template的作用是生成可重复的、结构化的prompt,以引导和控制LLM的输出。具体来说,它包含一个文本字符串或格式化的输入模板,可以从最终用户处获取一组参数并生成一个prompt。
Memory系统包括短期和长期两个部分。短期记忆用于存储当前任务执行过程中产生的信息,如某个工具或子任务的结果,这些信息在任务完成后会被保留一段时间。长期记忆则用于保存更持久的信息,以便在未来任务中使用。记忆系统的建立使得AI Agent能够在回答问题时提供上下文相关的响应。
了解了AI Agent的架构,我们再来看看它具体的行动过程。这一过程大致可以分为三个主要步骤:意图识别(Perception)、决策制定(Planning)和行动(Action),通常称为PPA模型
意图识别(Perception)

当用户与AI Agent交互时,Agent首先需要理解用户的意图,这通常通过自然语言处理(NLP)技术解析用户输入的文本并提取关键信息来实现的。为了提高意图识别的准确率,现在一般有两种方法:其一是在LLM上下功夫,其二是优化提示词。
在LLM上下功夫,可以通过词汇替换、随机噪声注入等方法扩充数据样本规模,提高模型的泛化能力,从而提高意图识别的准确率;也可以使用相关任务的标注数据对模型进行有监督的预训练,有效地提升后续微调的效果,进而提高意图识别的准确率。这种方法显然对技术和资源的要求更高,普通开发者一般不会去做。相对的,采用优化提示词的方法就比较靠谱,比如多层次意图识别。我们来看一个例子。

大模型 AI Agent 是怎么进行 Action 的?-2.jpg

当用户提出查询时,系统首先判断其大类意图,如“技术支持”、“客户服务”或“产品咨询”等。这一步骤是为了将用户的查询定向到正确的服务领域。
在确定了用户查询的初步意图后,系统进一步分析查询内容,以识别更具体的子类别,如在“技术支持”大类下,可能细分为“软件更新”、“故障排除”或“设备兼容性”等。每个子类别都配有专属的处理提示词和针对性解决方案,确保响应的精确性和有效性。
在某些情况下,用户的需求可能更加具体,需要系统进行更细致的分层处理。例如,在“故障排除”子类别下,系统可能需要进一步确定是软件相关还是硬件相关的问题,然后根据具体情况提供相应的解决步骤或建议。
多层次意图识别其实是提示词工程中的一种方法,提示词工程在AI Agent中有非常多的应用,研究它可以让我们更高效的使用大模型的能力。如果你也对提示词工程感兴趣,那么除了自己费力找资料学习,也可以直接向有经验的老师请教,正好我刚听完知乎知学堂的免费公开课,非常不错,建议你也来听听。入口我放在下面了,直接听就可以:
这个公开课里你可以学到提示词工程、大模型微调、LangChain开发框架的用法等AI解决业务问题的核心方法、培养你独立开发AI产品的能力,还能拓宽技术视野,构筑你的核心竞争力!
决策制定(Planning)

一旦识别了用户的意图,AI Agent需要决定如何响应。它会评估不同动作对于实现目标的效果,并制定相应的策略。这就涉及到主流的认知框架的应用,例如Chain of thoughts(CoT),Self-Ask,Self-Refection等等。
CoT即思维链,指的是Agent在解决问题时形成的一系列连贯的逻辑思考步骤,通过展现解决问题的思路,Agent的决策过程变得更加透明和可解释。

大模型 AI Agent 是怎么进行 Action 的?-3.jpg


CoT示例

Self-Ask框架是让模型自己提问题,自己找答案,就像是给自己来了个头脑风暴。这样一来,模型就能把问题翻来覆去地琢磨,挖出更多细节,最后给出的答案自然也就更靠谱、更精准了。

大模型 AI Agent 是怎么进行 Action 的?-4.jpg


Self-Ask示例

Self-Refection是一种在人工智能和机器学习领域中应用的框架,专门用来解决那些棘手的决策问题。一般分两步走:首先是批判(Critique),让系统自己回头看看自己干的活儿,挑挑毛病,看看哪里做得不够好,或者跟目标差多远。如果发现了问题,就要修正(Revise),这个时候系统就得动动脑筋,调整调整,可能是改改现有算法里的参数,或者干脆换套新的打法,目的就是要把活儿干得更漂亮。这个架构其实就是让系统自己跟自己较劲,不断自我挑战,自我提升。这样一来,遇到复杂的问题,系统就能拿出更聪明、更有效的应对策略。
行动(Action)

根据决策制定阶段的结果,AI Agent会执行相应的Action,这个过程中可能会调用内置或第三方的工具。市面上的很多开发框架已经集成了这一步骤,比如OpenAI推出的Function Calling就可以根据用户的需求自动调用OpenAI Assistant中支持的工具;LangChain中的Agent也集成了大量的可用工具。
以上就是PPA模型的工作流程,我觉得层次挺分明的,但好像还是差了点什么。既然CoT可以把解题步骤都列出来,Self-Ask和Self-Refection又可以让大模型自我迭代,再加上工具的灵活调用,那这一切能不能自动化呢?答案是肯定的,那就是Agent认知架构的巅峰之作——ReAct。
这种架构将推理与行动紧密结合,“知行合一”。其核心理念是,通过不断的思考、观察与执行的循环往复,以及迭代优化,直至找到问题的最终解决方案。这使得Agent不仅能够进行复杂的内在逻辑推理,还能即时响应并调整其行为,以适应环境和需求的持续变化,这极大地扩展了大模型的互动性和应用场景。
目前,ReAct架构已与LangChain无缝对接,开发者可以轻松构建ReAct Agent,以执行特定的任务。
作为开源的AI应用架构框架,LangChain的生态系统正在逐步完善当中,尤其是可能成为下一代人工智能AI Agent的基础设施,我们作为程序员不应该视而不见,有机会的话一定是要动手去尝试一下的。现在知乎知学堂推出了相关公开课,我推荐你去听听。课程免费,由业界大佬孙志岗亲自操刀,他之前做的那款AI模型评测神器ChatALL.ai,不止一次冲上Github全球热门榜首。我把课程链接搁这儿了,大家点进去就能听。
<a data-draft-node="block" data-draft-type="edu-card" data-edu-card-id="1807765753547599874">我试听了一下,内容挺实在,操作性也强,跟着步骤走就可以轻松入门AI应用开发。关键是还送免费的基础设施平台,这福利简直了!
未来的AI Agent

首先是Plan-and-Execute架构,简单来说就是“谋定而后动”。其核心在于让Agent在行动之前,能全面地把任务的方方面面都考虑一遍,然后根据这个来制定行动计划。在那些需要一步步来,或者得协调一大堆事情的复杂项目里(比如自动化流程控制),这招特别管用。现在,LangChain已经把Plan-and-Execute架构加到了它的实验模块里,给开发者们提供了一个试验场,只要使用LangChain就可以创建Plan-and-Execute Agent。
再说说多Agent系统(MAS),这绝对是现在研究圈里的热门话题。研究的核心就是怎么让一群Agent一起干活,完成那些复杂的任务和目标。在多Agent协作的圈子里,AutoGen和MetaGPT算是两个领头羊。AutoGen架构有个特点,就是Agent定制化,让开发者能根据需要给Agent来个私人订制,实现各种功能。而MetaGPT架构则是个创新的混合体,它把标准操作程序(SOPs)和基于大模型的MAS结合起来。用SOPs来写指令,MetaGPT就能保证输出的协调性、结构化和模块化。这种设计让Agent能在流水线式的工作中扮演各种角色,通过有序的合作和强化专业知识,来完成那些复杂的任务,比如软件设计和开发。
结论

大模型在AI Agent中并非被动的文本生成器,而是一个强大的推理引擎。通过PPA模型(意图识别、决策制定、行动)的运用,AI Agent能够准确理解用户意图,并作出相应的决策和行动。CoT、Self-Ask和Self-Refection这样的认知框架,进一步增强了决策的透明度和有效性。而ReAct架构的提出,则标志着AI Agent在自动化和自我迭代方面迈出了重要一步,实现了推理与行动的紧密结合。随着LangChain等开源框架的发展,AI Agent的生态系统正逐步完善,为开发者提供了构建高效、灵活且功能丰富的AI应用的可能性。未来的AI Agent将更加智能,能够处理更复杂的任务,尤其是在多Agent系统中实现更高效的协作。

limao100 LV

发表于 5 天前

给你一个实际的例子吧,其实真的超级简单。比如你现在的场景是给用户日常工具,我现在有三个工具,第一是检索论文,第二是数据库查日程,两个工具都是http接口,需要用的时候就访问http就行,然后还有就是自身回答。有一个query进来了,你首先做一个意图判断,到底需要执行哪个?意图判断就是问大模型,示例prompt如下:
<hr/>你有如下任务,根据用户query判定用户意图,选择合适的工具。
你有如下两个工具:
1、检索
工具功能:该工具可以根据用户的需求检索论文,如果用户有检索论文的需求需要调用该工具。
工具参数:{{"search_query":"搜索关键字"}}
2、查询数据库
工具功能:该工具可以查询用户的日程数据,如果用户有查看日程情况,需要调用工具。
工具参数:{{"date":"天级别日期时间,格式为'yyymmdd'","user_name":"用户名称"}}
现在给定用户query和历史query信息,请判定是否需要以上两个工具,如果需要,请抽取相应参数。输出为json,格式为,{{"needed_search":"是否要检索,回答为true or false","needed_search_database":"是否要查询数据库,回答为true or false"}}
#示例1
用户历史query:['retinaface这个论文讲了什么']
用户当前query:“请帮我查询该论文”
回答:
{{"needed_search":"true","needed_search_database":"false"}}
#请帮我判断一下用户意图
用户历史query:{history}
用户当前query:{query}
<hr/>你进来第一步先把用户query问大模型,然后得到以上json,用代码解析,写if else,如果需要need search,你就调用search工具,如果needed_search_database为true,你就调用查询数据库。假设search的http服务为, 10.10.10.1:888?query='xxxx'.当你识别到需要调用检索的时候,你先调用一个大模型,抽取查询query,然后访问该http服务。
抽取查询query prompt可以如下:
<hr/>你的任务如下,用户当前有搜索需求,请按照一个用户的query和历史query抽取需要查询的query。
给定用户query和历史query如下:
用户历史query:{history}
用户当前query:{query}
输出要求:json格式,{{"query":"用户检索语句"}}
json输出:
<hr/>根据以上query你就可以拿到用户需要检索的语句,然后再用python的request函数,访问搜索的http接口。你就成功调用了一个工具。其他工具类似。当然我这个是为了让你理解,所以写得比较细,现在很多框架,比如metagpt,把整个框架抽象了,你只需定义任务和任务的prompt就行了。
最后,你发现没有,这里面核心就是json,结构化输出,才能让你的模型有能if else的可能。所以如何让模型按照你的要求结构化准确的输出你的意图,就是调用大模型的核心。

a669091781 LV

发表于 5 天前

关于大模型AI Agent进行Action的执行过程,其实是通过一系列复杂的计算和决策流程实现的。简单来说,AI Agent接收用户输入的指令或请求,然后依据其训练数据和算法模型进行分析和处理。对于调用API查资料这样的操作,AI Agent会根据用户的请求内容,在内部进行一系列操作,如解析指令、确定操作类型、选择调用哪个API等。<br><br>这个过程并不是简单的预设if-else分支选择,而是基于深度学习和自然语言处理技术,对用户的意图进行精准识别和分析,进而决定如何执行操作。当AI Agent生成输出文本后,会根据文本内容触发应用层操作,进行相应的Action。这些操作可能涉及到底层预设的一些动作,但更多的是基于模型的智能决策。<br><br>总体来说,大模型AI Agent的执行过程是一个高度智能化、自动化的决策过程,能够根据不同的情境和需求,进行精准的操作和执行。

danssion LV

发表于 4 天前

AI Agent 进行 Action 的过程是一个复杂的流程,大致如下:<br><br>首先,AI Agent 通过解析用户的请求或指令,确定需要进行哪种操作。这些操作可能是查询信息、推荐内容或其他任务。之后,根据预设的逻辑和规则,AI Agent 会选择相应的策略或方法,比如调用 API 查询资料。在这个过程中,大模型会根据学习到的知识和信息,选择适当的路径和方法去实现这一操作。例如,在调用 API 的过程中,大模型会触发应用层操作,这可能是通过底层预设的一些代码逻辑实现的。这些代码逻辑可能包括不同的分支和路径,根据具体情况进行选择和执行。<br><br>总的来说,AI Agent 的行动是通过底层预设的逻辑、规则和方法,结合自身的知识和学习,实现的一个复杂过程。

tkv2373 LV

发表于 4 天前

AI Agent 进行 Action 的过程涉及到多个层面的技术。首先,它接收到用户输入的数据或指令后,通过自然语言处理来理解用户意图。然后,根据自身的模型训练和经验知识,进行推理分析,决定执行哪种操作。如果涉及到调用 API 查资料,这是基于预定义的接口和预设逻辑实现的。简单来说,开发者在底层设定了多种可能的操作或任务流程,大模型根据上下文和用户需求选择最合适的路径执行。对于复杂的操作,如触发应用层操作,通常是通过预设的触发机制实现的,比如关键词触发或情境识别。大模型输出的文本不仅只是输出文本内容,也可能包含了能够直接驱动应用层操作的动作指令。这样,通过深度学习和开发者的预设逻辑相结合,AI Agent 能够高效地进行各种任务执行和操作。

您需要登录后才可以回帖 登录 | 立即注册