728x90
반응형

Introducing @neo4j-labs/nams-ai-provider — one package that gives any Vercel AI SDK model persistent, cross-session memory backed by a Neo4j knowledge graph. Three integration modes, one API key, and a guarantee no other memory provider ships.

Every production chat agent has the same embarrassing flaw. A user spends twenty minutes explaining their stack, their preferences, the decision they finally made about their deployment pipeline — and the moment the session ends, all of it evaporates. Tomorrow, the agent greets them like a stranger.

The model isn’t the problem. Context windows are bigger than ever. The problem is architectural: there is no durable place for what the agent learns to live, and no mechanism that brings it back at the right moment.

그것은 두 가지 별도의 작업이고 두 번째 작업은 어려운 작업입니다. 내용을 적는 것은 쉽습니다. 400번 턴에 저장된 9,000개의 문장 중 3개가 속하는 문장을 결정합니다.this프롬프트는 전체 분야입니다.

@neo4j-labs/nams-ai-provider does both jobs, for any model, behind one changed line of code. It’s a community provider for the Vercel AI SDK backed by the hosted Neo4j Agent Memory Service (NAMS) — no Neo4j cluster to run, no vector store to pick, no embedding pipeline to babysit. A free API key and a model swap.

Memory isn’t a list of strings. It’s a graph of people, tools, decisions, and the relationships between them. That’s the bet this package makes.

What it does, in one picture?

Every model call becomes a round trip through memory. The package reads before the call and writes after it:

What it does , in one picture?

In plain terms: the agent gets a notebook it actually re-reads. Before answering, it quietly looks up what it already knows about this person. After answering, it writes down anything new. You don’t call any of that yourself — it happens inside the model call.

Here’s the entire integration. A standard Next.js chat route, before:

import { openai } from '@ai-sdk/openai';
import { ToolLoopAgent, stepCountIs } from 'ai';

const agent = new ToolLoopAgent({
  model:        openai('gpt-5.4-mini'),
  instructions: 'You are a helpful assistant.',
  stopWhen:     stepCountIs(10),
});

And After:

import { createNamsProvider } from '@neo4j-labs/nams-ai-provider';
import { openai } from '@ai-sdk/openai';
import { ToolLoopAgent, stepCountIs } from 'ai';

const nams = createNamsProvider({
  apiKey:       process.env.MEMORY_API_KEY!,
  baseProvider: openai,
  scope:        { userId: 'user-123' },   // who is this memory for?
});

const agent = new ToolLoopAgent({
  model:        nams.languageModel('gpt-5.4-mini'),  // ← the only change
  instructions: 'You are a helpful assistant.',
  stopWhen:     stepCountIs(10),
});

That’s it. Every call now fetches relevant memories for user-123, injects them into the prompt, and saves the exchange for future sessions. No new framework, no orchestration layer, no schema to design first.

Why we built it on the Vercel AI SDK?

The AI SDK offered something better. It gives library authors three clean extension points, and — this is the part that made the design click — each one maps to a different level of control an application developer might legitimately want:

Three Extension points

Look at the middleware contract in particular: transformParams, then wrapGenerate, then wrapStream. That is already the exact shape of a memory system — read before the call, write after it. We didn’t adapt memory to fit the SDK. The SDK’s middleware interface happens to be a memory interface with a different name.

Everything else in the package follows from the same primitives. Graph extraction uses Output.object. The retrieval guarantee in tools mode is a prepareStep hook. The persistence guarantee is an onFinish hook. It is ordinary AI SDK surface, with a graph behind it.

And because it’s a provider, the memory outlives the model. Swap GPT for Claude, Claude for Gemini, and the users’ history comes with you — it lives in the store, not in a user’s context window.

Why a graph, and not a list of strings

Most memory layers store sentences and search them with vectors. That works, right up until you need to answer a question about what you know rather than a question from it.

