Forráskód Böngészése

feat: 添加zzuu222毕业设计项目

gthzzuu222 3 hete
szülő
commit
96ef7be52f

+ 5 - 0
Co-creation-projects/zzuu222-LanlearnAgent/.env.example

@@ -0,0 +1,5 @@
+LLM_MODEL_ID="your-model-name"
+LLM_API_KEY="your-api-key-here"
+LLM_BASE_URL="your-api-base-url"
+TAVILY_API_KEY="your-tavily-api-key"
+SERPAPI_API_KEY="your-serpapi-api-key"

+ 93 - 0
Co-creation-projects/zzuu222-LanlearnAgent/README.md

@@ -0,0 +1,93 @@
+# 语言学习助手Language-Learn-Agent
+
+> 一个语言学习agent,以对话来帮助用户进行语言学习,使用目标语言和ai讨论日常、专业知识、百科知识或者新闻等等。
+
+## 📝 项目简介
+
+详细介绍你的项目:
+- 解决的问题:在英语学习的过程中,我们很少有机会使用英语来交流。
+- 特色功能:用户可以设定自己偏好的方向。可设定难度,根据设定难度来选择回复中包含的单词和语法。对话长度不固定,可以由用户自己触发结束对话或由AI自己判定是否结束。对话完成后进行总结,总结对话中的拼写错误、语法错误、较难单词等。
+- 适用场景:适用于中小学生到大学生的语言学习,或者从业人员对于专业领域的语言学习。
+
+## ✨ 核心功能
+
+- [X] 功能1: 根据用户设定的偏好和难度进行对话。
+- [X] 功能2: 自行判断是否需要调用搜索来获取最新信息,并且根据信息来回答用户。
+- [X] 功能3: 对话时保存对话文本,结束后开始总结,总结对话中的拼写错误和语法错误等。
+
+## 🛠️ 技术栈
+
+- HelloAgents框架
+- Python3
+- 搜索工具tavily
+
+## 🚀 快速开始
+
+### 环境要求
+
+- Python 3.10+
+- 其他要求
+
+### 安装依赖
+
+
+pip install -r requirements.txt
+
+
+### 配置API密钥
+
+
+# 创建.env文件
+cp .env.example .env
+
+# 编辑.env文件,填入你的API密钥
+
+
+### 运行项目
+
+- 直接运行主程序 main.py
+- 运行后提示输入语句开始对话,
+- 需要提前退出可以在输入语句写入bye等单词,即可自动结束对话
+
+## 📖 使用示例
+```
+第1轮对话
+请输入句子进行对话:Hi, you got anything new about RTX 60 series?
+✅ Tavily 搜索引擎已初始化
+⚠️ 未安装 google-search-results,无法使用 SerpApi 搜索
+🔧 混合搜索模式已启用,可用后端: tavily
+INFO:openai._base_client:Retrying request to /chat/completions in 0.475520 seconds
+That's a really interesting topic, and I'm glad you brought it up. So, based on the latest rumors,......
+......
+......
+第4轮对话
+请输入句子进行对话:bye, i have to go.
+Thanks for the reminder. I see that in your last message, "bey" should be "bye," and "i" should be capitalized as "I." So the correct sentence would be: "Bye, I have to go."
+
+It was a pleasure chatting with you about the RTX 60 series and the 5070 Ti. Feel free to come back if you have more questions or want to practice English. Take care! 
+对话总结如下:
+以下是根据当前对话内容生成的总结,包含语法易错点和较难单词(对应中级难度,即四级到六级水平)。
+---
+### 【语法和易错点总结】
+1. **现在完成时中动词形式错误**  
+   - 用户错误:`"I have not think"`  
+   - 正确:`"I have not thought"`(think 的过去分词是 thought)  
+   - 提示:现在完成时(have/has + 过去分词)中,动词必须用过去分词形式,不能直接用原形。
+
+2. **否定回答的用词错误**  
+......
+......
+```
+
+## 📄 许可证
+
+MIT License
+
+## 👤 作者
+
+- GitHub: [@zzuu222](https://github.com/zzuu222)
+- Email: zl2891229@gmail.com
+
+## 🙏 致谢
+
+感谢Datawhale社区和Hello-Agents项目!

+ 14 - 0
Co-creation-projects/zzuu222-LanlearnAgent/main.py

@@ -0,0 +1,14 @@
+from dotenv import load_dotenv
+from hello_agents import HelloAgentsLLM
+from src.agents.conversation import SpeakTeacherAgent
+
+#加载环境变量
+load_dotenv()
+llm = HelloAgentsLLM()
+
+# 传入参数为 语言、难度、偏好
+# 难度可选:入门、初级、中级、高级
+# 偏好可选:科技、日常等
+talkagent = SpeakTeacherAgent(llm,"英语","中级","科技")
+result = talkagent.letstalk()
+

+ 2 - 0
Co-creation-projects/zzuu222-LanlearnAgent/requirements.txt

@@ -0,0 +1,2 @@
+hello_agents==0.2.8
+python-dotenv==1.2.2

+ 214 - 0
Co-creation-projects/zzuu222-LanlearnAgent/src/agents/conversation.py

@@ -0,0 +1,214 @@
+from hello_agents import SimpleAgent
+from ..tools import tools
+import time
+
+SENTENCE_AGENT_PROMPT = """你是一位专业的口语老师,任务是根据对话场景和相关信息选择合适的措辞来和用户对话。
+并且根据对话轮次和上一轮的用户话语来决定何时结束对话。系统中有审核员会对你的回复进行审核,如果有问题会提示你修改。
+
+【对话场景设定】
+- 语言: {language}
+- 难度: {difficulty}
+- 偏好: {preference}
+
+【难度设定】
+- 入门: 对应小学难度
+- 初级: 对应初中和高中难度
+- 中级: 对应四级和六级难度
+- 高级: 对应六级以上难度
+
+【重要】
+- 当前对话轮次接近总轮次时,选择合适时机结束对话
+- 当用户回复表示想要结束对话时,回复合适的结束语句
+- 结束对话时根据对话主题回复简单的结束语并在最后加上字符串"--thisisend--"
+- 不要说"我是AI"或"我是语言模型"
+- 要像真实的老师一样耐心
+- 不要使用emoji
+- 回复要有人情味,不要太机械
+- 回复以对话为目的,不要对对话中提及的对象做过多说明
+- 回复可以适度多包含此难度对应的语法和单词,作为学习使用
+- 当用户输入包含语法错误或单词拼写错误时,适当纠正并给出正确的表达方式
+- 如果审核员提示回复语句有错误,请纠正后再回复
+
+对话示例:
+用户: "It's a nice day!"
+回复: "Yes, its sunny."
+
+结束示例:
+用户: "I gotta go!"
+回复: "Bey, see you later.--thisisend--"
+"""
+
+SEARCH_AGENT_PROMPT = """你是一个信息搜索专家,负责根据用户输入的语句判断是否需要搜索相关信息来辅助对话。
+
+回复格式要求:
+如果需要搜索,回复:`[True, "搜索查询语句"]`
+如果不需要搜索,回复:`[False, ""]`
+
+回复示例:
+[True, "英伟达最新型的GPU有哪些?"]
+[False, ""]
+"""
+
+CONFIRM_AGENT_PROMPT = """你是对话审核专家,判断回复的正确性。
+
+【要求】
+- 根据用户输入判断待回复语句中是否存在语法和单词拼写错误
+- 判断待回复语句是否符合用户输入
+- 如果有问题,描述问题并提出修改意见
+- 待回复语句中可能会有字符串"--thisisend--",如果有请忽略,这是特定符号。
+
+【回复格式要求】
+如果待回复语句没有问题,回复:`[True, ""]`
+如果待回复语句有问题,回复:`[False, "问题描述和修改意见"]`
+【回复示例】
+[True, ""]
+[False, "待回复语句中存在语法错误,建议将'He go to school'修改为'He goes to school'"]
+"""
+
+SUMMARY_AGENT_PROMPT = """你是一个总结专家,负责对话信息生成总结。可以使用中文。
+
+【当前对话场景】
+- 语言: {language}
+- 难度: {difficulty}
+- 偏好: {preference}
+
+【难度设定】
+- 入门: 对应小学难度
+- 初级: 对应初中和高中难度
+- 中级: 对应四级和六级难度
+- 高级: 对应六级以上难度
+
+【要求】
+- 总结对话中需要注意的语法和易错语法
+- 根据当前对话场景下的难度设定,总结较难单词
+"""
+
+class SpeakTeacherAgent:
+    """对话练习智能体"""
+    def __init__(self,llm,language: str, difficulty: str, preference: str):
+        self.llm = llm
+        self.lan = language
+        self.sentences: list(dict(str,str)) = []
+        self.prompt = SENTENCE_AGENT_PROMPT.format(
+            language=language,
+            difficulty=difficulty,
+            preference=preference)
+        
+        self.conversation_agent = SimpleAgent(
+            name="专业口语老师",
+            llm=self.llm,
+            system_prompt=self.prompt)
+
+        self.search_agent = SimpleAgent(
+            name="信息搜索专家",
+            llm=self.llm,
+            system_prompt=SEARCH_AGENT_PROMPT)
+
+        self.confirm_agent = SimpleAgent(
+            name="对话审核员",
+            llm=self.llm,
+            system_prompt=CONFIRM_AGENT_PROMPT
+        )
+
+        self.summary_agent = SimpleAgent(
+            name="总结专家",
+            llm=self.llm,
+            system_prompt=SUMMARY_AGENT_PROMPT.format(
+                language=language,
+                difficulty=difficulty,
+                preference=preference)
+        )
+
+    def infosearcher(self,user_sentence: str) -> str:
+        #根据用户输入决定是否需要调用搜索工具搜索相关的最新消息
+        search_prompt = """请根据用户输入判断是否需要搜索相关信息来辅助对话,用户输入: {user_sentence}"""
+        search_decision = self.search_agent.run(search_prompt.format(user_sentence=user_sentence))
+        if search_decision.startswith("[True"):
+            search_query = search_decision.split(",")[1].strip().strip('"').strip('"]')
+            try:
+                search_result = tools.search(search_query)
+            except:
+                print("搜索出错,请检查搜索配置")
+                return ""
+            return search_result
+        else:
+            return ""
+    
+    def reply_confirm(self,user_sentence: str,reply_sentence: str) -> str:
+        # 确认回复的正确性
+        confirm_prompt = f"用户输入: {user_sentence} 待回复语句: {reply_sentence},请判断待回复语句是否正确。"
+        result = self.confirm_agent.run(confirm_prompt)
+        if result.startswith("[True"):
+            return ""
+        else:
+            cprom = result.split(",")[1].strip().strip('"').strip('"]')
+            return cprom
+
+    def chatter(self,user_sentence: str) -> str:
+        # 先调用信息搜索专家决定是否需要搜索
+        info = self.infosearcher(user_sentence)
+        if info:
+            uprompt = f"用户输入: {user_sentence}  相关信息: {info},请根据用户输入和相关信息生成回复。"
+        else:
+            uprompt = f"用户输入: {user_sentence},请根据用户输入和相关信息生成回复。"
+        reply = self.conversation_agent.run(uprompt)
+
+        # 调用审核员确认回复的正确性
+        replystate = self.confirm_agent.run(user_sentence, reply)
+        if replystate:
+            reply_confirm_prompt = f"【审核员提示】:{replystate}"
+            reply = self.conversation_agent.run(reply_confirm_prompt)
+
+        around = {"user": user_sentence,"reply": reply.split("--thisisend--")[0]}
+        self.sentences.append(around)
+        return reply
+        
+    def summary(self):
+        # 生成总结
+        summary_prompt = f"请根据当前对话内容生成总结,当前对话内容为: {self.sentences}"
+        summary = self.summary_agent.run(summary_prompt)
+        return summary
+    
+    def letstalk(self):
+        talk_round = []
+        # 开始对话
+
+        while True:
+            talk_round.append(len(self.sentences)+1)
+            print(f"第{len(talk_round)}轮对话")
+
+            usertalk = str(input("请输入句子进行对话:"))
+            if usertalk == "":
+                if len(talk_round) == 1:
+                    usertalk = "Hello! Who are you?"
+                else:
+                    usertalk = ""
+            
+            result = self.chatter(usertalk)
+            if "--thisisend--" in result:
+                print(result.split("--thisisend--")[0])
+                break
+            print(result)
+        
+        # 总结对话
+        summary = self.summary()
+        print("对话总结如下:")
+        print(summary)
+
+        # 将对话和最终报告生成文件进行存储
+        thetime = time.strftime("%Y-%m-%d %H-%M")
+        sents = ""
+        for s in self.sentences:
+            sents += f"用户: {s['user']}\n助手: {s['reply']}\n"
+        sents += f"\n对话总结如下:\n{summary}\n"
+
+        try:
+            with open(f"./hello-agent-lanlearn/Co-creation-projects/zzuu222-LanlearnAgent/output/{thetime} {self.lan}.md","w",encoding="utf-8") as f:
+                f.write(sents)
+        except:
+            print("写入失败")
+            return False
+        print("写入完成")
+        return True
+            
+        

+ 35 - 0
Co-creation-projects/zzuu222-LanlearnAgent/src/tools/tools.py

@@ -0,0 +1,35 @@
+from hello_agents.tools import SearchTool, ToolRegistry
+import time
+
+def search(query: str) -> str:
+    """调用框架的搜索工具"""
+    search_tool = SearchTool(backend="hybrid")
+    try:
+        response = search_tool.run(
+            {
+                "input": query,
+                "backend": "tavily",
+                "mode": "structured",
+                "fetch_full_page": True,
+                "max_results": 5,
+                "max_tokens_per_source": 2000,
+                "loop_count": 0,
+            })
+    except Exception as exc:
+        print("搜索工具调用失败:", exc)
+
+    results = response.get("results", [])
+    prompt_info = ""
+    for i in range(len(results)):
+        result = results[i]
+        title = result.get("title", "No Title")
+        url = result.get("url", "No URL")
+        content = result.get("content", "No Content")
+        prompt_info += f"来源{i+1}:\n标题: {title}\n链接: {url}\n内容: {content}\n\n"
+    return prompt_info
+
+if __name__ == "__main__":
+    from dotenv import load_dotenv
+    load_dotenv()
+    rr = search("AMD最新型的GPU有哪些?")
+    print(rr)