构建本地AI代理:模型、内存与编排实用指南 | 知著![]() ollama pull qwen3:8b ollama pull nomic-embed-text ![]() _orig_ollama_chat = ollama.chat def _no_think_chat(*args, **kwargs): opts = kwargs.get("options") or {} if isinstance(opts, dict): opts.setdefault("think", False) kwargs["options"] = opts return _orig_ollama_chat(*args, **kwargs) ollama.chat = _no_think_chat name: local-ai-assistant description: Local AI coding assistant with persistent memory command-dispatch: tool command-tool: exec command-arg-mode: raw - ![]() try: resp = ollama.chat( model=OLLAMA_CHAT_MODEL, messages=[{"role": "user", "content": INTENT_PROMPT.format(message=message)}], options={"temperature": 0, "num_predict": 1024}, ) return extract_json(resp["message"]["content"]) except Exception: return keyword_intent_fallback(message) ![]() config = { "llm": { "provider": "ollama", "config": {"model": "qwen3:8b", "ollama_base_url": "http://localhost:11434"}, }, "embedder": { "provider": "ollama", "config": {"model": "nomic-embed-text", "ollama_base_url": "http://localhost:11434"}, }, "vector_store": { "provider": "qdrant", "config": {"host": "localhost", "port": 6333, "embedding_model_dims": 768}, }, } memory = Memory.from_config(config) memory.add("I always use type hints and pytest", user_id="dev") results = memory.search("write a utility function", user_id="dev") response = ollama.chat( model=OLLAMA_CHAT_MODEL, messages=[{"role": "user", "content": SMART_MEMORY_PROMPT.format( user_message=user_message )}], options={"temperature": 0, "num_predict": 512}, ) data = self._extract_json_robust(response["message"]["content"]) return bool(data.get("worth_storing", False)) - "I prefer TypeScript over JavaScript" - "I use pytest, never unittest" - "Always use Google-style docstrings" LOW-VALUE (discard): - "What does enumerate() do?" - "Write a retry decorator" - "Thanks" docker run -d - name qdrant-local -p 6333:6333 \ -v $(pwd)/qdrant_storage:/qdrant/storage qdrant/qdrant ![]() "provider": "qdrant", "config": { "collection_name": "coding_assistant", "host": "localhost", "port": 6333, "embedding_model_dims": 768, # must match your embedding model exactly }, } ![]() │ Framework: OpenClaw - tool-dispatch, SKILL.md routing │ LLM: Ollama for qwen3:8b (think mode disabled for JSON reliability) │ Memory: Structured persistent memory with value filtering Embeddings via nomic-embed-text │ Storage: Chroma (zero infrastructure) or Qdrant (more robust) 本文源于数据驱动智能,仅供交流学习! ![]() |