In plain terms: the left side is a diary. The right side is an address book. Both can tell you what someone said. Only one can tell you — 그리고 해당 내용이 포함된 단락을 다시 작성하지 않고도 잘못된 세부 사항 하나를 수정할 수 있습니다.

구체적으로, 개체 형태의 기억은 이러한 연구 프로젝트를 평범하게 만듭니다.

  • "이 사용자에 대해 당신이 믿는 모든 것을 나열하십시오."삽입된 채팅 로그를 스캔하는 것이 아닌 쿼리입니다.
  • “그건 틀렸어요 — 그냥 고치세요.”방갈로르는 하나의 노드입니다. 한 번 업데이트하세요. 이후의 모든 검색에는 수정 사항이 표시됩니다.
  • “이런 건 언제 배웠어요?”getEntityHistory()는 항목에 대한 모든 교차 대화 멘션을 반환합니다.
  • “이 두 사람은 같은 사람이에요.”mergeEntities()는 중복 항목을 축소하고 SAME_AS 기록 링크를 뒤에 남깁니다.

그게왜 Neo4j인가?답변. "그래프는 멋지다"가 아니라 "실제로 프로덕션에서 받게 될 질문은 그래프 쿼리입니다." 사용자가 묻는 경우“왜 나에 대해 그렇게 생각하는 거지?”, 누군가의 블랙박스 안에 있는 불투명한 얼룩이 아니라 신뢰도 점수와 기록이 있는 노드를 원합니다.

호스팅된 NAMS 서비스는 HTTPS를 통해 모든 것을 얻을 수 있음을 의미합니다. 기본 SDK는 가져오기 전용입니다. 즉, 서버리스 기능에서 누수될 데이터베이스 드라이버, TCP 연결, 연결 풀이 없습니다. Node, Vercel Edge 등 앱이 이미 실행되는 모든 곳에서 실행됩니다.

후드 아래: 기억된 회전의 해부학

검색 — 4개의 소스, 병렬로 검색됨

모델이 실행되기 전에retrieveMemories()는 4개의 메모리 소스를 동시에 팬아웃합니다.

작동 원리: 기억된 회전의 해부학

공급자 및 미들웨어 모드에서 모든 모델 호출은 동일한 수명 주기를 통과합니다.

결과는 콘텐츠별로 중복 제거되고, 백엔드가 제공하는 경우 관련성 점수에 따라 순위가 지정되며(소스 우선순위로 대체: 장기 → 현재 대화 → 세션 간 → 추론) 기본적으로 maxMemories — 6으로 제한되며 턴당 한도는 12입니다. 그 이상을 주입하면 확실하게 답이 나온다더 나쁜, 더 좋지는 않습니다. 프롬프트를 지배하는 메모리 블록은 사용자의 실제 질문을 잃는 또 다른 방법일 뿐입니다.

출처 및 기여

네 번째 소스는 독특하고 잠시 멈춰 볼 가치가 있습니다: NAMS 매장일급 메모리 유형이므로 에이전트는 이전 출력뿐만 아니라 이전 추론도 회상할 수 있습니다. “비율 제한 때문에 그 접근 방식을 배제했습니다”는 “우리는 접근 방식 B를 선택했습니다”와는 다르며 종종 더 가치 있는 기억입니다.

승리한 추억은 라벨이 지정된 블록( [장기], [교차 세션] 등)으로 마지막 사용자 메시지 앞에 추가되므로 모델은 자신이 보고 있는 내용과 출처가 무엇인지 알 수 있습니다.

질문은 답변처럼 보이지 않으므로 2단계 검색

검색은 소스당 하나의 검색으로 끝나지 않으며 이는 패키지에서 가장 유용한 디자인 결정 중 하나입니다.

Ask “나는 어디에 살고 있나요?”저장된 사실에 대해“사용자는 델리 출신입니다”구문 검색에서는 아무것도 찾지 못합니다. 공유된 단어도 없고, 일치하는 항목도 없고, 결과가 비어 있고, 에이전트가 잊어버린 것처럼 보입니다.

