开源模型+Orchestrating Agents多智能体框架,易用、强大且可控

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
NLP自然语言处理_高级版,每接口累计50万次
简介: 本文采用开源Qwen2.5-14B-instruct-GGUF来体验多智能体编排和交接,希望在体验多智能体编排和交接框架的同时,一起评估中小参数规模的模型(14B)能否较好的完成多智能体任务。

近期,OpenAI提出了Orchestrating Agents,并同时开源了Swarm,一个轻量级的多智能体编排框架,目前仅是示范框架,并没有计划用于生产。

使用语言模型时,我们通常需要好的prompt并结合较强工具调用能力,Orchestrating Agents给大家介绍了多Agent的流程编排和交接的概念,并逐步介绍实施过程中如何通过简单、强大且可控的方式来协调多个Agent共同完成任务。

本文采用开源Qwen2.5-14B-instruct-GGUF来体验多智能体编排和交接,希望在体验多智能体编排和交接框架的同时,一起评估中小参数规模的模型(14B)能否较好的完成多智能体任务。

模型链接:

https://modelscope.cn/models/Qwen/Qwen2.5-14B-Instruct-GGUF

Swarm开源框架:

https://github.com/openai/swarm

cookbook链接:

https://cookbook.openai.com/examples/orchestrating_agents

01

模型部署

我们使用魔搭社区基于PAI-DSW的免费Notebook完成本次实践。

首先,我们先将Qwen2.5-14B-instruct-GGUF模型部署成一个兼容OpenAI接口的API,同时也支持工具调用。

Ollama安装,用于模型推理:

modelscope download --model=modelscope/ollama-linux --local_dir ./ollama-linux
cd ollama-linux
sudo chmod 777 ./ollama-modelscope-install.sh
./ollama-modelscope-install.sh
ollama serve

llama.cpp安装,用于merge模型:

git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
make -j
# GPU机型需要cuda加速推理build
# make -j LLAMA_CUDA=1

模型下载:

# 下载分割的模型文件
modelscope download --model=qwen/Qwen2.5-14B-Instruct-GGUF --include "qwen2.5-14b-instruct-q5_k_m*.gguf" --local_dir .
# 对于分割的文件,需要首先使用llama-gguf-split命令进行合并
./llama-gguf-split --merge qwen2.5-14b-instruct-q5_k_m-00001-of-00003.gguf qwen2.5-14b-instruct-q5_k_m.gguf

创建Modelfile文件,Modelfile现在已经支持工具调用:

Modelfile现已支持function call
FROM /mnt/workspace/qwen2.5-14b-instruct-q5_k_m.gguf
# set the temperature to 0.7 [higher is more creative, lower is more coherent]
PARAMETER temperature 0.7
PARAMETER top_p 0.8
PARAMETER repeat_penalty 1.05
TEMPLATE """{{ if .Messages }}
{{- if or .System .Tools }}<|im_start|>system
{{ .System }}
{{- if .Tools }}
# Tools
You are provided with function signatures within <tools></tools> XML tags. You may call one or more functions to assist with the user query. Don't make assumptions about what values to plug into functions. Here are the available tools:
<tools>{{- range .Tools }}{{ .Function }}{{- end }}</tools>
For each function call, return a JSON object with function name and arguments within <tool_call></tool_call> XML tags as follows:
<tool_call>
{"name": <function-name>, "arguments": <args-json-object>}
</tool_call>{{- end }}<|im_end|>{{- end }}
{{- range .Messages }}
{{- if eq .Role "user" }}
<|im_start|>{{ .Role }}
{{ .Content }}<|im_end|>
{{- else if eq .Role "assistant" }}
<|im_start|>{{ .Role }}
{{- if .Content }}
{{ .Content }}
{{- end }}
{{- if .ToolCalls }}
<tool_call>
{{ range .ToolCalls }}{"name": "{{ .Function.Name }}", "arguments": {{ .Function.Arguments }}}
{{ end }}</tool_call>
{{- end }}<|im_end|>
{{- else if eq .Role "tool" }}
<|im_start|>user
<tool_response>
{{ .Content }}
</tool_response><|im_end|>
{{- end }}
{{- end }}
<|im_start|>assistant
{{ else }}{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
{{ end }}
"""

