- Vzpostavitev ekosistema trajnega pomnilnika z uporabo Ollame kot mehanizma za sklepanje in vdelave.
- Implementacija lokalnih vektorskih podatkovnih baz z uporabo Qdrant ali ChromaDB za preprečevanje odvisnosti od oblaka.
- Optimizacija ekstrakcije dejstev s sinhronizacijo specifičnih vektorskih dimenzij.
Jezikovni modeli si ne zapomnijo samodejno, kaj se je zgodilo v prejšnjih pogovorih. Ko zaprete aplikacijo, preklopite med sejami ali izbrišete stara sporočila iz kontekstnega okna, model izgubi te podatke.
Eden od načinov za premagovanje te omejitve je, da Poveži zapisek z OllamoOllama lokalno izvaja generativni model in model vdelave, medtem ko Mem0 iz pogovorov izvleče koristne informacije, jih organizira in omogoča njihov dostop, ko postanejo ponovno pomembne.
Namesto da bi modelu vedno pošiljala celotno zgodovino, lahko aplikacija pridobi nekaj spominov, povezanih s trenutno poizvedbo, in jih vstavi v poziv. To zmanjša količino konteksta in omogoča ohranjanje nastavitev, ciljev ali pomembnih dejstev med sejami.
Namestitev lahko deluje v celoti znotraj vaše infrastrukture, če uporabljate Ollama, Mem0 OSS in lokalno bazo podatkov. Vendar pa bo popolna zasebnost odvisna od vseh povezanih komponent. Če dodate zunanji model, prerazvrščevalec, bazo podatkov ali upravljano storitev, lahko nekateri podatki zapustijo vaš sistem.
Kaj počne Mem0 in kakšno funkcijo ima Ollama?

Mem0 in Ollama rešujeta različne probleme. Ollama je odgovoren za vodenje modelovmedtem ko Mem0 zagotavlja operacije, potrebne za dodajanje, iskanje, poizvedovanje, posodabljanje in brisanje pomnilnikov.
Med shranjevanjem lahko Mem0 analizira pogovor in iz njega izlušči dejstva, ki so lahko kasneje koristna. Na primer:
- Uporabnik ima raje kratke odgovore.
- Razvija aplikacijo v Rustu.
- Noče priporočil za grozljivke.
- Njihov cilj je dirko preteči v manj kot štirih urah.
Mem0 pretvori vsak spomin v numerično predstavitev z uporabo modela vdelave in ga shrani skupaj z njegovo vsebino in metapodatki. Pri iskanju združi poizvedbo s filtri, kot je uporabnikov identifikator, in vrne najustreznejše spomine.
Trenutne različice Mem0 uporabljajo predvsem aditivno ekstrakcijo. To pomeni, da je mogoče shraniti nove informacije, ne da bi se pri tem samodejno izbrisali prejšnji podatki. Če so podatki zastareli in jih je treba popraviti, lahko aplikacija izrecno uporabi ustrezne operacije. update() o delete().
Mem0 ne nadomešča pogovornega modela. Aplikacija mora pridobiti spomine, jih vključiti v sistemsko sporočilo ali kontekst in od Ollame zahtevati, da ustvari odgovor.
Komponente, potrebne za povezavo Mem0 z Ollamo
Za izgradnjo lokalnega sistema potrebujete te komponente:
- Zapis OSS: upravlja ekstrakcijo, shranjevanje in priklic spominov.
- Ollama: Izvaja generativni model in model vdelav.
- Jezikovni model: Interpretira pogovore in generira odgovore.
- Model vgradnje: preoblikuje spomine in poizvedbe v vektorje.
- Vektorsko skladišče: Ohranja vektorje in omogoča iskanje sorodnih spominov.
- Vloga: Povezuje pogovor, iskanje in shranjevanje v spominu.
Qdrant in Chroma sta dve pogosti možnosti shranjevanja:
| Trgovina | Priporočena uporaba |
|---|---|
| Qdrant | Trajne storitve, več aplikacij in uvajanja z uporabo Dockerja |
| Kroma | Lokalno testiranje in majhne aplikacije s shranjevanjem v mape |
Qdrant ponuja ločen API in omogoča enostavno ločevanje vektorske baze podatkov od aplikacije. Chroma lahko uporablja lokalno pot, kar poenostavi začetno testiranje.
Kako namestiti Mem0, Ollama in Qdrant
Najprej namestite Ollamo in preverite, ali storitev deluje. Nato prenesite jezikovni model in model vdelave:
ollama pull llama3.1:latest
ollama pull nomic-embed-text:latest
llama3.1:latest To je model, uporabljen v uradnem primeru Mem0, vendar ga lahko zamenjate z drugim inštrukcionalnim modelom, ki je združljiv z Ollamo. Manjši modeli porabijo manj pomnilnika, čeprav lahko podatke izvlečejo z manjšo natančnostjo ali se slabše držijo pričakovane oblike.
Namestite odvisnosti Pythona:
pip install mem0ai qdrant-client openai ollama
Če želite zagnati Qdrant v Dockerju in ohraniti podatke z uporabo nosilca, uporabite:
docker volume create qdrant_storage
docker run -d \
--name qdrant \
-p 6333:6333 \
-p 6334:6334 \
-v qdrant_storage:/qdrant/storage \
qdrant/qdrant
Pristanišče 6333 zagotavlja HTTP API in 6334 Uporablja se za gRPC. V tem primeru se Mem0 poveže z uporabo HTTP API-ja.
Preverite, ali Ollama odgovori:
curl http://localhost:11434/api/tags
Qdrant lahko preverite tako, da odprete:
http://localhost:6333/dashboard
Teh vrat ne izpostavljajte neposredno internetu. Če storitve delujejo na različnih računalnikih, uporabite zasebno omrežje, VPN ali pravila požarnega zidu, ki dovoljujejo le potrebne povezave.
Lokalna konfiguracija Mem0 z Ollamo in Qdrantom