따라서 직접 구문 검색이 비어 있으면 검색은 원래 대소문자와 제목 대소문자 모두에서 쿼리의 중요한 단어를 사용하여 두 번째 패스를 실행한 다음 병합, 중복 제거 및원래 질문과 단어 중복을 기준으로 생존자의 순위를 매깁니다.따라서 가장 잘 나온 곡이 소음 속에 묻히지 않습니다.

// "where do i live delhi"  →  direct search: []
//                          →  retry: delhi, Delhi, where, Where, live, Live
//                          →  "User is from Delhi." found, ranked first by overlap

지속성 — 일반적으로 중단되는 경우 포함

응답 후 미들웨어는 차례를 유지합니다.

  • 스트리밍.TransformStream은 응답 스트림을 탭하고, 텍스트-델타 청크를 축적하고, 스트림이 닫히면 플러시 시 지속됩니다. 사용자는 실시간으로 토큰을 받습니다. 메모리 쓰기는 마지막 쓰기 이후에 발생합니다.
  • 구조화된 출력.모델이 텍스트(generateObject) 대신 객체를 반환하면 스트리밍된 도구 호출 인수가 도구-입력-델타 청크에서 재조립되므로 차례가 계속 유지됩니다.
  • 다단계 도구 루프.ToolLoopAgent 루프의 모든 단계는 동일한 사용자 메시지를 전달합니다. 미들웨어는 지속된 내용을 기억하고 해당 메시지를 저장합니다.턴당 한 번, 단계당 한 번이 아닙니다.
  • 신속한 돌연변이.사용자의 원본 텍스트는 WeakMap에 캡처됩니다.~ 전에기억은 주입됩니다. 따라서 저장되는 것은 기억이 강화된 메시지가 아니라 깨끗한 메시지입니다. 이것이 없으면 기억은 자신이 주입한 것을 기억함으로써 천천히 스스로를 중독시킵니다.

대화 해결 — 세션이 자동으로 재개됩니다.

차례는 어떤 대화에 속합니까? 엄격한 우선 순위에 따라 다음 사항이 결정됩니다.

사용자 세션 복귀

세 가지 통합 모드, 하나의 클라이언트

이 패키지는 단일 클라이언트, 단일 API 키, 단일 메모리 저장소를 통해 세 가지를 제공합니다.

이 모드는 보고 싶은 기계의 양에 대한 순전히 코드 수준 선택입니다. 전환은 마이그레이션이 아니라 오후입니다.

Provider — 메모리를 보이지 않게 만듭니다.

입구에서 본 모양이에요. createNamsProvider()는 기본 공급자를 래핑하고 표준 ProviderV4를 반환하므로 nams.언어모델('gpt-5.4-mini')은 openai('gpt-5.4-mini') 를 위한 드롭인입니다. 도구도 없고 시스템 프롬프트 변경도 없고 오케스트레이션도 없습니다. 아래 미들웨어는 모든 호출 내에서 실행됩니다. 당신은 그것을 결코 볼 수 없습니다.

const registry = createProviderRegistry({
  nams: createNamsProvider({
    apiKey:       process.env.MEMORY_API_KEY!,
    baseProvider: openai,
    scope:        { userId: session.userId },
  }),
});

const agent = new ToolLoopAgent({
  model:    registry.languageModel('nams:gpt-5.4-mini'),
  stopWhen: stepCountIs(1),
});

어느 시점에서 메모리는 실제로 구성 파일에서 'openai:gpt-5.4-mini' 대신 'nams:gpt-5.4-mini'라는 하나의 문자열입니다.

미들웨어 모드: 이미 가지고 있는 모델을 꾸미세요.

모델이 다른 곳에 구성되어 있고 모델에 메모리만 추가하려는 경우 인스턴스를 직접 래핑하세요.