ollama部署

modelscope download --model=qwen/Qwen2.5-3B-Instruct-GGUF  --local_dir ./ qwen2.5-14b-instruct-q5_k_m.gguf
ollama create qwen2_5 -f /mnt/workspace/Modelfile
ollama run qwen2_5

02

安装依赖和设置import

安装openai SDK

!pip install openai
from openai import OpenAI
from pydantic import BaseModel
from typing import Optional
import json
import os
os.environ['QWEN_API_KEY'] = "NONE"
client = OpenAI(
    api_key=os.getenv("QWEN_API_KEY"), # 也可使用dashscope API
    base_url="http://localhost:11434/v1"
)

第三步:Routines

Routines在这里更多的表达的是流程规划(类似之前planning的概念),用来描述一组步骤。具体来说,我们将Routines程序定义为自然语言指令列表(我们将用system prompt来表示),以及完成这些指令所需的工具。

我们借鉴OpenAI的cookbook,选择客服场景agent定义了一个Routines,客服场景非常适合使用多agent,它可以对用户的问题进行分类,然后来建议提供导购,退款,产品服务等方式,因此如下的例子中定义了两个agentexecute_refund和look_up_item。

# Customer Service Routine
system_message = (
        "您是ModelScope模型开源社区的客户支持代理。"
        "始终用一句话或更少的句子回答。"
        "对用户遵循以下常规:"
        "1. 首先,提出探索性问题并更深入地了解用户的问题。\n"
        " - 除非用户已经提供了原因。\n"
        "2. 提出修复建议(编造一个)。\n"
        "3. 仅在不满意的情况下才提供退款。\n"
        "4. 如果接受,搜索 ID,然后执行退款。"
        ""
)
def look_up_item(search_query):
    """用于查找商品 ID。搜索查询可以是描述或关键字."""
    # return hard-coded item ID - in reality would be a lookup
    return "item_132612938"
def execute_refund(item_id, reason="not provided"):
    print("Summary:", item_id, reason) # lazy summary
    return "success"

如上的Routines的主要优势在于其简单性和稳健性。这些指令包含的条件非常类似于状态机或代码中的分支。LLM 实际上可以非常稳健地处理中小型Routines,并且具有遵守prompt的额外好处 - LLM 可以自然地引导对话,并通过多轮问答的方式获取工具参数和调用工具。

03

Routines执行

为了执行Routines,实现一个简单的多轮对话循环:

  1. 获取用户输入。
  2. 将用户消息附加到messages。
  3. 调用模型。
  4. 将模型响应附加至messages。
def run_full_turn(system_message, messages):
    response = client.chat.completions.create(
        model="qwen2_5",
        messages=[{"role": "system", "content": system_message}] + messages,
    )
    message = response.choices[0].message
    messages.append(message)
    if message.content: print("Assistant:", message.content)
    return message
messages = []
while True:
    user = input("User: ")
    messages.append({"role": "user", "content": user})
    run_full_turn(system_message, messages)

对话示例如下:

image.png

如上对话显示,这段对话并不包含函数调用,模型要求将函数格式化为函数模式。本文定义一个辅助函数,将 Python 函数转换为相应的函数模式。

import inspect
def function_to_schema(func) -> dict:
    type_map = {
        str: "string",
        int: "integer",
        float: "number",
        bool: "boolean",
        list: "array",
        dict: "object",
        type(None): "null",
    }
    try:
        signature = inspect.signature(func)
    except ValueError as e:
        raise ValueError(
            f"Failed to get signature for function {func.__name__}: {str(e)}"
        )
    parameters = {}
    for param in signature.parameters.values():
        try:
            param_type = type_map.get(param.annotation, "string")
        except KeyError as e:
            raise KeyError(
                f"Unknown type annotation {param.annotation} for parameter {param.name}: {str(e)}"
            )
        parameters[param.name] = {"type": param_type}
    required = [
        param.name
        for param in signature.parameters.values()
        if param.default == inspect._empty
    ]
    return {
        "type": "function",
        "function": {
            "name": func.__name__,
            "description": (func.__doc__ or "").strip(),
            "parameters": {
                "type": "object",
                "properties": parameters,
                "required": required,
            },
        },
    }