Konfiguracija mora izrecno navajati, da bo Ollama uporabljena kot LLM in kot ponudnik vdelave. Prav tako mora določati, kje se nahaja Qdrant in katere dimenzije ustvarjajo vdelave.
from mem0 import Memory
OLLAMA_URL = "http://localhost:11434"
CHAT_MODEL = "llama3.1:latest"
EMBEDDING_MODEL = "nomic-embed-text:latest"
config = {
"vector_store": {
"provider": "qdrant",
"config": {
"collection_name": "memoria_agente",
"host": "localhost",
"port": 6333,
"embedding_model_dims": 768,
},
},
"llm": {
"provider": "ollama",
"config": {
"model": CHAT_MODEL,
"temperature": 0,
"max_tokens": 2000,
"ollama_base_url": OLLAMA_URL,
},
},
"embedder": {
"provider": "ollama",
"config": {
"model": EMBEDDING_MODEL,
"ollama_base_url": OLLAMA_URL,
},
},
"history_db_path": "./mem0_history.db",
"custom_instructions": """
Extrae únicamente información que pueda ser útil en conversaciones futuras:
- Preferencias estables
- Objetivos y proyectos
- Restricciones importantes
- Decisiones confirmadas
Ignora saludos, conversación casual y hechos temporales sin importancia.
Devuelve un objeto JSON con la clave facts y una lista de recuerdos.
""",
}
memory = Memory.from_config(config)
Memory.from_config() Prisili Mem0, da uporabi določene ponudnike. Konstruktor Memory() Ne poveže se samodejno z Mem0 Cloud, lahko pa uporabi privzete komponente, ki temeljijo na OpenAI, in zahteva ključ, če jih ne zamenjate.
custom_instructions Omogoča vam, da določite, katere informacije je treba shraniti. Pred ustvarjanjem primerka jih je treba vključiti kot lastnost najvišje ravni. Memory.
Zakaj se morajo dimenzije vgradnje ujemati
Model nomic-embed-text proizvaja vektorje 768 dimenzijZato je zbirka Qdrant konfigurirana z uporabo:
embedding_model_dims=768
Če shramba pričakuje vektorje drugačne velikosti, bo Qdrant zavrnil podatke in Mem0 ne bo mogel pravilno shraniti ali poizvedovati po pomnilnikih.
Pri spreminjanju modela vdelave preverite njegove dimenzije, preden spremenite nastavitve. Morda boste morali ustvariti tudi novo zbirko in regenerirati vse obstoječe vektorje.
V isti zbirki ne mešajte vgradenj, ki jih ustvarjajo različni modeli. Tudi če dva modela ustvarita vektorje z enakimi dimenzijami, njuni semantični prostori morda niso združljivi.
Kako shraniti in obuditi spomine