const nams  = createNams({ apiKey: process.env.MEMORY_API_KEY! });
const model = nams.wrap(openai('gpt-5.4-mini'), { userId: session.userId });

const agent = new ToolLoopAgent({ model, stopWhen: stepCountIs(1) });

도구 모드: 모델이 결정하도록 하고 사용자가 시청하도록 허용

때로는 투명성is기능. 도구 모드는 모델이 자체 호출하는 두 개의 Zod 검증 AI SDK 도구(일반 도구 호출)로 메모리를 노출하므로 사용자(그리고 오전 2시에 귀하)가 에이전트가 기억하는 것을 볼 수 있는 UI 스트림에 표시됩니다.

const nams  = createNams({ apiKey: process.env.MEMORY_API_KEY! });
const tools = nams.tools({ userId: session.userId });

const agent = new ToolLoopAgent({
  model: openai('gpt-5.4-mini'),
  instructions:
    'Before answering, consult memory with query_memory. When the conversation ' +
    'contains facts or preferences worth remembering, call store_memory before ' +
    'giving your final answer.',
  tools,
  stopWhen: stepCountIs(10),
});

store_memory 스키마는 의도된 것입니다. 모델은 사실, 상호 작용, 패턴 또는 사용자 선호도 등 저장 내용을 알려야 하며 0~1의 신뢰도 점수를 첨부하고 선택적으로 태그를 지정해야 합니다. 상호작용은 단기 대화 기억으로 전달됩니다. 그 밖의 모든 것은 엔터티 피드백으로 기록된 신뢰도와 함께 장기 그래프에 표시됩니다.쓰기 시 구조는 나중에 검색을 정확하게 만드는 요소입니다.

도구 + MCP — 기억하고 행동하세요

toolsWithMcp()는 모든 MCP 서버에 연결하고 해당 도구를 메모리 도구와 병합하므로 하나의 에이전트가 다음 두 가지를 모두 수행할 수 있습니다.

const { tools, close, mcp } = await nams.toolsWithMcp(
  { userId: session.userId },
  { url: 'https://mcp.example.com/mcp', toolPrefix: 'mcp_', optional: true },
);

선택 사항: true는 서버가 다운된 경우 메모리 전용으로 성능이 저하됩니다. mcp.toolNames는 접두사 이름을 보고하므로 다음 도구에서 시스템 프롬프트를 구축할 수 있습니다.우리가 기대했던 것보다 사용할 수 있습니다. @ai-sdk/mcp 종속성은 MCP 구성이 전달될 때만 느리게 가져오는 선택적 피어입니다. 그리고 병합 도구 세트는 { ...a, ...b }이므로 자체 store_memory를 노출하는 서버는 자동으로 우리의 것을 섀도잉합니다. 따라서 병합 시 키 세트를 비교하고 이름별로 경고합니다.

하이브리드 —두 가지를 동시에

모드가 구성됩니다. 모델을 미들웨어로 래핑and도구를 제공하면 모든 호출에서 무조건적인 컨텍스트 주입과 더불어 주문형 검색 및 저장 기능을 갖춘 모델 자체 기능을 얻을 수 있습니다.

const agent = new ToolLoopAgent({
  model: nams.wrap(openai('gpt-5.4-mini'), scope), // baseline context, every call
  tools: nams.tools(scope),                        // model-driven top-ups
  stopWhen: stepCountIs(10),
});

새로운 부분: 실제로 보장할 수 있는 메모리

이는 우리가 Vercel AI SDK 커뮤니티에 가장 먼저 제시하고 싶은 부분입니다. 왜냐하면 우리가 알 수 있는 한다른 어떤 메모리 제공업체도 이를 제공하지 않습니다.— 그리고 도구 기반 메모리를 구축하는 모든 사람들이 조용히 먹고 있는 절충안을 해결합니다.

