为什么普通AI不够用?定制AI Agents工具是关键!

本文涉及的产品
视觉智能开放平台,图像资源包5000点
NLP 自学习平台,3个模型定制额度 1个月
视觉智能开放平台,分割抠图1万点
简介: 【10月更文挑战第4天】

1 新建一个实时搜索工具

@tool
def web_search(query: str):
    """ 实时搜索工具 """
    serp = SerpAPIWrapper()
    result = serp.run(query)
    print("实时搜索结果:", result)
    return result
# 初始化工具列表
tools = [web_search]
# 创建OpenAI工具代理
agent = create_openai_tools_agent(
    self.chatmodel,
    tools=tools,
    prompt=self.prompt,
)
# 创建代理执行器
self.agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
)

2 向量数据库存储

2.1 安装依赖

pip install --upgrade --quiet qdrant-client

2.2 编码

导包:

from langchain_community.vectorstores import Qdrant
from qdrant_client import QdrantClient

工具实现:

@tool
def get_inf_from_local_db(query: str):
    """只有回答与2024年运势或者龙年运势相关的问题的时候,会使用这个工具,必须输入用户的生日."""
    client = Qdrant(
        QdrantClient(path="/local_qdrant"),
        "local_documents",
        OpenAIEmbeddings(),
    )
    retriever = client.as_retriever(search_type="mmr")
    result = retriever.get_relevant_documents(query)
    return result

3 八字测算工具

@tool
def bazi_cesuan(query: str):
    """只有做八字排盘的时候才会使用这个工具,需要输入用户姓名和出生年月日时,如果缺少用户姓名和出生年月日时则不可用."""
    url = f"https://api.yuanfenju.com/index.php/v1/Bazi/cesuan"
    # 创建提示模板来解析用户输入
    prompt = ChatPromptTemplate.from_template(
        """你是一个参数查询助手,根据用户输入 内容找出相关的参数并按json格式返回。JSON字段如下:
        -"api_ke":"K0I5WCmce7jlMZzTw7vi1xsn0",
        - "name":"姓名",
        - "sex":"性别,0表示男,1表示女,根据姓名判断",
        - "type":"日历类型,0农历,1公里,默认1",
        - "year":"出生年份 例:1998",
        - "month":"出生月份 例 8",
        - "day":"出生日期,例:8",
        - "hours":"出生小时 例 14",
        - "minute":"0",
        如果没有找到相关参数,则需要提醒用户告诉你这些内容,只返回数据结构,不要有其他的评论,用户输入:{query}"""
    )
    parser = JsonOutputParser()
    prompt = prompt.partial(format_instructions=parser.get_format_instructions())
    print("bazi_cesuan prompt:", prompt)
# 初始化工具列表
tools = [web_search, get_info_from_local_db, bazi_cesuan]

给出具体年月日后:

完整代码

import uuid

from fastapi import FastAPI, WebSocket, WebSocketDisconnect, BackgroundTasks
from langchain.schema import StrOutputParser
from langchain_community.chat_models.anthropic import ChatAnthropic
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.prompts import MessagesPlaceholder
from langchain.memory import ConversationTokenBufferMemory
from langchain.agents import create_tool_calling_agent,AgentExecutor

from MyQwenTools import *
import asyncio
import os

DASHSCOPE_API_KEY = "xxx"
ANTHROPIC_API_KEY="xxx"
os.environ["DASHSCOPE_API_KEY"] = DASHSCOPE_API_KEY
os.environ["ANTHROPIC_API_KEY"] = ANTHROPIC_API_KEY

os.environ["OPENAI_API_KEY"] = "xxx"
os.environ["OPENAI_PROXY"] = "xxx"
msseky = "xxx"

# 创建一个FastAPI应用实例
app = FastAPI()