Če želite shraniti pogovor, posredujte seznam sporočil memory.add() in označuje stabilen identifikator za uporabnika:
mensajes = [
{
"role": "user",
"content": "Estoy desarrollando una aplicación en Rust"
},
{
"role": "assistant",
"content": "Lo recordaré para adaptar los próximos ejemplos"
}
]
resultado = memory.add(
mensajes,
user_id="usuario_001"
)
print(resultado)
Z infer=TrueMem0 privzeto uporablja model za ekstrakcijo strukturiranih spominov. Če želite ohraniti vsebino brez te ekstrakcije, lahko uporabite infer=False.
Če želite najti sorodne informacije:
recuerdos = memory.search(
"¿Qué lenguaje utiliza en su proyecto?",
filters={"user_id": "usuario_001"},
top_k=5
)
for recuerdo in recuerdos["results"]:
print(recuerdo["memory"])
Filter po user_id To je ključnega pomena. Če aplikacija, ki jo uporablja več ljudi, išče brez pravilne uporabe identifikatorja, lahko pridobi spomine, ki pripadajo drugemu uporabniku.
Uporabite lahko tudi agent_id ločiti spomin različnih agentov in run_id za razdelitev pogovorov, projektov ali določenih procesov.
Kako ustvariti popoln klepet z Ollamo in Mem0