여기에 절충안이 있습니다. 모든 메모리 통합은 다음 두 가지 형태 중 하나입니다.

  • → 기억은(모든 호출마다 코드에서 실행되지만)(모델은 의도적으로 더 많은 것을 얻을 수 없으며 사용자는 그 일이 일어나는 것을 볼 수 없습니다.)
  • → 기억은모델 중심이지만결코 보장되지 않는다.

두 번째 실패 모드는 생각보다 더 나쁩니다. 도구 설명 및 시스템 지침은 다음과 같습니다.. 모델은 일상적으로 부기 같은 것을 건너뛰고 프롬프트에서 바로 대답합니다. 이는 메모리 제품에서 다음과 같이 자신 있게 대답하는 것을 의미합니다.전혀 기억이 나지 않는다. 우리의 로그에는 깔끔하게 성공적인 방향전환이 표시됩니다. 사용자는 자신을 잊어버린 에이전트를 봅니다. 다음과 같은 메시지가 표시됩니다.“항상 전화해query_memory 먼저”메커니즘이 아니라 제안입니다.

그래서 우리는 AI SDK가 이미 노출한 두 가지 후크 중에서 메커니즘을 구축했습니다.

강제쿼리메모리()검색을 보장하는 prepareStep 후크입니다.도구 순서를 말하지 않고:

  • query_memory는 실행된 도구 호출에 나타나지 않지만 모든 단계는 toolChoice: 'required'에 보관됩니다. 모델은 여전히 ​​원하는 대로 호출할 수 있습니다. 즉, 파일 읽기, MCP 도구 실행 등 순서에 관계없이 호출할 수 있습니다.텍스트로만 답변할 수 없습니다.기억을 참고하기 전에.
  • 쿼리 없이 GraceSteps 단계(기본값: 3) 이후 다음 단계에서는 query_memory를 직접 강제 실행합니다. 쿼리가 실행되지 않으면 루프는 예산을 소진할 수 없습니다.
  • query_memory가 실행되는 순간 모든 제약 조건이 삭제됩니다.
enforceQueryMemory()                  // 3 free steps, then forced
enforceQueryMemory({ graceSteps: 0 }) // forced as the literal first step

메모리 저장() 보장나머지 절반을 닫습니다. prepareStep은 다음을 보장할 수 없습니다.side — 모델이 최종 텍스트를 내보낼 때 루프가 종료되므로 나중에 store_memory를 강제로 적용할 단계가 없습니다. 해당 보장은 루프 이후에도 지속되어야 합니다.

const agent = new ToolLoopAgent({
  model, tools,
  prepareStep: enforceQueryMemory(),      // retrieval guaranteed mid-loop
  onFinish:    ensureMemoryStored(tools), // persistence guaranteed after it
  stopWhen:    stepCountIs(10),
});

모델이 store_memory를 호출하지 않은 경우 후크는 회전 자체를 유지하고 {stored: true, input }을 보고합니다. 그렇지 않으면 { 저장된: 거짓, 이유: '이미 저장된' }으로 중단됩니다. 기본값은 의도적으로 보수적입니다. 즉, 어시스턴트의 최종 텍스트를(단기 대화 메모리, 미들웨어 모드 기록과 일치) 사실이 아닌 에이전트가 기억하는 내용에 대한 요약은 사용자에 대한 새로운 지식이 아니기 때문입니다. 대체 옵션은 null을 반환하여 아무것도 저장하지 않는 등 해당 결정을 우리에게 돌려줍니다.

결과:도구 모드에서는 더 이상 가시성을 보장하기 위해 노력하지 않습니다.

Middleware makes memory unconditional. Tools make it visible. These two hooks
make it both - and they are built entirely from prepareStep and onFinish. Any 
provider in the ecosystem could adopt the pattern tomorrow, and we think they
should.

누구도 경계하지 않는 또 하나의 사실