例如:

def sample_function(param_1, param_2, the_third_one: int, some_optional="John Doe"):
    """
    This is my docstring. Call this function when you want.
    """
    print("Hello, world")
schema =  function_to_schema(sample_function)
print(json.dumps(schema, indent=2))

JSON输出:

{
  "type": "function",
  "function": {
    "name": "sample_function",
    "description": "This is my docstring. Call this function when you want.",
    "parameters": {
      "type": "object",
      "properties": {
        "param_1": {
          "type": "string"
        },
        "param_2": {
          "type": "string"
        },
        "the_third_one": {
          "type": "integer"
        },
        "some_optional": {
          "type": "string"
        }
      },
      "required": [
        "param_1",
        "param_2",
        "the_third_one"
      ]
    }
  }
}

现在,我们可以使用此函数在调用它时将工具传递给模型。

messages = []
tools = [execute_refund, look_up_item]
tool_schemas = [function_to_schema(tool) for tool in tools]
response = client.chat.completions.create(
            #model="qwen-plus",
            model="qwen2_5",
            messages=[{"role": "user", "content": "找一个模型服务工具."}],
            tools=tool_schemas,
        )
message = response.choices[0].message
message.tool_calls[0].function

image.png

最后,当模型调用工具时,将需要执行相应的函数并将结果返回给模型。可以通过将工具名称映射到 a 中的 Python 函数来实现这一点tool_map,然后在其中查找execute_tool_call并调用它。最后将结果添加到对话中。

tools_map = {tool.__name__: tool for tool in tools}
def execute_tool_call(tool_call, tools_map):
    name = tool_call.function.name
    args = json.loads(tool_call.function.arguments)
    print(f"Assistant: {name}({args})")
    # call corresponding function with provided arguments
    return tools_map[name](**args)
for tool_call in message.tool_calls:
            result = execute_tool_call(tool_call, tools_map)
            # add result back to conversation 
            result_message = {
                "role": "tool",
                "tool_call_id": tool_call.id,
                "content": result,
            }
            messages.append(result_message)

image.png

可以循环运行该响应,直到不再有工具调用为止。将所有内容放在一起,如下:

tools = [execute_refund, look_up_item]
def run_full_turn(system_message, tools, messages):
    num_init_messages = len(messages)
    messages = messages.copy()
    while True:
        # turn python functions into tools and save a reverse map
        tool_schemas = [function_to_schema(tool) for tool in tools]
        tools_map = {tool.__name__: tool for tool in tools}
        # === 1. get qwen completion ===
        response = client.chat.completions.create(
            #model="qwen-plus",
            model="qwen2_5",
            messages=[{"role": "system", "content": system_message}] + messages,
            tools=tool_schemas or None,
        )
        message = response.choices[0].message
        messages.append(message)
        if message.content:  # print assistant response
            print("Assistant:", message.content)
        if not message.tool_calls:  # if finished handling tool calls, break
            break
        # === 2. handle tool calls ===
        for tool_call in message.tool_calls:
            result = execute_tool_call(tool_call, tools_map)
            result_message = {
                "role": "tool",
                "tool_call_id": tool_call.id,
                "content": result,
            }
            messages.append(result_message)
    # ==== 3. return new messages =====
    return messages[num_init_messages:]
def execute_tool_call(tool_call, tools_map):
    name = tool_call.function.name
    args = json.loads(tool_call.function.arguments)
    print(f"Assistant: {name}({args})")
    # call corresponding function with provided arguments
    return tools_map[name](**args)
messages = []
while True:
    user = input("User: ")
    messages.append({"role": "user", "content": user})
    new_messages = run_full_turn(system_message, tools, messages)
    messages.extend(new_messages)

image.png

现在有了Routines,可以添加更多步骤和更多工具。但最终如果我们尝试用太多不同的任务来扩展Routines,可能会变得非常复杂。我们将“Routines”视为“Agent”,使用交接(handsoff)概念使我们能够简单地表示这些交换——就像现实中,客服中心一个客服专员将对话转交给另一个客服专员一样。

04

交接