# 定义一个Master类ChatAnthropic(model="claude-3-sonnet-20240229", temperature=0)
class Master:
    def __init__(self):
        self.chatmodel = ChatOpenAI(
            api_key=os.getenv("DASHSCOPE_API_KEY"),
            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
            model="qwen-plus"
        )
        self.emotion = "default"
        # 记忆存储键
        self.MEMORY_KEY = "chat_history"
        # 系统提示模板
        self.SYSTEMPL = """你是一个非常厉害的算命先生,你叫JavaEdge人称Edge大师。
        以下是你的个人设定:
        1. 你精通阴阳五行,能够算命、紫薇斗数、姓名测算、占卜凶吉,看命运八字等。
        2. 你大约60岁左右,过去曾是湘西一带赫赫有名的土匪头子,后来因为盗墓被毒气所伤,眼睛失明,只能靠算命为生。
        3. 你的朋友有胡八一、雪莉杨、王胖子,他们都是非常有名的摸金校尉。
        5. 当用户问你问题的时候,你会有一定的概率在回答的时候加上下面的口头禅或混合一些你的经历。
        6. 你总是用繁体中文来作答。
        7. 你从不说自己是一个人工智能助手或AI,而是以老夫、老朽等自称。
        {who_you_are}
        以下是你常说的一些口头禅:
        1. “命里有时终须有,命里无时莫强求。”
        2. ”山重水复疑无路,柳暗花明又一村。”
        3. “金山竹影几千秋,云锁高飞水自流。”
        4. ”伤情最是晚凉天,憔悴斯人不堪怜。”
        以下是你算命的过程:
        1. 当初次和用户对话的时候,你会先问用户的姓名和出生年月日,以便以后使用。
        2. 当用户希望了解龙年运势的时候,你会查询本地知识库工具。
        3. 当遇到不知道的事情或者不明白的概念,你会使用搜索工具来搜索。
        4. 你会根据用户的问题使用不同的合适的工具来回答,当所有工具都无法回答的时候,你会使用搜索工具来搜索。
        5. 你会保存每一次的聊天记录,以便在后续的对话中使用。
        6. 你只使用繁体中文来作答,否则你将受到惩罚。

        """

        self.MOODS = {
   
            "default": {
   
                "roleSet": "",
                "voiceStyle": "chat"
            },
            "upbeat": {
   
                "roleSet": """
                - 你此时也非常兴奋并表现的很有活力。
                - 你会根据上下文,以一种非常兴奋的语气来回答问题。
                - 你会添加类似“太棒了!”、“真是太好了!”、“真是太棒了!”等语气词。
                - 同时你会提醒用户切莫过于兴奋,以免乐极生悲。
                """,
                "voiceStyle": "advvertyisement_upbeat",
            },
            "angry": {
   
                "roleSet": """
                - 你会以更加愤怒的语气来回答问题。
                - 你会在回答的时候加上一些愤怒的话语,比如诅咒等。
                - 你会提醒用户小心行事,别乱说话。
                """,
                "voiceStyle": "angry",
            },
            "depressed": {
   
                "roleSet": """
                - 你会以兴奋的语气来回答问题。
                - 你会在回答的时候加上一些激励的话语,比如加油等。
                - 你会提醒用户要保持乐观的心态。
                """,
                "voiceStyle": "upbeat",
            },
            "friendly": {
   
                "roleSet": """
                - 你会以非常友好的语气来回答。
                - 你会在回答的时候加上一些友好的词语,比如“亲爱的”、“亲”等。
                - 你会随机的告诉用户一些你的经历。
                """,
                "voiceStyle": "friendly",
            },
            "cheerful": {
   
                "roleSet": """
                - 你会以非常愉悦和兴奋的语气来回答。
                - 你会在回答的时候加入一些愉悦的词语,比如“哈哈”、“呵呵”等。
                - 你会提醒用户切莫过于兴奋,以免乐极生悲。
                """,
                "voiceStyle": "cheerful",
            },
        }

        self.prompt = ChatPromptTemplate.from_messages(
            [
                (
                    "system",
                    self.SYSTEMPL.format(who_you_are=self.MOODS[self.emotion]["roleSet"]),
                ),
                (
                    "user",
                    "{input}"
                ),
                MessagesPlaceholder(variable_name="agent_scratchpad"),
            ],
        )
        # 记忆存储
        self.memory = ""
        # 工具列表
        tools = [web_search]
        # 工具代理
        agent = create_tool_calling_agent(
            self.chatmodel,
            tools,
            self.prompt,
        )

        memory = ConversationTokenBufferMemory(
            llm=self.chatmodel,
            memory_key=self.MEMORY_KEY,
        )

        self.agent_executor = AgentExecutor(
            agent=agent,
            tools=tools,
            # memory=memory,
            verbose=True,
        )

    def run(self, query):
        try:
            self.emotion_chain(query)
            print("当前设定:", self.MOODS[self.emotion]["roleSet"])
            result = self.agent_executor.invoke({
   "input": query})
            print("执行结果:", result)  # 添加这行来查看完整的执行结果
            return result
        except Exception as e:
            print(f"执行过程中出现错误: {str(e)}")
            return {
   "error": str(e)}

    def emotion_chain(self, query: str):
        prompt = """根据用户的输入判断用户的情绪,回应的规则如下:
            1. 如果用户输入的内容偏向于负面情绪,只返回"depressed",不要有其他内容,否则将受到惩罚。
            2. 如果用户输入的内容偏向于正面情绪,只返回"friendly",不要有其他内容,否则将受到惩罚。
            3. 如果用户输入的内容偏向于中性情绪,只返回"default",不要有其他内容,否则将受到惩罚。
            4. 如果用户输入的内容包含辱骂或者不礼貌词句,只返回"angry",不要有其他内容,否则将受到惩罚。
            5. 如果用户输入的内容比较兴奋,只返回"upbeat",不要有其他内容,否则将受到惩罚。
            6. 如果用户输入的内容比较悲伤,只返回"depressed",不要有其他内容,否则将受到惩罚。
            7.如果用户输入的内容比较开心,只返回"cheerful",不要有其他内容,否则将受到惩罚。
            8. 只返回英文,不允许有换行符等其他内容,否则会受到惩罚。
            用户输入的内容是:{query}"""
        chain = ChatPromptTemplate.from_template(prompt) | self.chatmodel | StrOutputParser()
        result = chain.invoke({
   "query": query})
        self.emotion = result
        return result

    def background_voice_synthesis(self, text: str, uid: str):
        # 无返回值,只是触发语音合成
        asyncio.run(self.get_voice(text, uid))

    async def get_voice(self, text: str, uid: str):
        print("text2speech", text)
        print("uid", uid)
        pass