관련되어 있고 놓치기 쉽습니다. 사용자가 묻습니다.“나에 대해 무엇을 기억하시나요?”상담원이 답변합니다"인출된 장기 기억은 간결하고 기술적인 답변을 선호한다는 것을 나타냅니다..."모델은 자체 요약을 유용하게 저장합니다. 그리고 추출은 충실하게 엔터티를 생성합니다 —:

long-term memories  [Concept]
past interactions   [Event]
profile details     [Object]

The next“무엇을 기억하시나요?” 의미상 정확하게 해당 메타 엔터티에 가장 가깝기 때문에 Alex [Person] 및 Bangalore [Location]보다 순위가 높습니다. 모든 질문은 다음 질문을 더욱 악화시킵니다. 그리고 그 질문은 모든 메모리 제품에서 가장 많이 묻는 질문입니다.

경비원은 고의로어휘 목록이 아닌 구조적 목록. 영어 문구의 거부 목록은 다른 언어를 사용하는 첫 번째 사용자를 중단시키는 유지 관리 런닝머신이 될 것입니다. 두 가지 규칙이 작동합니다.

// A proper noun differs from its own lowercase form. A script without case
// ("北京", "القاهرة") reports equal upper and lower forms, so the test declines
// to fire rather than rejecting every entity in that language.
const isCommonNoun = (name: string) =>
  name === name.toLowerCase() && name !== name.toUpperCase();

// …plus: an entity named after its own type ("Organization [Organization]"),
// compared after crude singularization.

건너뛴 엔터티는 기록되므로 동작은 자동이 아닌 관찰 가능하며, extractOptions.skipEntity를 사용하면 도메인 엔터티가 실제로 있을 때 규칙을 완전히 대체할 수 있습니다.are일반 명사. 벨트 및 중괄호: store_memory 도구 설명은 query_memory가 방금 반환한 내용을 절대 저장하지 않도록 모델에 명시적으로 지시합니다.

문자열에서 엔터티까지: 그래프 추출

extractModel을 전달하면 저장된 모든 메모리가 문장으로 저장되는 대신 유형이 지정된 엔터티로 분해됩니다.

const nams = createNamsProvider({
  apiKey:          process.env.MEMORY_API_KEY!,
  baseProvider:    openai,
  scope:           { userId },
  extractionModel: openai('gpt-5.4-mini'),  // one extra call per stored memory
});

(Alex:Person)-[:WORKS_AT]->(TechCorp:Organization)

따라서 "사용자 이름은 Alex이고 TechCorp에서 일합니다"는 하나의 문장 모양 노드가 되지 않습니다. 즉, Alex [Person] 및 TechCorp [Organization]이 됩니다. 각각은 메모리의 신뢰도 점수를 피드백으로 전달하며 각각 독립적으로 검색 및 수정 가능합니다. 추출은 기본적으로 꺼져 있고 보수적으로 설계되었으며(실제 명명된 엔터티만, 발명 없음) 실패할 경우 일반 엔터티로 대체되므로 아무것도 손실되지 않습니다.

오늘날 우리가 호스팅하는 서비스에서 얻을 수 있는 것은 실제 그래프 API(getEntityGraph(), getRelatedEntities(), getEntityHistory(), mergeEntities(), setEntityFeedback())가 포함된 유형이 지정되고 중복이 제거되고 신뢰도 점수가 매겨진 엔터티 저장소입니다. 이는 이미 채팅 로그의 벡터 인덱스와는 다른 개체입니다. 에이전트가 사용자에 대해 믿는 것을 열거하고, 각 내용을 언제 배웠는지 확인하고, 수정하고, 중복 항목을 병합할 수 있습니다.

Honest status on edges. The extractor produces typed relationships 
(WORKS_AT, PREFERS, USES) and attempts to write each one, but the hosted NAMS 
REST API has no relationship endpoint yet — so edge writes are skipped, 
reported once per client, and then suppressed rather than flooding your logs.
Entities land; edges do not, on the hosted path, today. When the endpoint 
ships, edges start persisting with no change on our side. We'd rather tell 
you than let you discover it.

