올라마의 다중 사용자 에이전트 떼

오래 전에 그래픽 사용자 인터페이스는 명령 줄 입력을 대체했습니다. 의사-그래픽 인터페이스가 준비되지 않은 사용자의 상호 작용 문제를 해결할 수있는 것처럼 보이지만 모든 사람이 알아 차리는 것은 아닙니다.

중요한! 그래픽 사용자 인터페이스를 개발하는 것은 의사 그래픽보다 저렴합니다. 역사적으로, 다음 큐브 릴리스 직후, OBJC는 페이지를 마우스로 배열 할 수있는 그래픽 폼 편집기와 함께 소개되었습니다. 현대 세계에서 Frontend는 DEV 도구를 통해 그래픽 형태 디버깅을 제공합니다.이 도구는 본질적으로 동일한 것입니다. 기술적 인 세부 사항이없는 공칭 코드, 문제가 발생하면 버그를 더 저렴하게 찾는 GUI가 있습니다.

그러나 사용자 인터페이스를 전혀하지 않는 것은 훨씬 저렴합니다. 정적 IP, PCI DSS, Yandex 및 Google에서 홍보 된 도메인 또는 휠을 재발 명하지 않고 개발보다 방문자를 유치하는 데 3 배 더 많은 비용이 드는 또 다른 웹 제품을 만들지 않으면 Highload가 필요하지 않습니다.