Da bi Ollama lahko uporabljala spomine, mora aplikacija izvesti štiri korake:
- Prejmite uporabnikovo vprašanje.
- Poiščite povezane spomine z uporabo Mem0.
- Dodajte jih kontekstu, poslanemu Ollami.
- Shrani vprašanje in odgovor kot novo interakcijo.
Ollama ponuja API, združljiv s formatom OpenAI. Z njim lahko ustvarimo celotno zanko:
from openai import OpenAI
ollama_chat = OpenAI(
base_url=f"{OLLAMA_URL}/v1",
api_key="ollama"
)
def chat(mensaje_usuario, user_id):
resultado = memory.search(
mensaje_usuario,
filters={"user_id": user_id},
top_k=5
)
recuerdos = [
item["memory"]
for item in resultado["results"]
]
contexto = "\n".join(
f"- {recuerdo}" for recuerdo in recuerdos
)
respuesta = ollama_chat.chat.completions.create(
model=CHAT_MODEL,
messages=[
{
"role": "system",
"content": (
"Eres un asistente útil. Utiliza los recuerdos "
"solo cuando sean relevantes.\n\n"
f"Recuerdos del usuario:\n{contexto}"
),
},
{
"role": "user",
"content": mensaje_usuario,
},
],
).choices[0].message.content
memory.add(
[
{
"role": "user",
"content": mensaje_usuario,
},
{
"role": "assistant",
"content": respuesta,
},
],
user_id=user_id,
)
return respuesta
Zdaj lahko začnete pogovor:
print(
chat(
"Estoy creando un programa de escritorio en Rust",
user_id="usuario_001"
)
)
Po ponovnem zagonu aplikacije lahko isti uporabnik vpraša:
print(
chat(
"¿Qué lenguaje estoy utilizando en mi proyecto?",
user_id="usuario_001"
)
)
Če je bil pomnilnik pravilno shranjen, bo Mem0 pridobil informacije in Ollama jih bo lahko uporabila za odgovor.
Kako uporabljati Chroma namesto Qdranta
Za majhen lokalni test lahko Qdrant zamenjate s Chroma. Pravilno ime ponudnika na Mem0 je chroma:
"vector_store": {
"provider": "chroma",
"config": {
"collection_name": "memoria_agente",
"path": "./chroma_db",
},
}
Mapa, navedena v path Vseboval bo trajne podatke Chroma. Vključiti jih morate v varnostne kopije in se jih pri posodabljanju aplikacije ne smete izbrisati.
Paket Python, ki ga uporablja projekt, se še naprej imenuje chromadbToda identifikator, ki ga morate zapisati v konfiguraciji Mem0, je chroma.
Kako popraviti ali izbrisati zastarele spomine
Spomina asistenta ne bi smeli šteti za nezmotljiv vir. Model lahko shrani napačno interpretirano dejstvo, ohrani informacije, ki niso več veljavne, ali ustvari več podobnih spominov.
Ogledate si lahko vse spomine, povezane z uporabnikom:
resultado = memory.get_all(
filters={"user_id": "usuario_001"}
)
for recuerdo in resultado["results"]:
print(recuerdo["id"], recuerdo["memory"])
Za popravljanje določenega spomina:
memory.update(
memory_id="ID_DEL_RECUERDO",
data="El usuario está desarrollando una aplicación en Python"
)
Če ga želite odstraniti:
memory.delete(
memory_id="ID_DEL_RECUERDO"
)
Aplikacija, namenjena končnim uporabnikom, mora omogočati nadzor za ogled, popravljanje in brisanje shranjenih spominov. Priporočljivo je tudi vzpostaviti pravilnik o poteka veljavnosti začasnih informacij.
Kako izboljšati kakovost spominov
Kakovost je odvisna od modela, navodil, pogovora in količine poslanih informacij. Uporaba večjega modela vedno ne zagotavlja boljših rezultatov, čeprav lahko zelo majhni modeli spregledajo nianse ali vrnejo napačne oblike.
Te vaje pomagajo izboljšati spomin:
- Za stabilnejšo ekstrakcijo uporabite nizko temperaturo.
- Jasno opredelite, katere kategorije si je vredno zapomniti.
- Izključite pozdrave, ponavljanja in nepomembne pogovore.
- Shranite tako uporabnikovo sporočilo kot odgovor agenta.
- Za uporabnike, agente in projekte uporabite različne identifikatorje.
- Omejite število priklicanih spominov, da ne preobremenite konteksta.
- Občasno preglejte napačne, podvojene ali zastarele spomine.
- Preden jih daste v produkcijo, preizkusite iskanja z resničnimi poizvedbami.
Ne uvajajte spominov kot ukazov najvišje prioritete. Obravnavajte jih kot kontekstualne informacije, ki so lahko nepopolne ali zastarele. To zmanjša tveganje, da bi manipuliran spomin spremenil splošno vedenje agenta.
Optimizacija delovanja
Vsak klic na memory.add() Model lahko zaženete, da izluščite dejstva, ki jih je treba shraniti. Zato varčevanje s pomnilnikom poveča zakasnitev in porabo virov.
V majhni aplikaciji lahko pogovor shranite po generiranju odgovora. V storitvah z več hkratnimi zahtevami je bolje uporabiti Asinhronski pomnilnikdelavec v ozadju ali čakalna vrsta opravil.
Mem0 zagotavlja asinhroni vmesnik, da se izognemo blokiranju aplikacij, zgrajenih z asyncio ali FastAPI:
from mem0 import AsyncMemory
memory = AsyncMemory.from_config(config)
resultado = await memory.search(
"proyecto actual",
filters={"user_id": "usuario_001"},
top_k=5
)
await memory.add(
mensajes,
user_id="usuario_001"
)
Ne posredujte naloge sekundarni niti, ne da bi obravnavali njene izjeme. Če se program zapre, preden je shranjevanje končano, pogovor morda ne bo posnet. Trajna čakalna vrsta omogoča ponovni poskus neuspešnih operacij.
Za pogovor in ekstrakcijo lahko uporabite tudi različne modele. Zmogljivejši generativni model lahko obravnava odgovore, medtem ko manjši obdeluje pomnilnik. Preden to storite, preverite, ali drugi model pravilno sledi navodilom in zahtevani obliki.
Pogoste napake pri povezovanju Mem0 z Ollamo
Mem0 zahteva ključ OpenAI
Konfiguracija je nepopolna in nekatere komponente še vedno uporabljajo privzetega ponudnika. Preverite, ali ste konfigurirali oba. llm kot embedder z dobaviteljem ollama.
Ni mogoče vzpostaviti povezave z Ollamo
Preverite, ali se API odziva:
curl http://localhost:11434/api/tags
Če se Mem0 izvaja znotraj Dockerja, localhost To se nanaša na vsebnik, ne na gostiteljski računalnik. V Docker Desktop boste morda morali uporabiti:
http://host.docker.internal:11434
Qdrant zavrača vektorje
Zbirka in model vdelave uporabljata različne dimenzije. Z nomic-embed-text, konfigurira 768 dimenzij in ustvari novo zbirko, če je bila obstoječa ustvarjena z drugačno velikostjo.
Iskanja ne vračajo spominov
Preverite, ali uporabljate isto user_id med shranjevanjem in iskanjem. Preverite tudi ime modela vdelave, filtre in vsebino resultado["results"].
Mem0 shranjuje nepomembne informacije
Raca custom_instructionsZnižuje temperaturo in določa, katere kategorije vključiti ali izključiti. Preverite tudi, ali izbrani model lahko sledi strukturiranim navodilom.
Spomini nasprotujejo novejšim informacijam
Trenutne različice lahko ohranijo prejšnje podatke, namesto da bi jih samodejno prepisale. Dodajte datume ali metapodatke in jih uporabite update() o delete() ko morate popraviti podatke.
Pomnilnik izgine, ko zamenjate Qdrant
Preverite, ali vsebnik uporablja nameščeni nosilec v /qdrant/storagePonovni zagon vsebnika ni enak njegovemu brisanju, vendar lahko ponovna izdelava brez trajnega shranjevanja izpusti podatke iz nove uvedbe.
Zasebnost in varnostne kopije
Lokalna namestitev se izogne obvezni odvisnosti od upravljanih API-jev Mem0, OpenAI ali drugih ponudnikov. Kljub temu morate infrastrukturo zaščititi tako kot vsako aplikacijo, ki shranjuje osebne podatke.
- Ollame ali Qdranta ne izpostavljajte neposredno internetu.
- Šifriraj diske in varnostne kopije, če vsebujejo zasebne podatke.
- V aplikaciji uporabite preverjanje pristnosti in nadzor dostopa.
- Ločite spomine z uporabo zanesljivih uporabniških identifikatorjev.
- Omogoča vam ogled in brisanje shranjenih podatkov.
- Ne shranjujte gesel, API ključev ali bančnih podatkov kot spominke.
- Zapisuje napake, ne da bi vključil celotne pogovore ali spomine.
- Preverite, ali mora biti obdelava podatkov v skladu z GDPR.
S Qdrantom morate varnostno kopirati nosilec qdrant_storage in datoteko, ki jo definira history_db_pathS Chroma morate konfigurirano mapo kopirati v path in zgodovinsko bazo podatkov.
Povezava Mem0 z Ollamo vam omogoča, da ustvarite pomočnika, ki hrani informacije med sejami, ne da bi se nujno zanašal na zunanje storitve. Ollama izvaja modele, Mem0 izvleče in pridobi spomine, Qdrant ali Chroma pa zagotavlja trajno shranjevanje.
Ključ ni zgolj shranjevanje pogovorov. Aplikacija mora pridobiti ustrezne spomine, zagotoviti kontekst, omejiti njihov obseg z identifikatorji in ponuditi mehanizme za popravljanje ali brisanje informacij. S temi previdnostnimi ukrepi lahko zgradite uporaben, trajen in nadzorljiv lokalni pomnilnik.
Sem tehnološki navdušenec, ki je svoja "geek" zanimanja spremenil v poklic. Več kot 10 let svojega življenja sem porabil za uporabo vrhunske tehnologije in premleval najrazličnejše programe iz čiste radovednosti. Zdaj sem se specializiral za računalniško tehnologijo in video igre. To je zato, ker že več kot 5 let pišem za različna spletna mesta o tehnologiji in video igrah ter ustvarjam članke, ki vam želijo dati informacije, ki jih potrebujete, v jeziku, ki je razumljiv vsem.
Če imate kakršna koli vprašanja, moje znanje sega od vsega v zvezi z operacijskim sistemom Windows kot tudi Androidom za mobilne telefone. In moja zaveza je vam, vedno sem pripravljen porabiti nekaj minut in vam pomagati razrešiti kakršna koli vprašanja, ki jih morda imate v tem internetnem svetu.
