伙伴型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 伙伴库。

相关文章
|
6月前
|
人工智能 JSON 安全
Claude Code插件系统:重塑AI辅助编程的工作流
Anthropic为Claude Code推出插件系统与市场,支持斜杠命令、子代理、MCP服务器等功能模块,实现工作流自动化与团队协作标准化。开发者可封装常用工具或知识为插件,一键共享复用,构建个性化AI编程环境,推动AI助手从工具迈向生态化平台。
1783 1
|
人工智能 Java API
支持 40+ 插件,Spring AI Alibaba 简化智能体私有数据集成
通过使用社区官方提供的超过 20 种 RAG 数据源和 20 种 Tool Calling 接口,开发者可以轻松接入多种外部数据源(如 GitHub、飞书、云 OSS 等)以及调用各种工具(如天气预报、地图导航、翻译服务等)。这些默认实现大大简化了智能体的开发过程,使得开发者无需从零开始,便可以快速构建功能强大的智能体系统。通过这种方式,智能体不仅能够高效处理复杂任务,还能适应各种应用场景,提供更加智能、精准的服务。
1878 104
|
9月前
|
机器学习/深度学习 人工智能 文字识别
浏览器AI模型插件下载,支持chatgpt、claude、grok、gemini、DeepSeek等顶尖AI模型!
极客侧边栏是一款浏览器插件,集成ChatGPT、Claude、Grok、Gemini等全球顶尖AI模型,支持网页提问、文档分析、图片生成、智能截图、内容总结等功能。无需切换页面,办公写作效率倍增。内置书签云同步与智能整理功能,管理更高效。跨平台使用,安全便捷,是AI时代必备工具!
709 8
|
9月前
|
消息中间件 人工智能 机器人
vx自动回复机器人,ai自动回复机器人,微信自动回复脚本插件
这个微信自动回复机器人包含主程序、配置管理、工具函数和单元测试模块。主程序使用itchat库实现微信登录和消息处理
|
9月前
|
人工智能 小程序 开发者
AI运动识别插件版本再发布迭代更新,大量新特性更新
上周,我们对全景AI运动解决方案的uni APP版与小程序版插件进行了新一版迭代更新。其中,uni APP版本显著提升了识别检测性能,修复了已知问题,并新增多项实用功能,全面优化用户体验。在v0.7.0版本中,推出了`convertFrameToBase64()`接口,便于开发者在体测、赛事等场景中更高效地处理帧图像,简化开发流程,助力AI运动应用快速实现。
|
11月前
|
人工智能 程序员
我的通义灵码插件没有AI程序员选项了
通义灵码插件没有AI程序员选项了
|
人工智能 IDE 编译器
idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡
idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡
3164 15
idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡
|
人工智能 Java 测试技术
Blackbox.Ai体验:AI编程插件如何提升开发效率
Blackbox.ai 是一款广受好评的AI集成平台,汇聚了多个知名AI助手,如deepseek-R1、ChatGPT-4o等,并深度集成到VSCode中。用户无需频繁上传文件,直接在编辑器内与AI对话,极大提升了开发效率。其特色功能包括自动化网页生成、代码翻译和测试用例自动生成。无论是代码生成、翻译还是审查,Blackbox.ai都能高效智能地完成任务,成为开发者不可或缺的得力工具。现可免费试用90天高级模型,官网:&lt;https://www.blackbox.ai/&gt;。
1054 14
下一篇
开通oss服务