전화는 "전화", Phonetics -Sound라는 단어에서 나옵니다. Figma, Blender, Photoshop, Unreal Engine에 대한 수많은 버튼 조합을 배우는 대신 명령을 음성으로하는 것이 더 간단합니다. Archicad에서 도면을 어떻게 회전합니까?
에이전트 Swarm은 Android의 조각 또는 React의 라우터와 같습니다. 이전 사용자 입력을 기반으로 작업 범위 (화면의 버튼)를 지정할 수 있습니다. 예를 들어, 통화가 SIP 전화로 들어 오면 먼저 사람이 원칙적으로 품목을 사거나 반환하려는 경우에 사용 가능한 제품 목록을 제공 해야하는지 이해해야합니다.
세무서는 항상 테이블 형식으로 차변/크레딧을 요구하므로 CRM 시스템은 아무데도 가지 않을 것입니다. LLM의 작업은 채팅 또는 음성 인식에서 자연스러운 텍스트를 구문 분석하여 이름과 인수가있는 함수 서명으로 변환하여 데이터를 호출하고 데이터베이스에 기록 할 수 있도록하는 것입니다.
이 문제를 해결하려면 몇 가지 뉘앙스를 아는 것이 중요합니다.
각각의 열린 채팅 세션마다, 스와 암 오케스트레이션은 그들 사이에 공유 된 채팅 기록을 가진 에이전트 트리와 다른 사용자를 위해 분리되어야합니다. 이 코드에서는 Agent-Swarm-Kit의 후드 아래에서 구현됩니다.
import { addSwarm } from "agent-swarm-kit" ;
export const ROOT_SWARM = addSwarm ( {
swarmName : 'root_swarm' ,
agentList : [
TRIAGE_AGENT ,
SALES_AGENT ,
] ,
defaultAgent : TRIAGE_AGENT ,
} ) ;
...
app . get ( "/api/v1/session/:clientId" , upgradeWebSocket ( ( ctx ) => {
const clientId = ctx . req . param ( "clientId" ) ;
const { complete , dispose } = session ( clientId , ROOT_SWARM )
return {
onMessage : async ( event , ws ) => {
const message = event . data . toString ( ) ;
ws . send ( await complete ( message ) ) ;
} ,
onClose : async ( ) => {
await dispose ( ) ;
} ,
}
} ) ) ;에이전트를 만들 때, 우리는 그것이해야 할 일을 설명하는 하나 이상의 시스템 메시지를 지정합니다. 우리는 언어 모델로의 커넥터를 지정합니다.이 모델은 일부 에이전트를 무료로 로컬로 처리 할 수 있으며 복잡한 클라우드 서비스를 개방형 클라우드 서비스에 위임 할 수 있습니다. 무언가가 작동하지 않으면 시스템 배열에 프롬프트가 추가됩니다 (예 : Ollama의 기능 호출 수정).
const AGENT_PROMPT = `You are a sales agent that handles all actions related to placing the order to purchase an item.
Tell the users all details about products in the database by using necessary tool calls
Do not send any JSON to the user. Format it as plain text. Do not share any internal details like ids, format text human readable
If the previous user messages contains product request, tell him details immidiately
It is important not to call tools recursive. Execute the search once
` ;
/**
* @see https://github.com/ollama/ollama/blob/86a622cbdc69e9fd501764ff7565e977fc98f00a/server/model.go#L158
*/
const TOOL_PROTOCOL_PROMPT = `For each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:
<tool_call>
{"name": <function-name>, "arguments": <args-json-object>}
</tool_call>
` ;
export const SALES_AGENT = addAgent ( {
agentName : "sales_agent" ,
completion : OLLAMA_COMPLETION ,
system : [ TOOL_PROTOCOL_PROMPT ] ,
prompt : AGENT_PROMPT ,
tools : [ SEARCH_PHARMA_PRODUCT , NAVIGATE_TO_TRIAGE ] ,
} ) ;이 예에서는 Ollama를 사용하여 사용자 요청을 처리합니다. 용어에 익숙하지 않은 사람들의 경우 : 언어 모델이 입력으로 사용자와 채팅 기록을 수신하고 새 메시지를 출력하는 프로세스를 완성이라고합니다. Agent-Swarm-Kit은 클라우드 제공 업체 또는 로컬 모델과 유사하게 작동하는 추상 인터페이스를 사용합니다. 이 기사를 사용하여 DeepSeek을 연결하십시오.
import { addCompletion , IModelMessage } from "agent-swarm-kit" ;
const getOllama = singleshot ( ( ) => new Ollama ( { host : CC_OLLAMA_HOST } ) ) ;
export const OLLAMA_COMPLETION = addCompletion ( {
completionName : "ollama_completion" ,
getCompletion : async ( {
agentName ,
messages ,
mode ,
tools ,
} ) => {
const response = await getOllama ( ) . chat ( {
model : "nemotron-mini:4b" , // "mistral-nemo:12b";
keep_alive : "1h" ,
messages : messages . map ( ( message ) => omit ( message , "agentName" , "mode" ) ) ,
tools ,
} ) ;
return {
... response . message ,
mode ,
agentName ,
role : response . message . role as IModelMessage [ "role" ] ,
} ;
} ,
} ) ; Active Agent를 변경하고 데이터베이스에서 데이터를 얻는 것은 도구 통화를 통해 수행됩니다. 언어 모델은 로컬 모델의 프레임 워크 또는 Openai의 클라우드 제공 업체에서 Python/JS 등에서 외부 코드를 {"role": "tool", "content": "Product Paracetamol found in database: fever reducer for fighting flu"} 로 기록됩니다. 다음 사용자 메시지에서 언어 모델은 도구의 데이터로 작동합니다.
import { addTool , changeAgent , execute } from "agent-swarm-kit" ;
const PARAMETER_SCHEMA = z . object ( { } ) . strict ( ) ;
export const NAVIGATE_TO_SALES = addTool ( {
toolName : "navigate_to_sales_tool" ,
validate : async ( clientId , agentName , params ) => {
const { success } = await PARAMETER_SCHEMA . spa ( params ) ;
return success ;
} ,
call : async ( clientId , agentName ) => {
await commitToolOutput (
"Navigation success`,
clientId ,
agentName
) ;
await changeAgent ( SALES_AGENT , clientId ) ;
await execute ( "Say hello to the user" , clientId , SALES_AGENT ) ;
} ,
type : "function" ,
function : {
name : "navigate_to_sales_tool" ,
description : "Navigate to sales agent" ,
parameters : {
type : "object" ,
properties : { } ,
required : [ ] ,
} ,
} ,
} ) ;하드 코딩 초기 에이전트 메시지를 피하기 위해 에이전트를 전환 할 때 사용자 요청 시뮬레이션이 인사를 요청합니다.
import {
addTool ,
commitSystemMessage ,
commitToolOutput ,
execute ,
getLastUserMessage ,
} from "agent-swarm-kit" ;
const PARAMETER_SCHEMA = z
. object ( {
description : z
. string ( )
. min ( 1 , "Fulltext is required" )
} )
. strict ( ) ;
export const SEARCH_PHARMA_PRODUCT = addTool ( {
toolName : "search_pharma_product" ,
validate : async ( clientId , agentName , params ) => {
const { success } = await PARAMETER_SCHEMA . spa ( params ) ;
return success ;
} ,
call : async ( clientId , agentName , params ) => {
let search = "" ;
if ( params . description ) {
search = String ( params . description ) ;
} else {
search = await getLastUserMessage ( clientId ) ;
}
if ( ! search ) {
await commitToolOutput (
str . newline ( `The products does not found in the database` ) ,
clientId ,
agentName
) ;
await execute (
"Tell user to specify search criteria for the pharma product" ,
clientId ,
agentName
) ;
return ;
}
const products = await ioc . productDbPublicService . findByFulltext (
search ,
clientId
) ;
if ( products . length ) {
await commitToolOutput (
str . newline (
`The next pharma product found in database: ${ products . map (
serializeProduct
) } `
) ,
clientId ,
agentName
) ;
await commitSystemMessage (
"Do not call the search_pharma_product next time!" ,
clientId ,
agentName
) ;
await execute (
"Tell user the products found in the database." ,
clientId ,
agentName
) ;
return ;
}
await commitToolOutput (
`The products does not found in the database` ,
clientId ,
agentName
) ;
await execute (
"Tell user to specify search criteria for the pharma product" ,
clientId ,
agentName
) ;
} ,
type : "function" ,
function : {
name : "search_pharma_product" ,
description :
"Retrieve several pharma products from the database based on description" ,
parameters : {
type : "object" ,
properties : {
description : {
type : "string" ,
description :
"REQUIRED! Minimum one word. The product description. Must include several sentences with description and keywords to find a product" ,
} ,
} ,
required : [ "description" ] ,
} ,
} ,
} ) ;언어 모델은 공구 통화를 위해 이름이 지정된 매개 변수 사전을 형성 할 수 있습니다. 그러나 OpenSource 모델은 폐쇄 회로에 대한 기술적 인 요구 사항이있는 경우이를 제대로 처리하지 못합니다. 대화 자체를 분석하는 것이 더 간단합니다.
여러 ChatGpt 세션 (에이전트)이 도구 호출을합니다. 각 에이전트는 예를 들어 일상적인 커뮤니케이션을 위해 Mistral 7B, 비즈니스 대화를위한 Nemoton과 같은 다른 모델을 사용할 수 있습니다.
에이전트 Swarm은 ClientID URL 매개 변수를 사용하여 각 WebSocket 채널에 대한 Active ChatGpt 세션 (에이전트)으로 메시지를 지시합니다. 사람과의 새로운 채팅마다 새로운 채널이 자체 에이전트 떼와 함께 만들어집니다.
떼의 활성 ChatGpt 세션 (에이전트)은 도구를 실행하여 변경할 수 있습니다.
모든 클라이언트 세션은 모든 에이전트의 공유 채팅 메시지 기록을 사용합니다. 각 고객의 채팅 기록은 마지막 25 개의 메시지를 회전과 함께 저장합니다. Chatgpt 세션 (에이전트) 사이에 조수 및 사용자 유형 메시지 만 전송되는 반면 시스템 및 도구 메시지는 에이전트의 범위로 제한되므로 각 에이전트는 이와 관련된 도구 만 알고 있습니다. 결과적으로 각 ChatGpt 세션 (에이전트)에는 고유 한 시스템 프롬프트가 있습니다.
에이전트의 출력이 유효성 검사에 실패하면 (존재하지 않는 도구 호출, 잘못된 인수, 빈 출력, 출력의 XML 태그 또는 출력의 JSON)가있는 도구 호출) 구조 알고리즘이 모델을 수정하려고합니다. 첫째, 모델에서 이전 메시지를 숨길 것입니다. 그것이 도움이되지 않는다면, 그것은 "죄송합니다. 이해하지 못했습니다. 반복 해 주시겠습니까?"와 같은 자리 표시자를 반환 할 것입니다.
addAgent 새로운 에이전트를 등록하십시오addCompletion 새로운 언어 모델 등록 : 클라우드, 로컬 또는 모의addSwarm 사용자 채팅 처리를위한 에이전트 그룹 등록addTool 언어 모델을 외부 시스템에 통합하기위한 도구 등록changeAgent 떼에서 활성 에이전트를 변경하십시오complete - 에이전트 떼에게 전달 된 메시지에 대한 응답 요청session - 채팅 세션 생성, 세션 완료 및 새 메시지 보내기를위한 콜백 제공getRawHistory 디버깅을위한 원시 시스템 기록을 얻으십시오getAgentHistory 자가 복구 메커니즘 및 메시지 수신자에 맞게 조정 된 에이전트에 대한 역사가 보이기commitToolOutput 기능 실행 결과를 기록에 전송합니다. 함수가 호출되면 에이전트는 응답을받을 때까지 동결됩니다.commitSystemMessage 새로운 입력이있는 보충 시스템 프롬프트commitFlush 잘못된 응답이 수신되거나 모델이 도구를 재귀 적으로 잘못 호출하는 경우 에이전트에 대한 명확한 대화execute - 신경망에 신경망에 주도권을 잡고 먼저 사용자에게 편지를 보내도록 요청하십시오.emit - 미리 준비된 메시지를 사용자에게 보냅니다getLastUserMessage 사용자로부터 마지막 메시지를 받으십시오 (Execute를 고려하지 않고)commitUserMessage 응답없이 채팅 기록에서 사용자 메시지를 저장하십시오. 사용자가 요청 처리를 기다리지 않고 메시지를 스팸하는 경우getAgentName 활성 에이전트 이름을 얻습니다getUserHistory 사용자 메시지의 기록을 얻으십시오getAssistantHistory 언어 모델 메시지의 역사를 얻습니다getLastAssistantMessage 언어 모델에서 마지막 메시지를 받으십시오getLastSystemMessage 마지막 시스템 프롬프트 보충제를 얻으십시오