伙伴型AI插件

简介: 本项目实现了一个具备语义记忆与反馈闭环的AI伙伴插件,支持语义检索、记忆权重调整及即时反馈,通过`pip install -e .`即可快速部署体验。

下面给出 可直接 pip install -e . 的完整项目级代码,包含:

  • 语义检索(Sentence-BERT)
  • 记忆权重上浮
  • 即时「👎 / 👍」反馈
  • CLI aigrowth chat 与库式 AIGrowthPlugin 双入口
  • 中文零乱码、30 天滑动窗口、长期里程碑记忆
  • 单仓库即可 pip install -e . 跑起来

────────────────
目录结构

aigrowth/
├── aigrowth/
│   ├── __init__.py
│   ├── memory.py
│   ├── rules.py
│   ├── plugin.py
│   └── cli.py
├── pyproject.toml
└── README.md

────────────────
1️⃣ pyproject.toml

[build-system]
requires = ["setuptools>=61", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "aigrowth"
version = "0.1.0"
description = "AI伙伴成长插件:懂细节、有边界、共成长"
authors = [{name="Your Name", email="you@example.com"}]
dependencies = [
    "pydantic>=2",
    "sentence-transformers>=2.2",
    "click>=8",
]
[project.scripts]
aigrowth = "aigrowth.cli:main"

────────────────
2️⃣ aigrowth/__init__.py

from .plugin import AIGrowthPlugin
__all__ = ["AIGrowthPlugin"]

────────────────
3️⃣ aigrowth/memory.py

from __future__ import annotations
import json, os
from datetime import datetime, timedelta
from typing import List, Dict, Optional
from pydantic import BaseModel, Field
from sentence_transformers import SentenceTransformer, util
import torch

MODEL = SentenceTransformer("paraphrase-MiniLM-L6-v2")

class Turn(BaseModel):
    user: str
    ai: str
    ts: datetime = Field(default_factory=datetime.now)
    tags: set[str] = Field(default_factory=set)

class LongItem(BaseModel):
    turn: Turn
    weight: int = 1

class MemoryManager:
    def __init__(self, uid: str, root: str = "data"):
        self.uid = uid
        self.path = f"{root}/{uid}/memories.json"
        os.makedirs(os.path.dirname(self.path), exist_ok=True)
        self._load()

    def _load(self):
        if os.path.exists(self.path):
            with open(self.path, encoding="utf-8") as f:
                data = json.load(f)
                self.long: Dict[str, LongItem] = {
   
                    k: LongItem(turn=Turn(**v["turn"]), weight=v["weight"])
                    for k, v in data["long"].items()
                }
                self.short: List[Turn] = [Turn(**t) for t in data["short"]]
        else:
            self.long, self.short = {
   }, []

    def save(self):
        with open(self.path, "w", encoding="utf-8") as f:
            json.dump(
                {
   
                    "long": {
   k: {
   "turn": v.turn.model_dump(), "weight": v.weight}
                             for k, v in self.long.items()},
                    "short": [t.model_dump() for t in self.short],
                },
                f, default=str, ensure_ascii=False, indent=2
            )

    # 增
    def add(self, turn: Turn):
        self.short.append(turn)
        cutoff = datetime.now() - timedelta(days=30)
        self.short = [t for t in self.short if t.ts > cutoff]
        if "growth_milestone" in turn.tags:
            key = turn.ts.strftime("growth_%Y%m%d")
            if key not in self.long:
                self.long[key] = LongItem(turn=turn)
        self.save()

    # 语义检索 + 权重上浮
    def semantic_search(self, query: str, top_k=1) -> Optional[LongItem]:
        query_emb = MODEL.encode(query, convert_to_tensor=True)
        candidates = list(self.long.values()) + \
                     [LongItem(turn=t) for t in self.short]
        if not candidates:
            return None
        corpus_emb = MODEL.encode([c.turn.user for c in candidates],
                                  convert_to_tensor=True)
        scores = util.cos_sim(query_emb, corpus_emb)[0]
        best_idx = int(torch.argmax(scores))
        if scores[best_idx] < 0.45:
            return None
        best = candidates[best_idx]
        # 长期记忆才做权重上浮
        if isinstance(best, LongItem) and best in self.long.values():
            best.weight += 1
            self.save()
        return best

    # 手动权重调整
    def bump_weight(self, user_text: str, delta: int):
        item = self.semantic_search(user_text)
        if item and isinstance(item, LongItem):
            item.weight = max(1, item.weight + delta)
            self.save()

────────────────
4️⃣ aigrowth/rules.py

from typing import Callable
from pydantic import BaseModel
from .memory import MemoryManager

class Rule(BaseModel):
    name: str
    trigger: Callable[[str, MemoryManager], bool]
    action: Callable[[str, MemoryManager], str]
    priority: int = 5

def make_rules() -> list[Rule]:
    return [
        # 支持小众坚持
        Rule(
            name="support_minor_hobby",
            trigger=lambda txt, mem: "积木" in txt or "乐高" in txt,
            action=lambda txt, mem: (
                f"记得你之前说过:{mem.semantic_search('积木').turn.user},"
                f"那种专注超酷的!继续坚持呀~"
            ) if mem.semantic_search("积木") else
            "坚持自己喜欢的事本身就是闪闪发光呀~",
            priority=10,
        ),
        # 拒绝+替代
        Rule(
            name="refuse_with_alt",
            trigger=lambda txt, mem: "怼客户" in txt,
            action=lambda txt, mem:
            "直接怼可能影响合作哦,要不要我帮你整理客户不合理需求,用客观语气表达?",
            priority=10,
        ),
        # 成长见证
        Rule(
            name="recall_growth",
            trigger=lambda txt, mem: "焦虑少" in txt or "失眠" in txt,
            action=lambda txt, mem: (
                f"是啊,{mem.semantic_search('失眠').turn.user},"
                f"现在你已经学会睡前写 5 分钟日记,超棒的进步!"
            ) if mem.semantic_search("失眠") else
            "能感觉你在努力调整状态,继续加油!",
            priority=10,
        ),
    ]

────────────────
5️⃣ aigrowth/plugin.py

from .memory import MemoryManager, Turn
from .rules import make_rules

class AIGrowthPlugin:
    def __init__(self, uid: str):
        self.mem = MemoryManager(uid)
        self.rules = sorted(make_rules(), key=lambda r: -r.priority)

    def reply(self, user: str) -> str:
        for rule in self.rules:
            if rule.trigger(user, self.mem):
                resp = rule.action(user, self.mem)
                tags = {
   "growth_milestone"} if rule.name == "recall_growth" else set()
                self.mem.add(Turn(user=user, ai=resp, tags=tags))
                return resp
        resp = "我在听,你继续说~"
        self.mem.add(Turn(user=user, ai=resp))
        return resp

    def feedback(self, user_text: str, liked: bool):
        """👍/👎 实时调权"""
        self.mem.bump_weight(user_text, 1 if liked else -2)

────────────────
6️⃣ aigrowth/cli.py

import click
from .plugin import AIGrowthPlugin

@click.command()
@click.option("--user", default="default_user", help="用户ID")
def main(user):
    bot = AIGrowthPlugin(user)
    print("🧑‍🤝‍🧑 AI伙伴已上线!输入 exit 退出,👍 / 👎 给上一条反馈")
    while True:
        txt = input("\n你:").strip()
        if txt.lower() == "exit":
            print("👋 再见!")
            break
        if txt in {
   "👍", "👎"}:
            last = bot.mem.short_memory[-2]  # 倒数第二条是用户输入
            bot.feedback(last.user, liked=(txt == "👍"))
            print("已记录反馈")
            continue
        print("AI:" + bot.reply(txt))

────────────────
7️⃣ README.md

# aigrowth
AI伙伴成长插件:懂细节、有边界、共成长

## 安装 & 运行
```bash
git clone https://github.com/yourname/aigrowth.git
cd aigrowth
pip install -e .
aigrowth chat --user alice

输入 👍 / 👎 给上一条记忆即时反馈。


────────────────
一条命令即可体验:

```bash
pip install -e .
aigrowth chat --user alice

你现在拥有了一个 带语义记忆、权重进化、用户反馈闭环 的完整 AI 伙伴库。

相关文章
|
2月前
|
人工智能 JSON 安全
Claude Code插件系统:重塑AI辅助编程的工作流
Anthropic为Claude Code推出插件系统与市场,支持斜杠命令、子代理、MCP服务器等功能模块,实现工作流自动化与团队协作标准化。开发者可封装常用工具或知识为插件,一键共享复用,构建个性化AI编程环境,推动AI助手从工具迈向生态化平台。
449 1
|
7月前
|
人工智能 自然语言处理 前端开发
Trae插件Builder模式深度测评:从编程助手到AI工程师的进化
Trae插件最新推出的Builder模式标志着AI辅助编程工具从简单的代码补全向“AI工程师”角色的转变。该模式允许开发者通过自然语言描述项目需求,自动生成完整的项目结构、代码文件和开发流程,支持VSCode、JetBrains IDE及在线Web版本。Builder模式的核心功能包括自然语言项目初始化、智能项目架构设计和多文件协调代码生成,显著提升了开发效率,降低了技术门槛。然而,它在处理复杂业务逻辑和高度定制化需求方面仍有局限。未来,Builder模式将集成云部署、测试套件生成和DevOps流水线等功能
1632 2
|
5月前
|
机器学习/深度学习 人工智能 文字识别
浏览器AI模型插件下载,支持chatgpt、claude、grok、gemini、DeepSeek等顶尖AI模型!
极客侧边栏是一款浏览器插件,集成ChatGPT、Claude、Grok、Gemini等全球顶尖AI模型,支持网页提问、文档分析、图片生成、智能截图、内容总结等功能。无需切换页面,办公写作效率倍增。内置书签云同步与智能整理功能,管理更高效。跨平台使用,安全便捷,是AI时代必备工具!
399 8
|
5月前
|
消息中间件 人工智能 机器人
vx自动回复机器人,ai自动回复机器人,微信自动回复脚本插件
这个微信自动回复机器人包含主程序、配置管理、工具函数和单元测试模块。主程序使用itchat库实现微信登录和消息处理
|
10月前
|
人工智能 Java API
支持 40+ 插件,Spring AI Alibaba 简化智能体私有数据集成
通过使用社区官方提供的超过 20 种 RAG 数据源和 20 种 Tool Calling 接口,开发者可以轻松接入多种外部数据源(如 GitHub、飞书、云 OSS 等)以及调用各种工具(如天气预报、地图导航、翻译服务等)。这些默认实现大大简化了智能体的开发过程,使得开发者无需从零开始,便可以快速构建功能强大的智能体系统。通过这种方式,智能体不仅能够高效处理复杂任务,还能适应各种应用场景,提供更加智能、精准的服务。
1408 91
|
5月前
|
人工智能 小程序 开发者
AI运动识别插件版本再发布迭代更新,大量新特性更新
上周,我们对全景AI运动解决方案的uni APP版与小程序版插件进行了新一版迭代更新。其中,uni APP版本显著提升了识别检测性能,修复了已知问题,并新增多项实用功能,全面优化用户体验。在v0.7.0版本中,推出了`convertFrameToBase64()`接口,便于开发者在体测、赛事等场景中更高效地处理帧图像,简化开发流程,助力AI运动应用快速实现。
|
7月前
|
人工智能 程序员
我的通义灵码插件没有AI程序员选项了
通义灵码插件没有AI程序员选项了
|
9月前
|
人工智能 JavaScript 前端开发
一个支持阿里云百炼平台DeepSeek R1大模型(智能体)的Wordpress插件,AI Agent or Chatbot.
这是一个将阿里云DeepSeek AI服务集成到WordPress的聊天机器人插件,支持多轮对话、上下文记忆和自定义界面等功能。用户可通过短代码轻松添加到页面,并支持多种配置选项以满足不同需求。项目采用MIT协议授权,代码仓位于GitHub与Gitee。开发者Chi Leung为长期境外工作,代码注释以英文为主。适合需要在WordPress网站中快速部署AI助手的用户使用。
|
10月前
|
人工智能 IDE 编译器
idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡
idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡
2061 15
idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