diff --git a/test/agents/metagpt/role_2_streamlit_prompt.py b/test/agents/metagpt/role_2_streamlit_prompt.py index 2043edf..b283add 100644 --- a/test/agents/metagpt/role_2_streamlit_prompt.py +++ b/test/agents/metagpt/role_2_streamlit_prompt.py @@ -80,7 +80,7 @@ class stylize(Action): 请用自己的语气改写{instruction} """ - name: str = "rerask" + name: str = "stylize" async def run(self, instruction: str): prompt = self.PROMPT_TEMPLATE.format(instruction=instruction) diff --git a/test/agents/metagpt/role_3_streamlit_prompt.py b/test/agents/metagpt/role_3_streamlit_prompt.py index c30a3df..0738361 100644 --- a/test/agents/metagpt/role_3_streamlit_prompt.py +++ b/test/agents/metagpt/role_3_streamlit_prompt.py @@ -9,7 +9,10 @@ import json from typing import Optional from tianji.utils.json_from import SharedDataSingleton -from tianji.utils.knowledge_tool import get_docs_list_query_openai +from tianji.utils.knowledge_tool import ( + get_docs_list_query_openai, + get_docs_list_query_zhipuai, +) from tianji.utils.common_llm_api import LLMApi from tianji.agents.metagpt_agents.ruyi_agent import ruyi from tianji.agents.metagpt_agents.qianbianzhe_agent import qianbianzhe @@ -45,7 +48,7 @@ async def run(self, instruction: str): dict ] = SharedDataSingleton.get_instance().json_from_data knowledge_key = json_from_data["festival"] + json_from_data["requirement"] - knowledge = get_docs_list_query_openai( + knowledge = get_docs_list_query_zhipuai( query_str=knowledge_key, loader_file_path=KNOWLEDGE_PATH, persist_directory=SAVE_PATH, diff --git a/test/knowledges/test_get_docs_list_query.py b/test/knowledges/test_get_docs_list_query.py index dc0770d..c3615ef 100644 --- a/test/knowledges/test_get_docs_list_query.py +++ b/test/knowledges/test_get_docs_list_query.py @@ -1,17 +1,25 @@ import tianji.utils.knowledge_tool as knowledgetool from dotenv import load_dotenv + load_dotenv() -KNOWLEDGE_PATH = r"D:\1-wsl\TIANJI\Tianji\tianji\knowledges\04-Wishes\knowledges.txt" -SAVE_PATH = r"D:\1-wsl\TIANJI\Tianji\temp" +# KNOWLEDGE_PATH = r"D:\1-wsl\TIANJI\Tianji\tianji\knowledges\04-Wishes\knowledges.txt" +# SAVE_PATH = r"D:\1-wsl\TIANJI\Tianji\temp" + +KNOWLEDGE_PATH = r"/Users/fengzetao/Workspace/Github/SocialAI/Tianji/tianji/knowledges/04-Wishes/knowledges.txt" +SAVE_PATH = r"/Users/fengzetao/Workspace/Github/SocialAI/Tianji/temp" -# doclist = knowledgetool.get_docs_list_query_zhipu(query_str="春节",loader_file_path=KNOWLEDGE_PATH, \ +# doclist = knowledgetool.get_docs_list_query_openai(query_str="春节",loader_file_path=KNOWLEDGE_PATH, \ # persist_directory = SAVE_PATH,k_num=5) -doclist = knowledgetool.get_docs_list_query_openai(query_str="春节",loader_file_path=KNOWLEDGE_PATH, \ - persist_directory = SAVE_PATH,k_num=5) +doclist = knowledgetool.get_docs_list_query_zhipuai( + query_str="春节", + loader_file_path=KNOWLEDGE_PATH, + persist_directory=SAVE_PATH, + k_num=5, +) if doclist is not []: print(doclist) else: - print("doclist is [] !") \ No newline at end of file + print("doclist is [] !") diff --git a/tianji/agents/metagpt_agents/qianbianzhe_agent/action.py b/tianji/agents/metagpt_agents/qianbianzhe_agent/action.py index a66e8c6..d6c24c3 100644 --- a/tianji/agents/metagpt_agents/qianbianzhe_agent/action.py +++ b/tianji/agents/metagpt_agents/qianbianzhe_agent/action.py @@ -27,9 +27,9 @@ # "wish": "家庭成员平安" # }w + # 设计思路 给定人设并导入参考聊天话术、历史聊天语料进行聊天。 class ansWrite(Action): - # 这是对json中每个key的解释: # 语言场景(scene),目前的聊天场合,比如工作聚会。 # 节日(festival),对话目前背景所在的节日,比如生日。 @@ -42,7 +42,7 @@ class ansWrite(Action): # 聊天对象爱好(hobby),和role相关,就是聊天对象的兴趣爱好,例如下象棋。 # 聊天对象愿望(wish),和role相关,就是聊天对象目前的愿望是什么,例如果希望家庭成员平安。 - name: str = "read_and_ana" + name: str = "ansWrite" async def run(self, instruction: str): sharedData: Optional[SharedDataSingleton] = SharedDataSingleton.get_instance() @@ -80,8 +80,7 @@ class stylize(Action): 请用自己的语气改写{instruction} """ - def __init__(self, name="rerask", context=None, llm=None): - super().__init__(name, context, llm) + name: str = "stylize" async def run(self, instruction: str): prompt = self.PROMPT_TEMPLATE.format(instruction=instruction) diff --git a/tianji/agents/metagpt_agents/qianbianzhe_agent/role.py b/tianji/agents/metagpt_agents/qianbianzhe_agent/role.py index f53fd77..330f824 100644 --- a/tianji/agents/metagpt_agents/qianbianzhe_agent/role.py +++ b/tianji/agents/metagpt_agents/qianbianzhe_agent/role.py @@ -1,30 +1,36 @@ -from .action import * +from dotenv import load_dotenv + +load_dotenv() + from metagpt.roles import Role from metagpt.schema import Message from metagpt.logs import logger +from .action import ansWrite, stylize + # 千变者 以自己的身份回答问题 class qianbianzhe(Role): name: str = "qianbianzhe" profile: str = "stylize" - + def __init__(self, **kwargs): - super.__init__(**kwargs) - self._init_actions([ansWrite,stylize]) + super().__init__(**kwargs) + self._init_actions([ansWrite, stylize]) self._set_react_mode(react_mode="by_order") async def _act(self) -> Message: logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})") - + todo = self.rc.todo - msg = self.get_memories(k=1)[0] # find the most k recent messagesA + msg = self.get_memories(k=1)[0] # find the most k recent messagesA result = await todo.run(msg.content) msg = Message(content=result, role=self.profile, cause_by=type(todo)) self.rc.memory.add(msg) return msg + # async def main(): # # 对话导入 # msg = "test" diff --git a/tianji/agents/metagpt_agents/ruyi_agent/action.py b/tianji/agents/metagpt_agents/ruyi_agent/action.py index 50e9e34..99ef5e9 100644 --- a/tianji/agents/metagpt_agents/ruyi_agent/action.py +++ b/tianji/agents/metagpt_agents/ruyi_agent/action.py @@ -9,7 +9,13 @@ from typing import Optional from metagpt.actions import Action from tianji.utils.json_from import SharedDataSingleton -from tianji.utils.knowledge_tool import get_docs_list_query_openai +from tianji.utils.knowledge_tool import ( + get_docs_list_query_openai, + get_docs_list_query_zhipuai, +) + +KNOWLEDGE_PATH = r"/Users/fengzetao/Workspace/Github/SocialAI/Tianji/tianji/knowledges/04-Wishes/knowledges.txt" +SAVE_PATH = r"/Users/fengzetao/Workspace/Github/SocialAI/Tianji/temp" # 给出针对回答的知识 并用md展示 @@ -35,7 +41,12 @@ async def run(self, instruction: str): # knowledges = "" json_from_data = SharedDataSingleton.get_instance().json_from_data knowledge_key = json_from_data["festival"] + json_from_data["requirement"] - knowledge = get_docs_list_query_openai(query_str=knowledge_key) + knowledge = get_docs_list_query_zhipuai( + query_str=knowledge_key, + loader_file_path=KNOWLEDGE_PATH, + persist_directory=SAVE_PATH, + k_num=5, + ) PROMPT_TEMPLATE: str = f""" 你是一个{json_from_data["festival"]}的祝福大师。 你需要写一段关于如何写{json_from_data["festival"]}{json_from_data["requirement"]}的思路总结。目前了解到这段{json_from_data["festival"]}{json_from_data["requirement"]}是在{json_from_data["scene"]}送给{json_from_data["role"]}的。 @@ -54,4 +65,5 @@ async def run(self, instruction: str): print("回复生成:", rsp) return rsp -# 如何写 如意如意如我心意 \ No newline at end of file + +# 如何写 如意如意如我心意 diff --git a/tianji/agents/metagpt_agents/ruyi_agent/role.py b/tianji/agents/metagpt_agents/ruyi_agent/role.py index 6ac539b..fe42038 100644 --- a/tianji/agents/metagpt_agents/ruyi_agent/role.py +++ b/tianji/agents/metagpt_agents/ruyi_agent/role.py @@ -1,13 +1,13 @@ -from .action import * -from metagpt.actions import Action from metagpt.roles import Role from metagpt.schema import Message from metagpt.logs import logger +from .action import writeMD + class ruyi(Role): name: str = "ruyi" profile: str = "stylize" - + def __init__(self, **kwargs): super().__init__(**kwargs) self._init_actions([writeMD]) @@ -15,12 +15,12 @@ def __init__(self, **kwargs): async def _act(self) -> Message: logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})") - + todo = self.rc.todo - msg = self.get_memories(k=1)[0] # find the most k recent messagesA + msg = self.get_memories(k=1)[0] # find the most k recent messagesA result = await todo.run(msg.content) msg = Message(content=result, role=self.profile, cause_by=type(todo)) self.rc.memory.add(msg) - return msg \ No newline at end of file + return msg diff --git a/tianji/knowledges/04-Wishes/knowledges.txt b/tianji/knowledges/04-Wishes/knowledges.txt index 4718ca9..52c675d 100644 --- a/tianji/knowledges/04-Wishes/knowledges.txt +++ b/tianji/knowledges/04-Wishes/knowledges.txt @@ -75,4 +75,87 @@ 28、元旦到,祝福来报道:大财、小财、意外财,财源滚滚;亲情、爱情、朋友情,份份真情;官运、财运、桃花运,运运亨通;爱人、亲人、家里人,人人平安。 -29、元旦到,祝福来:愿财神把你骚扰,把忧愁收购;愿开心把你套牢,把无聊抛售;愿幸福把你绑架,把烦恼抢走。祝元旦快乐! \ No newline at end of file +29、元旦到,祝福来:愿财神把你骚扰,把忧愁收购;愿开心把你套牢,把无聊抛售;愿幸福把你绑架,把烦恼抢走。祝元旦快乐! + + + +1. 芙蓉入眼,逢秋意绵。祝你见月圆,祝你得心欢,祝你自由如云霓漫天,亦有爱的人常驻身边。在新的一岁,温柔不失果敢,顺遂且平安。 + +2. 愿你在漫长岁月里,一身长久磊落,知世故而天真,风日洒然扶摇直上。 + +3. 我衷心地希望,你的日子里总有光亮,笑起来的时候可以什么都不想。对的要坚持,错的要遗忘。世间山河之广,祝你如愿以偿。 + +4. Happy Birthday祝我的甜妹永远甜!希望你能从小朋友变快乐的大朋友,祝你年年岁岁不挂科,朝朝暮暮有帅哥。年年有今日,岁岁有今朝。 + +5. 愿你平安无疾,前程似锦。希望你能活成自己的模样,无论什么时候都不应该停止努力,愿你能变得更好,也愿你在以后的每一天里,眼中有银河,心中有日月。心想事成,生日快乐! + +6. 祝你生日快乐!不是生日这天快乐,而是到下一个生日之前的每一天都要快乐,然后继续下一个生日快乐!🥰 + +7. 愿你眼神清澈永藏诗歌,手掌温热布满星河。 + +8. 我会在每个有意义的时辰,远隔山海与你共祝。愿你付出甘之如饴,愿你所得归于欢喜。 + +9. 生日快乐🎂愿你﹣-不熬夜不失眠不焦虑,不长痘不脱发不生病,荡尽不平,理想长鸣。 + +10. 生日快乐🎂愿你﹣-柴米油盐,腌渍诗与远方。锅碗瓢盆,盛满琳琅爱意。酸甜苦辣,料理无味时日。亲亲吾爱,可抵山水万难。 + +11. 生日快乐🎂愿你﹣-不管世界怎么糟糕你都不会被打扰,你的路途繁花似锦,你是永远快乐的小姑娘。 + +12. 银河便利店在贩卖星球,我用身上所有的浪漫,买下了一颗最亮的恒星,在你对着蛋糕许愿的时候,向你眼里发射无尽的星光。 + +13. 默念你的名,愿你前途云蒸霞蔚,灿若星河。愿你度过的叫吉时,得到的叫如愿。 + +14. 往后余生暴瘦是你,有钱是你,拥有一切美好的还是你,承蒙相遇,三生有幸,亲爱的,生日快乐! + +15. 愿你在新的一岁里,喜乐安平,热烈坦荡!愿你面对生活万境,无惧无畏,仍做自己! + +16. 生辰吉乐!愿你在新的一年里,岁岁安康,万事如意!愿你面对未来荆棘时,剑斩荆棘,稳当自如! + +17. 愿你能像向阳花般在你的世界闪闪发光,做自己的小太阳! + +18. 生日快乐!愿你有自持而节制的华丽,层出不穷的新鲜,愈炼愈飞的魔性,永远虔诚的天真。 + +19. 你生日了🎂这个时候生日的人是未来之星🌟是国家栋梁🏠是都市小说的商业大鳄💎是吾日三省吾身的自律者💪是相亲节目里的心动嘉宾💓是自然界的丛林之王👑是世间所有丑与恶的唾弃者🔥是世间所有美与好的创作者❗❗ + +20. 我该祝你什么呢,想祝你平顺,可漫漫长路并非皆是坦途。想祝你快乐,但未来之途并非都是欢欣,失意低谷在所难免。那就祝你勇敢且坚强,乐观且豁达吧! + + +1. 2024 让我们有有趣趣的,去做可可爱爱的人,去做勇勇敢敢的事,实现心心念念的梦 + +2. 愿你风驰电掣,如龙腾空,奔向梦想的彼岸。愿你龙战于野,身负鳞甲,不惧风雨! + +3. 新的一年,祝您龙行蘿蘿,前程關關。 + +4. 愿新年,胜旧年。欢愉且胜意,万事皆可期。 + +5. 新年,旧年,有你皆甜。山河共赴,新岁同欢。咔!兔年杀青!龙年!奔赴下一场山海! + +6. 旧岁千般皆如意,新年万事定称心。 + +7. 愿新的一年,卡里不缺钱,晚上不失眠。 + +8. 长路漫漫,终有归途。这路遥马急的人间,你我平安喜乐就好。🚗🌈 + +9. 希望你的新年,全糖去冰。 🍧🌟 + +10. 发月常新,美好常在。纵使人潮汹涌,光阴似箭,愿所有的驰骋最终都奔向团圆。🌌👨‍👩‍👧‍👦 + +11. 所求皆如愿,所行化坦途。多喜乐,长安宁。旧年好,新年更好。新年快乐!(˶╹ꇴ╹˶)🧨🎇 + +12. 辞慕尔尔,烟火年年。日子滚烫,人间可爱。✨🎉 + +13. 家人闲坐,灯火可亲,新年伊始,喜乐安宁。 🏡✨ + +14. 星光璀璨,愿新年的生活同样夺目,让幸福如同星星一般闪耀✨ + +15. 🌠 时光流转,愿你在新年找到属于自己的蓝天,生活是彩虹梦幻的不尽旅程🌈 + +16. 新年,愿生活充满奇迹,每一天都有惊叹的时刻,探险充满奇迹的精彩⚜ + +17. 新曦初绽,春节将至,祝君岁岁皆如意,生活如诗,岁月似画。 + +18. 春佳节伊始,愿你的日子如诗如画,温馨而美好。🌈愿你心中的梦想如龙腾四海,逐浪前行。🌊 + +19. 新的一年,愿你万事顺遂,所爱如山。从此眼底是绮丽,周遭是晴朗,嘴角是笑意,耳畔是阜盛烟火。 + +20. 心之所向、行之所往、不慌不忙;烟火起、照人间、喜悦无边,举杯敬此年,唯愿:年年岁岁常康健,岁岁年年常相见。 diff --git a/tianji/utils/knowledge_tool.py b/tianji/utils/knowledge_tool.py index 28bc30f..9fca673 100644 --- a/tianji/utils/knowledge_tool.py +++ b/tianji/utils/knowledge_tool.py @@ -1,9 +1,13 @@ +from __future__ import annotations + from langchain.embeddings.openai import OpenAIEmbeddings from langchain.text_splitter import CharacterTextSplitter from langchain.vectorstores import Chroma from langchain.document_loaders import TextLoader +from langchain.embeddings.base import Embeddings +from langchain.pydantic_v1 import BaseModel, root_validator +from typing import Dict, List, Optional import os -from zhipuai import ZhipuAI from dotenv import load_dotenv load_dotenv() @@ -17,7 +21,6 @@ def get_docs_list_query_openai( k_num=5, ): embeddings = OpenAIEmbeddings() - print("-----", os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) loader_file_path = os.path.join( os.path.dirname(os.path.dirname(os.path.abspath(__file__))), loader_file_path ) @@ -43,20 +46,113 @@ def get_docs_list_query_openai( return knowledge -# ZhipuAI -class ZhipuAIEmbeddings: - def __init__(self, api_key=None): - self.client = ZhipuAI(api_key=api_key) +class ZhipuAIEmbeddings(BaseModel, Embeddings): + """`Zhipuai Embeddings` embedding models.""" + + zhipuai_api_key: Optional[str] = None + """Zhipuai application apikey""" + + @root_validator() + def validate_environment(cls, values: Dict) -> Dict: + """ + Validate whether zhipuai_api_key in the environment variables or + configuration file are available or not. + + Args: + + values: a dictionary containing configuration information, must include the + fields of zhipuai_api_key + Returns: + + a dictionary containing configuration information. If zhipuai_api_key + are not provided in the environment variables or configuration + file, the original values will be returned; otherwise, values containing + zhipuai_api_key will be returned. + Raises: + + ValueError: zhipuai package not found, please install it with `pip install + zhipuai` + """ + # values["zhipuai_api_key"] = get_from_dict_or_env( + # values, + # "zhipuai_api_key", + # "ZHIPUAI_API_KEY", + # ) + + try: + import zhipuai + + # zhipuai.api_key = values["zhipuai_api_key"] + values["client"] = zhipuai.ZhipuAI() + + except ImportError: + raise ValueError( + "Zhipuai package not found, please install it with " + "`pip install zhipuai`" + ) + return values + + def _embed(self, texts: str) -> List[float]: + # send request + try: + resp = self.client.embeddings.create( + model="embedding-2", # 填写需要调用的模型名称 + input=texts, + ) + except Exception as e: + raise ValueError(f"Error raised by inference endpoint: {e}") + + # if resp["code"] != 200: + # raise ValueError( + # "Error raised by inference API HTTP code: %s, %s" + # % (resp["code"], resp["msg"]) + # ) + embeddings = resp.data[0].embedding + + return embeddings + + def embed_query(self, text: str) -> List[float]: + """ + Embedding a text. + + Args: + + Text (str): A text to be embedded. + + Return: + + List [float]: An embedding list of input text, which is a list of floating-point values. + """ + resp = self.embed_documents([text]) + return resp[0] + + def embed_documents(self, texts: List[str]) -> List[List[float]]: + """ + Embeds a list of text documents. + + Args: + texts (List[str]): A list of text documents to embed. + + Returns: + List[List[float]]: A list of embeddings for each document in the input list. + Each embedding is represented as a list of float values. + """ + return [self._embed(text) for text in texts] + + async def aembed_documents(self, texts: List[str]) -> List[List[float]]: + """Asynchronous Embed search docs.""" + raise NotImplementedError( + "Please use `embed_documents`. Official does not support asynchronous requests" + ) - def __call__(self, texts): - response = self.client.embeddings.create( - model="embedding-2", - input=texts, + async def aembed_query(self, text: str) -> List[float]: + """Asynchronous Embed query text.""" + raise NotImplementedError( + "Please use `aembed_query`. Official does not support asynchronous requests" ) - return response["embeddings"] -def get_docs_list_query_zhipu( +def get_docs_list_query_zhipuai( query_str, loader_file_path="knowledges/knowledges.txt", persist_directory="",