将交接定义为Agent将正在进行的对话交接给另一个Agent,和人工服务不一样的是,被交接的Agent可以完全了解之前的对话信息。

为了了解交接的实际操作,首先定义Agent的基本类。

class Agent(BaseModel):
    name: str = "Agent"
    model: str = "qwen2_5"
    instructions: str = "You are a helpful Agent"
    tools: list = []

现在,为了更好的让代码支持它,可以将run_full_turntake anAgent改为 split system_messageand tools:

def run_full_turn(agent, messages):
    num_init_messages = len(messages)
    messages = messages.copy()
    while True:
        # turn python functions into tools and save a reverse map
        tool_schemas = [function_to_schema(tool) for tool in agent.tools]
        tools_map = {tool.__name__: tool for tool in agent.tools}
        # === 1. get qwen completion ===
        response = client.chat.completions.create(
            model=agent.model,
            messages=[{"role": "system", "content": agent.instructions}] + messages,
            tools=tool_schemas or None,
        )
        message = response.choices[0].message
        messages.append(message)
        if message.content:  # print assistant response
            print("Assistant:", message.content)
        if not message.tool_calls:  # if finished handling tool calls, break
            break
        # === 2. handle tool calls ===
        for tool_call in message.tool_calls:
            result = execute_tool_call(tool_call, tools_map)
            result_message = {
                "role": "tool",
                "tool_call_id": tool_call.id,
                "content": result,
            }
            messages.append(result_message)
    # ==== 3. return new messages =====
    return messages[num_init_messages:]
def execute_tool_call(tool_call, tools_map):
    name = tool_call.function.name
    args = json.loads(tool_call.function.arguments)
    print(f"Assistant: {name}({args})")
    # call corresponding function with provided arguments
    return tools_map[name](**args)

我们现在可以轻松运行多个agents:

def execute_refund(item_name):
    return "success"
refund_agent = Agent(
    name="Refund Agent",
    instructions="您是退款代理。帮助用户处理退款。",
    tools=[execute_refund],
)
def place_order(item_name):
    return "success"
sales_assistant = Agent(
    name="Sales Assistant",
    instructions="你是一名销售助理。向用户销售产品。",
    tools=[place_order],
)
messages = []
user_query = "订购模型服务产品"
print("User:", user_query)
messages.append({"role": "user", "content": user_query})
response = run_full_turn(sales_assistant, messages) # sales assistant
messages.extend(response)
user_query = "事实上,我想申请退款" # implitly refers to the last item
print("User:", user_query)
messages.append({"role": "user", "content": user_query})
response = run_full_turn(refund_agent, messages) # refund agent

image.png

交接Agent

现在Agent可以表达交接的意图,对于我们定义的Agents,例如execute_refund或place_order它们返回一个字符串,该字符串将提供给模型。现在我们尝试返回一个Agent对象来指示我们想要转移到哪个Agent,如下所示:

refund_agent = Agent(
    name="Refund Agent",
    instructions="您是退款代理。帮助用户处理退款。",
    tools=[execute_refund],
)
def transfer_to_refunds():
    return refund_agent
sales_assistant = Agent(
    name="Sales Assistant",
    instructions="你是一名销售助理。向用户销售产品。",
    tools=[place_order],
)

然后,可以更新代码以检查函数响应的返回类型,如果是,Agent则更新正在使用的Agent!此外,现在run_full_turn需要返回最新的正在使用的代理,以防发生切换。(可以在Response类中执行此操作以保持整洁。)

class Response(BaseModel):
    agent: Optional[Agent]
    messages: list

现在更新一下run_full_turn:

