| import sys |
| sys.path.append("../") |
| from bw_utils import * |
| from modules.embedding import get_embedding_model |
| from langchain_experimental.generative_agents import GenerativeAgentMemory |
| from langchain.retrievers import TimeWeightedVectorStoreRetriever |
| from langchain_community.embeddings import HuggingFaceEmbeddings |
| from langchain_community.llms import Tongyi,OpenAI |
| from langchain_community.docstore import InMemoryDocstore |
| from langchain_community.vectorstores import FAISS |
| import faiss |
| import math |
|
|
| def build_role_agent_memory(type = "ga",**kwargs): |
| if type == "ga": |
| llm_name = kwargs["llm_name"] |
| embedding_name = kwargs["embedding_name"] |
| db_name = kwargs["db_name"] |
| language = kwargs["language"] if "language" in kwargs else "" |
| embedding_model = get_embedding_model(embedding_name,language) |
| index = faiss.IndexFlatL2(len(embedding_model.embed_query("hello world"))) |
| vectorstore = FAISS( |
| embedding_function=embedding_model, |
| index=index, |
| docstore=InMemoryDocstore(), |
| index_to_docstore_id={}, |
| ) |
| memory_retriever = TimeWeightedVectorStoreRetriever(vectorstore=vectorstore, other_score_keys=["importance"], k=5) |
| if llm_name.startswith("qwen"): |
| chat_model = Tongyi( |
| temperature=0.9, |
| ) |
| else: |
| chat_model = OpenAI( |
| temperature=0.9, |
| model="gpt-3.5-turbo", |
| ) |
| agent_memory = RoleMemory_GA( |
| llm=chat_model, |
| memory_retriever=memory_retriever, |
| embedding_model=embedding_model, |
| memory_decay_rate=0.01 |
| |
| ) |
| return agent_memory |
| |
| else: |
| db_name = kwargs["db_name"] |
| embedding = kwargs["embedding"] |
| db_type = kwargs["db_type"] if "db_type" in kwargs else "chromadb" |
| capacity= kwargs["capacity"] if "capacity" in kwargs else 5 |
| agent_memory = RoleMemory(db_name=db_name, |
| embedding=embedding, |
| db_type=db_type, |
| capacity=capacity) |
| return agent_memory |
| |
| def relevance_score_fn(score: float) -> float: |
| return 1.0 - score / math.sqrt(2) |
|
|
| class RoleMemory_GA(GenerativeAgentMemory): |
| def init_from_data(self,data): |
| for text in data: |
| self.add_record(text) |
| |
| def add_record(self,text): |
| self.add_memory(text) |
| |
| def search(self,query,top_k): |
| fetched_memories = [doc.page_content for doc in self.fetch_memories(query)[:top_k]] |
| if len(fetched_memories)>=top_k: |
| print("-Memory Searching...") |
| print(fetched_memories) |
| return fetched_memories |
| |
| def delete_record(self, idx): |
| pass |
|
|
|
|
| class RoleMemory: |
| def __init__(self,db_name,embedding,db_type = "chroma",capacity = 5,) -> None: |
| self.idx = 0 |
| self.capacity = capacity |
| self.db_name = db_name |
| self.db = build_db([],db_name,db_type,embedding,save_type="temporary") |
| |
| def init_from_data(self,data): |
| for text in data: |
| self.add_record(text) |
| |
| def add_record(self,text): |
| self.idx += 1 |
| self.db.add(text, str(self.idx), db_name=self.db_name) |
| |
| def search(self,query,top_k): |
| return self.db.search(query, top_k,self.db_name) |
| |
| def delete_record(self, idx): |
| self.db.delete(idx) |
| |
| @property |
| def len(self): |
| return self.db.len |
|
|
|
|
|
|