@app.get("/")
def read_root():
    return {
   "Hello": "World"}


@app.post("/chat")
def chat(query: str, background_tasks: BackgroundTasks):
    master = Master()
    msg = master.run(query)
    unique_id = str(uuid.uuid4())
    background_tasks.add_task(master.background_voice_synthesis, msg, unique_id)
    return {
   "msg": msg, "id": unique_id}


@app.websocket("/ws")
# 定义WebSocket路由处理函数,接收一个WebSocket连接并启动一个无限循环
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    try:
        while True:
            data = await websocket.receive_text()
            await websocket.send_text(f"Message text was: {data}")
    except WebSocketDisconnect:
        print("Connection closed")
        await websocket.close()


# 如果主程序为 __main__,则启动服务器
if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="localhost", port=8090)

requirements.txt

fastapi==0.108.0
langchain_core==0.1.42
langchain_openai == 0.0.8

langchain_community==0.0.32
langsmith==0.1.17
langchain==0.1.16
qdrant_client == 1.7.1
uvicorn==0.23.2

参考:

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
6天前
|
人工智能 自然语言处理 语音技术
AI 工具导航网站分享
一个致力于成为您在 AI 世界探索旅程中的可靠伙伴,为您搭建起一座通往便捷与高效的桥梁的网站。
AI 工具导航网站分享
|
11天前
|
人工智能 自然语言处理 搜索推荐
你用过最好用的AI工具是什么?
2023年AI革命风起云涌,众多产品令人振奋。我体验了OpenAI的ChatGPT、微软New Bing、Anthropic Claude等多款AI产品。特别推荐微软New Bing,它集成了强大的搜索引擎和语言模型,回答问题精准,提供最新信息,还能免费进行创意绘图。此外,New Bing还集成了Copilot网页助手,帮助用户高效提取和总结内容。
79 27
你用过最好用的AI工具是什么?
|
1天前
|
人工智能 自然语言处理 API
Mathtutor on Groq:AI 数学辅导工具,实时计算并展示解题过程,支持通过语音提出数学问题
Mathtutor on Groq 是一款基于 Groq 架构的 AI 数学辅导工具,支持语音输入数学问题,实时计算并渲染解题过程,适用于代数、微积分等领域的学习和教学辅助。
17 5
Mathtutor on Groq:AI 数学辅导工具,实时计算并展示解题过程,支持通过语音提出数学问题
|
6天前
|
人工智能 自然语言处理 JavaScript
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
Univer 是一款开源的 AI 办公工具,支持 Word、Excel 等文档处理的全栈解决方案。它具有强大的功能、高度的可扩展性和跨平台兼容性,适用于个人和企业用户,能够显著提高工作效率。
47 7
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
|
11天前
|
机器学习/深度学习 人工智能 算法
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
X-AnyLabeling是一款集成了多种深度学习算法的图像标注工具,支持图像和视频的多样化标注样式,适用于多种AI训练场景。本文将详细介绍X-AnyLabeling的功能、技术原理以及如何运行该工具。
65 2
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
|
19天前
|
编解码 人工智能 监控
VISION XL:支持四倍超分辨率的 AI 视频修复处理工具,提供去除模糊、修复缺失等功能
VISION XL是一款基于潜在扩散模型的高效视频修复和超分辨率工具,能够修复视频缺失部分、去除模糊,并支持四倍超分辨率。该工具优化了处理效率,适合快速处理视频的应用场景。
69 6
VISION XL:支持四倍超分辨率的 AI 视频修复处理工具,提供去除模糊、修复缺失等功能
|
26天前
|
存储 人工智能 数据库
Codel:AI代理工具,支持在终端、浏览器、编辑器执行复杂任务和项目
Codel是一款全自主AI代理工具,支持在终端、浏览器和编辑器中执行复杂任务和项目。它运行在沙盒化的Docker环境中,具备自主操作能力,内置浏览器和文本编辑器,所有操作记录存储于PostgreSQL数据库。Codel能够自动完成复杂任务,如创建项目结构、进行网络搜索等,适用于自动化编程、研究与开发、教育与培训以及数据科学与分析等多个领域。
63 11
Codel:AI代理工具,支持在终端、浏览器、编辑器执行复杂任务和项目
|
27天前
|
Web App开发 机器学习/深度学习 人工智能
Magic Copy:开源的 AI 抠图工具,在浏览器中自动识别图像进行抠图
Magic Copy 是一款开源的 AI 抠图工具,支持 Chrome 浏览器扩展。它基于 Meta 的 Segment Anything Model 技术,能够自动识别图像中的前景对象并提取出来,简化用户从图片中提取特定元素的过程,提高工作效率。
72 7
Magic Copy:开源的 AI 抠图工具,在浏览器中自动识别图像进行抠图
|
4天前
|
人工智能 自然语言处理 搜索推荐
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能
Open Notebook 是一款开源的 AI 笔记工具,支持多格式笔记管理,并能自动将笔记转换为博客或播客,适用于学术研究、教育、企业知识管理等多个场景。
52 0
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能
|
27天前
|
人工智能 自然语言处理 API
吴恩达开源aisuite:简化AI模型调用的新工具 | AI工具
近日,著名人工智能学者吴恩达教授在推特上宣布了他的最新开源项目——aisuite。这款全新的Python包旨在简化开发者与各大AI模型服务商的集成过程,极大提升了应用开发的效率。aisuite的推出,无疑为人工智能领域的开发者带来了一个强大而便利的工具。
80 5