def run_full_turn(agent, messages):
    current_agent = agent
    num_init_messages = len(messages)
    messages = messages.copy()
    while True:
        # turn python functions into tools and save a reverse map
        tool_schemas = [function_to_schema(tool) for tool in current_agent.tools]
        tools = {tool.__name__: tool for tool in current_agent.tools}
        # === 1. get Qwen completion ===
        response = client.chat.completions.create(
            model=agent.model,
            messages=[{"role": "system", "content": current_agent.instructions}]
            + messages,
            tools=tool_schemas or None,
        )
        message = response.choices[0].message
        messages.append(message)
        if message.content:  # print agent response
            print(f"{current_agent.name}:", message.content)
        if not message.tool_calls:  # if finished handling tool calls, break
            break
        # === 2. handle tool calls ===
        for tool_call in message.tool_calls:
            result = execute_tool_call(tool_call, tools, current_agent.name)
            if type(result) is Agent:  # if agent transfer, update current agent
                current_agent = result
                result = (
                    f"Transfered to {current_agent.name}. Adopt persona immediately."
                )
            result_message = {
                "role": "tool",
                "tool_call_id": tool_call.id,
                "content": result,
            }
            messages.append(result_message)
    # ==== 3. return last agent used and new messages =====
    return Response(agent=current_agent, messages=messages[num_init_messages:])
def execute_tool_call(tool_call, tools, agent_name):
    name = tool_call.function.name
    args = json.loads(tool_call.function.arguments)
    print(f"{agent_name}:", f"{name}({args})")
    return tools[name](**args)  # call corresponding function with provided arguments

如下是一个有更多agents的示例:

def escalate_to_human(summary):
    """只有用户特别需要转人工服务时调用."""
    print("Escalating to human agent...")
    print("\n=== Escalation Report ===")
    print(f"Summary: {summary}")
    print("=========================\n")
    exit()
def transfer_to_sales_agent():
    """负责任何销售或购买相关事务的用户。"""
    return sales_agent
def transfer_to_issues_and_repairs():
    """用户提出问题、维修或退款。"""
    return issues_and_repairs_agent
def transfer_back_to_triage():
    """如果用户提出超出您权限范围的话题,请调用,包括升级为人工客服。"""
    return triage_agent
triage_agent = Agent(
    name="Triage Agent",
    instructions=(
        "您是ModelScope的客户服务机器人。"
        "介绍一下自己。一定要简短。"
        "收集信息以便将客户引导到正确的部门。"
        "但要让你的问题细节而自然。"
    ),
    tools=[transfer_to_sales_agent, transfer_to_issues_and_repairs, escalate_to_human],
)
def execute_order(product, price: int):
    """价格以人民币为单位"""
    print("\n\n=== Order Summary ===")
    print(f"Product: {product}")
    print(f"Price: ${price}")
    print("=================\n")
    confirm = input("确认订单? y/n: ").strip().lower()
    if confirm == "y":
        print("订单执行成功!")
        return "成功"
    else:
        print("订单执行失败!")
        return "用户取消订单."
sales_agent = Agent(
    name="Sales Agent",
    instructions=(
        "您是ModelScope的销售代理。"
        "始终用一句话或更少的句子回答。"
        "对用户遵循以下常规:"
        "1. 询问他们人工智能模型使用的任何问题。\n"
        "2. 随意提及ModelScope的模型服务产品之一可以提供帮助。\n"
        " - 不要提及价格。\n"
        "3. 一旦用户买账,就降低一个非常低价格。\n"
        "4. 只有在一切结束后,如果用户说是,"
        "告诉他们一个疯狂的警告并执行他们的订单。\n"
        ""
    ),
    tools=[execute_order, transfer_back_to_triage],
)
def look_up_item(search_query):
    """用于查找商品 ID。搜索查询可以是描述或关键字。"""
    item_id = "item_132612938"
    print("Found item:", item_id)
    return item_id
def execute_refund(item_id, reason="not provided"):
    print("\n\n=== 退款信息 ===")
    print(f"Item ID: {item_id}")
    print(f"Reason: {reason}")
    print("=================\n")
    print("退款操作成功!")
    return "success"
issues_and_repairs_agent = Agent(
    name="问题与维修代理",
    instructions=(
        "您是 ModelScope的客户支持代理。"
        "始终用一句话或更少的句子回答。"
        "对用户遵循以下常规:"
        "1. 首先,提出探索性问题并更深入地了解用户的问题。\n"
        " - 除非用户已经提供了原因。\n"
        "2. 提出修复建议(编造一个)。\n"
        "3. 仅在不满意的情况下才提供退款。\n"
        "4. 如果接受,搜索 ID,然后执行退款。"
        ""
    ),
    tools=[execute_refund, look_up_item, transfer_back_to_triage],
)