그림 1: 메모리가 부착되는 위치

모드는 기계가 아닌 부착 지점을 변경합니다. 레인 A는TransformParams 내부를 검색하고 스트림 플러시 시 지속됩니다. 레인 B는 모델이 자체적으로 호출하는 두 가지 도구를 통해 동일한 작업을 수행합니다. 엔터티 추출은 두 가지 모두에서 선택적으로 제공됩니다. 에지가 추출되어 시도되지만 호스팅된 REST API에는 관계 엔드포인트가 없습니다. 즉, 엔터티가 연결되고 단일 경고 후에 관계가 삭제됩니다.

레인 2개, 코어 1개. 레인은 SDK 미들웨어 또는 모델 중 누가 메모리 접촉을 결정하는지에 따라 다릅니다. 둘 다 동일한 두 패키지 기능에 속합니다.

그림 2: One Retrieval이 실제로 수행하는 작업

모든 히트에는 해당 계층이 태그로 지정됩니다. 이것이 바로 데모의 3개 메모리 탭이 UI 발명이 아닌 메모리 모델 자체 그룹화인 이유입니다. 비대칭성에 유의하십시오. 장기 엔터티만 신뢰도 점수를 가지므로 신뢰도 점수가 없는 결과 세트는 실제 관련성 정렬이 아닌 고정된 우선순위 순서로 분류됩니다.

누구를 위한 것인가요?

에이전트가 잊어버리지 않기를 원하는 개발자라면.바닥은 무료 API 키와 변경된 한 줄입니다. 메모리가 에이전트를 향상시키는지 확인하기 전에 프로비저닝할 Neo4j도 없고, 선택할 벡터 저장소도 없고, 실행할 임베딩 파이프라인도 없으며, 설계할 스키마도 없습니다. 다음은 코드가 이미 실행되는 곳에서 발생하는 HTTP 호출입니다.

프로덕션으로 배송하는 팀인 경우.메모리는 사용자별로 범위가 지정되므로(범위: { userId }) 다중 테넌시는 설계 프로젝트가 아닌 매개변수입니다. 검사가 가능하기 때문에 "왜 나에 대해 그렇게 생각하는 걸까요?" 보여줄 수 있는 답변이 있습니다. 그리고 이는 오류 방지 설계(아래)이므로 메모리 중단으로 인해 에이전트가 중단되는 대신 성능이 저하됩니다.

Vercel AI SDK를 기반으로 빌드하는 경우.SDK 자체메모리 가이드Letta, Mem0, Supermemory, Hindsight 및 MongoDB —에이전트 영구 메모리를 제공하는 5가지 방법,그 중 그래프 기반은 하나도 없어. 에이전트가 무언가를 기억해야 한다고 결정하는 순간 개발자가 방문하는 페이지이며 그래프 모양의 옵션이 여기에 속합니다.

이 패키지는 실제 영향력을 지닌 커뮤니티 제공자의 실제 사례이기도 합니다. ProviderV4 + WrapLanguageModel + tool() + prepareStep + onFinish는 자체 프레임워크 없이 완전한 메모리 시스템을 구축하는 데 충분하다는 것이 밝혀졌습니다.