最后,循环运行:

agent = triage_agent
messages = []
while True:
    user = input("User: ")
    messages.append({"role": "user", "content": user})
    response = run_full_turn(agent, messages)
    agent = response.agent
    messages.extend(response.messages)

答复如下

User: 你好

Triage Agent: 您好!很高兴您联系ModelScope。请问有什么可以帮到您的呢?是关于产品信息、购买事宜、遇到的技术问题,还是需要其他类型的帮助呢?请尽可能详细地描述您的情况。

User: 我想买个模型服务产品

Triage Agent: transfer_to_sales_agent({})

Sales Agent: 非常好!我们ModelScope提供多种人工智能模型服务产品,包括但不限于自然语言处理、图像识别和语音识别等领域。请问您具体需要哪种模型服务呢?根据您的需求,我们可以为您推荐最适合的解决方案。

User: 我想要自然语言处理

Sales Agent: 我们有一个非常适合自然语言处理的模型服务,可以帮助您进行文本分类、情感分析等任务。这款模型已经在多个场景中得到了广泛的应用,并且效果非常优秀。请问您是否有具体的使用场景或者数据集需要支持呢?这样我可以更详细地为您介绍一下。

User: 聊天吧

Sales Agent: 我们ModelScope的自然语言处理模型可以很好地支持聊天应用,通过这些模型,您可以实现智能对话等高级功能。如果您正在开发一款聊天机器人,这个服务将非常适合您的需求。您是计划自己构建一个,还是寻找一个现成的解决方案呢?

User: 一个现成的方案

Sales Agent: 我们有一个现成的自然语言处理方案可以提供给您,价格非常优惠,只要10元人民币就可以试用一个月。这个价格包括了模型的使用权和技术支持等服务。

请问您是否满意这个报价,还是有其他方面的顾虑呢?

User:  满意

Sales Agent: 收到!但在执行订单之前,需要注意的是,使用任何人工智能技术都必须遵守相关法律法规,并确保数据安全和个人隐私保护。您确认已经了解并同意这些条款了吗?

请明确回复“是”,我们将立即为您处理订单。如果不是,请告诉我具体原因,这样我们可以进一步调整以满足您的需求。

User:

Sales Agent: execute_order({'price': 10, 'product': '自然语言处理模型服务'})

=== Order Summary ===

Product: 自然语言处理模型服务

Price: $10

=================

确认订单? y/n:  y

订单执行成功!

Sales Agent: 非常好!我们已经为您完成了订购流程。您将很快收到关于如何使用这项服务的详细说明和所有必要的访问信息。如果有任何问题或需要进一步的帮助,请随时联系我们。谢谢!

如果您有任何后续问题,也可以直接联系我们的客服团队。祝您使用愉快!

User: 我想退款

Sales Agent: 请告诉我您想要退款的具体原因,这样我可以帮助您快速解决问题或者指导您完成退款流程。我们重视您的体验和反馈,并会尽力协助您。

User: 我不想要了

Sales Agent: 很遗憾听到这个消息。如果您改变了主意,我们可以帮您办理退款。请您提供下相关的订单信息以便我们能够更快处理。

请问需要我为您执行退款操作吗?如果确认,我们需要立即进行。

User: 确认

Sales Agent: execute_order({'price': 10, 'product': '自然语言处理模型服务退款'})

=== Order Summary ===

Product: 自然语言处理模型服务退款

Price: $10

=================

确认订单? y/n:  y

订单执行成功!

Sales Agent: 退款已经成功处理。如果您将来有任何其他问题或需要进一步的帮助,请随时联系我们。感谢您的理解和支持!希望未来有机会再次为您提供服务。

我们可以看到Qwen2.5-14B的对话效果和工具调用非常丝滑。

05

更多示例

更多示例,比如订票,客服等,可以参考Swarm的example库。注意,仅作为示例,不应直接用于生产。您可以参考example来设置自己的多agent生产系统

点击链接👇即可跳转模型

https://modelscope.cn/models/Qwen/Qwen2.5-14B-Instruct-GGUF?from=alizishequ__text

相关文章
|
6天前
|
前端开发 API 决策智能
多智能体微调实践:α-UMi 开源
近年来,为了加强大型语言模型(Large-Language Models, LLM)实时信息处理、解决专业问题的能力,催生了工具调用智能体(Tool Integrated Agent)概念
|
4天前
|
数据采集 人工智能 自然语言处理
Python实时查询股票API的FinanceAgent框架构建股票(美股/A股/港股)AI Agent
金融领域Finance AI Agents方面的工作,发现很多行业需求和用户输入的 query都是和查询股价/行情/指数/财报汇总/金融理财建议相关。如果需要准确的 金融实时数据就不能只依赖LLM 来生成了。常规的方案包括 RAG (包括调用API )再把对应数据和prompt 一起拼接送给大模型来做文本生成。稳定的一些商业机构的金融数据API基本都是收费的,如果是以科研和demo性质有一些开放爬虫API可以使用。这里主要介绍一下 FinanceAgent,github地址 https://github.com/AI-Hub-Admin/FinanceAgent
|
22天前
|
人工智能 安全 量子技术
大疆DJI无人机等你来拿,蚂蚁集团agentUniverse 多智能体框架有奖征文
agentUniverse有奖征文活动来啦!分享agentUniverse的实践经验、亦或是剖析市面上各路智能体技术理念、对比开源框架的洞见,都有机会获得大疆无人机!
大疆DJI无人机等你来拿,蚂蚁集团agentUniverse 多智能体框架有奖征文
|
1月前
|
弹性计算 自然语言处理 API
如何速成RAG+Agent框架大模型应用搭建
本文侧重于能力总结和实操搭建部分,从大模型应用的多个原子能力实现出发,到最终串联搭建一个RAG+Agent架构的大模型应用。
|
1月前
|
人工智能 搜索推荐
开闭源模型大乱斗:看看哪个智能体最能窥见人类真实意图
【9月更文挑战第3天】在人工智能领域,理解并执行用户意图是一大挑战。现有模型常因用户模糊指令而难以捕捉真实需求。为此,研究人员提出了“Intention-in-Interaction”(IN3)基准,通过显式查询检验隐式意图,引入Mistral-Interact模型评估任务模糊性、询问并细化用户意图,最终执行任务。该方法显著提升了智能体的理解和执行能力,但依然面临评估主观性、用户信息提供不足及复杂任务处理等挑战。论文详情见:https://arxiv.org/abs/2402.09205
34 2
|
2月前
|
人工智能
Meta开源用于数学等复杂推理AI Agent—HUSKY
【8月更文挑战第19天】Meta AI团队开源了HUSKY,一种统一的AI代理,专长解决数学及复杂推理任务。HUSKY通过学习在通用操作空间内推理,涵盖数值、表格和基于知识的任务。它分为生成和执行两阶段,利用专家模型如语言和数值推理模型解决问题。经过14个数据集测试,HUSKY展现出超越同类代理的性能,尤其是在新提出的HUSKYQA评估集中,其7B模型的表现媲美甚至超越GPT-4等大型模型。相关代码和模型已公开,以推动领域内的研究进展。[论文](https://arxiv.org/abs/2406.06469)
39 2
|
2月前
|
人工智能 API 异构计算
AI智能体研发之路-工程篇(四):大模型推理服务框架Xinference一键部署
AI智能体研发之路-工程篇(四):大模型推理服务框架Xinference一键部署
174 2
|
2月前
|
机器学习/深度学习 人工智能 缓存
AI智能体研发之路-模型篇(二):DeepSeek-V2-Chat 训练与推理实战
AI智能体研发之路-模型篇(二):DeepSeek-V2-Chat 训练与推理实战
286 0
|
2月前
|
人工智能 物联网 异构计算
AI智能体研发之路-模型篇(一):大模型训练框架LLaMA-Factory在国内网络环境下的安装、部署及使用
AI智能体研发之路-模型篇(一):大模型训练框架LLaMA-Factory在国内网络环境下的安装、部署及使用
131 0
|
2月前
|
人工智能 前端开发 API
AI智能体研发之路-工程篇(五):大模型推理服务框架LocalAI一键部署
AI智能体研发之路-工程篇(五):大模型推理服务框架LocalAI一键部署
57 0