패키지가 메모리 공급자 역할을 지시하는 방식

  1. 하나가 아닌 세 가지 통합 형태.보장되지만 보이지 않음과 표시되지만 선택 사항은 모두 서로 다른 앱에 대한 선택입니다. 하나의 클라이언트와 하나의 API 키에서 둘 다 얻는다는 것은 우리가 원하는 것이 무엇인지 예측할 필요가 없다는 것을 의미합니다.
  2. 보증 후크.EnforceQueryMemory() + verifyMemoryStored()는 모델 기반 메모리를 신뢰할 수 있게 만듭니다. 이것은 완전히 새로운 아이디어이며 공개 SDK 기본 요소로 구축되었습니다.
  3. 문서 형태의 저장소가 아닌 엔터티 형태의 저장소입니다.모든 제공자가 답변할 수 있습니다.“사용자가 나에게 X에 대해 뭐라고 말했나요?”— 그것은 텍스트에 대한 벡터 검색이며 테이블 스테이크입니다. 자신감, 기록 및 병합 의미 체계를 갖춘 Python [ProgrammingLanguage]을 일류 노드로 저장하는 것은 다른 데이터 모델이며,"이 사용자에 대해 알고 있는 모든 내용을 나열하고 잘못된 부분을 수정하겠습니다."쿼리에 추가합니다.

적합하지 않은 경우:자신을 위해 설계된 메모리 계층을 원하거나(Session/Semantic/Procedural/Episodic/Scratchpad 분할이 실제로 잘 고려되어 있음) Anthropic을 사용 중이고 파일 디렉터리 비유가 작업에 적합하다면 이것이 더 나은 시작점이 됩니다.

오류 방지 기능을 제공하도록 설계되었으며 유사한 테스트를 거쳤습니다.

사용자와 모델 사이에 메모리 계층이 있으므로 응답이 실패하는 이유가 되어서는 안 됩니다. 패키지의 핵심 불변성:

If memory breaks, the model call still succeeds. Every retrieval and 
persistence failure degrades to a logged warning — never a thrown error 
in the request path.

이러한 주장은 NAMS 클라이언트의 메모리 내 가짜에 대해 각 레이어를 실행하는 Vitest 제품군(5개 파일에 대한 63개 테스트)에 의해 뒷받침됩니다.

지금 사용해 보세요

npm install @neo4j-labs/nams-ai-provider ai @ai-sdk/provider @neo4j-labs/agent-memory zod
  1. 받기무료 API 키 at memory.neo4jlabs.com → MEMORY_API_KEY=sk-nams-…
  2. 채팅 경로에서 한 줄 바꾸기
  3. 에이전트는 다음 배포를 기억합니다.
npm install        # dev dependencies
npm test           # vitest — retrieval, provider, middleware, tools, extraction
npm run typecheck  # tsc --noEmit
npm run build      # tsup → dist/ (ESM + type declarations)

실행 가능한 4가지 예시는 각 통합 경로를 엔드 투 엔드로 다룹니다.

패키지는 Apache-2.0입니다. 그만큼소스는 GitHub에 있습니다나란히핵심 TypeScript SDK, 그리고Vercel AI SDK 커뮤니티 제공자 문서구현하는 내용을 다룹니다. 질문과 전쟁 이야기는 환영합니다Neo4j Community Forum; 버그 및 기능 요청은 다음에 속합니다.GitHub 문제.

세 가지 통합 형태는 결론이 아니라 내기였습니다. 네 번째 버전에 도달하거나 그 중 하나가 사하중이라는 것을 알게 되면 이것이 다음 버전을 구성하는 보고서입니다.

우리 사용자들은 매일 우리 에이전트에 자신을 소개하고 있습니다. 이제 그들을 기억할 때입니다.

태그: AI 에이전트 · Vercel AI SDK · Neo4j · 지식 그래프 · TypeScript

Neo4j Labs project. @neo4j-labs/nams-ai-provider is actively maintained 
but experimental — no SLAs or backwards-compatibility guarantees. 
It targets AI SDK v7 / LanguageModelV4 and requires it — ai@^7, 
@ai-sdk/provider@^4. The minimal middleware in 
@neo4j-labs/agent-memory/middleware/vercel-ai, 
written against the AI SDK 4.x LanguageModelV1Middleware shape, 
remains available, but new projects should prefer this package.

  • AI 메모리
  • npm 패키지

에이치시스템즈의 LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.

👉 에이치시스템즈 홈페이지

728x90
반응형

+ Recent posts