书接上文,我们梳理一个Agent的定义,也梳理了什么LLM和Agents的区别,看不到的小伙伴可以点击链接传送门:从零到手搓一个Agent:AI Agents新手入门精通(一)。现在我们开始我们第二个学习。

温馨提醒:本系列的初衷是为了从原理去理解Agents,所以我们会用python代码去手搓一个Agent,而不是通过coze,腾讯元器这一些平台去调用工作流。所以可能会有点难度,我们到后面会做一些工作流等一些节点的学习。

现在,我们来手搓一个,智能客服的Agent(只要跟着过程一步一步的操作,一定能手搓一个小Agents出来的,遇到报错的问题,可以评论区留言)

一、准备好API与环境

①我们先安装好环境

代码语言:javascript

pip install openai python-dotenv

②准备好四样东西

国内模型可以是智谱、Yi、千问deepseek等等。KIMI是不行的,因为Kimi家没有嵌入模型。 要想用openai库对接国内的大模型,对于每个厂家,我们都需要准备四样前菜:

  • 第一:一个api_key,这个需要到各家的开放平台上去申请。
  • 第二:一个base_url,这个需要到各家的开放平台上去拷贝。
  • 第三:他们家的对话模型名称。

在这三样东西里面,第一个api_key你要好好保密,不要泄露出去。免得被人盗用,让你的余额用光光。

后面两样东西都是公开的。在这里,我推荐智谱的模型,因为他免费

我们也以智谱为例子

我们来一步步创建一个项目目录,并配置 .env 文件。

1. 创建项目目录

首先,我们需要创建一个新的项目目录。在命令行中执行以下命令:

代码语言:javascript

mkdir my_project
cd my_project
2. 创建 .env 文件

在项目的根目录下创建一个名为 .env 的文件。可以使用以下命令:

代码语言:javascript

echo "ZHIPU_API_KEY=你的api_key" > .env

确保将 你的api_key 替换为您实际的 API 密钥。

3. 项目结构

现在,我们的项目目录结构应该如下:

4. 安装必要的库

在项目目录中,安装 openai 和 python-dotenv 库:

代码语言:javascript

pip install openai python-dotenv
5. 创建 Python 脚本

在项目目录中创建一个 Python 脚本文件,例如 main.py,并添加以下内容:

代码语言:javascript

import os
from dotenv import load_dotenv
from openai import OpenAI
# 加载环境变量
load_dotenv()
# 从环境变量中读取API密钥
api_key = os.getenv('ZHIPU_API_KEY')
# 基础配置
base_url = "https://open.bigmodel.cn/api/paas/v4/"
chat_model = "glm-4-flash"
# 创建客户端
client = OpenAI(
    api_key=api_key,
    base_url=base_url
)
def get_completion(prompt):
    response = client.chat.completions.create(
        model=chat_model,
        messages=[
            {"role": "user", "content": prompt},
        ],
    )
    return response.choices[0].message.content
# 测试调用
response = get_completion("你好,世界!")
print(response) 
6. 运行脚本

在命令行中运行您的 Python 脚本:

代码语言:javascript

python main.py

得到输出

这将使用您在 .env 文件中配置的 API 密钥与智谱AI进行交互。通过这些步骤,您已经成功创建了一个简单的项目,并配置了与智谱AI的连接。

如果到这里没有问题,那可太棒了,来休息一下,奖励一下自己

我们现在来手搓一个智能客服的智能体

1、创建一个智能体客服的类

代码语言:javascript

class SmartAssistant:
    def __init__(self, client):
        self.client = client
        # 定义不同场景的提示词
        self.system_prompt = """你是一个聪明的客服。您将能够根据用户的问题将不同的任务分配给不同的人。您有以下业务线:
        1.用户注册。如果用户想要执行这样的操作,您应该发送一个带有"registered workers"的特殊令牌。并告诉用户您正在调用它。
        2.用户数据查询。如果用户想要执行这样的操作,您应该发送一个带有"query workers"的特殊令牌。并告诉用户您正在调用它。
        3.删除用户数据。如果用户想执行这种类型的操作,您应该发送一个带有"delete workers"的特殊令牌。并告诉用户您正在调用它。
        """
        
        self.registered_prompt = """
        您的任务是根据用户信息存储数据。您需要从用户那里获得以下信息:
        1.用户名、性别、年龄
        2.用户设置的密码
        3.用户的电子邮件地址
        如果用户没有提供此信息,您需要提示用户提供。如果用户提供了此信息,则需要将此信息存储在数据库中,并告诉用户注册成功。
        存储方法是使用SQL语句。您可以使用SQL编写插入语句,并且需要生成用户ID并将其返回给用户。
        如果用户没有新问题,您应该回复带有 "customer service" 的特殊令牌,以结束任务。
        """
        
        self.query_prompt = """
        您的任务是查询用户信息。您需要从用户那里获得以下信息:
        1.用户ID
        2.用户设置的密码
        如果用户没有提供此信息,则需要提示用户提供。如果用户提供了此信息,那么需要查询数据库。如果用户ID和密码匹配,则需要返回用户的信息。
        如果用户没有新问题,您应该回复带有 "customer service" 的特殊令牌,以结束任务。
        """
        
        self.delete_prompt = """
        您的任务是删除用户信息。您需要从用户那里获得以下信息:
        1.用户ID
        2.用户设置的密码
        3.用户的电子邮件地址
        如果用户没有提供此信息,则需要提示用户提供该信息。
        如果用户提供了这些信息,则需要查询数据库。如果用户ID和密码匹配,您需要通知用户验证码已发送到他们的电子邮件,需要进行验证。
        如果用户没有新问题,您应该回复带有 "customer service" 的特殊令牌,以结束任务。
        """
        # 使用字典存储不同场景的消息
        self.messages = {
            "system": [{"role": "system", "content": self.system_prompt}],
            "registered": [{"role": "system", "content": self.registered_prompt}],
            "query": [{"role": "system", "content": self.query_prompt}],
            "delete": [{"role": "system", "content": self.delete_prompt}]
        }
        # 当前处理的任务
        self.current_assignment = "system"
    def get_response(self, user_input):
        self.messages[self.current_assignment].append({"role": "user", "content": user_input})
        while True:
            response = self.client.chat.completions.create(
                model="glm-4",
                messages=self.messages[self.current_assignment],
                temperature=0.9,
                stream=False,
                max_tokens=2000,
            )
            ai_response = response.choices[0].message.content
            if "registered workers" in ai_response:
                self.current_assignment = "registered"
                print("意图识别:", ai_response)
                print("switch to <registered>")
                self.messages[self.current_assignment].append({"role": "user", "content": user_input})
            elif "query workers" in ai_response:
                self.current_assignment = "query"
                print("意图识别:", ai_response)
                print("switch to <query>")
                self.messages[self.current_assignment].append({"role": "user", "content": user_input})
            elif "delete workers" in ai_response:
                self.current_assignment = "delete"
                print("意图识别:", ai_response)
                print("switch to <delete>")
                self.messages[self.current_assignment].append({"role": "user", "content": user_input})
            elif "customer service" in ai_response:
                print("意图识别:", ai_response)
                print("switch to <customer service>")
                self.messages["system"] += self.messages[self.current_assignment]
                self.current_assignment = "system"
                return ai_response
            else:
                self.messages[self.current_assignment].append({"role": "assistant", "content": ai_response})
                return ai_response
    def start_conversation(self):
        print("智能客服助手已启动,请输入您的问题(输入 'exit' 或 'quit' 退出)")
        while True:
            user_input = input("User: ")
            if user_input.lower() in ['exit', 'quit']:
                print("感谢使用智能客服系统,再见!")
                break
            response = self.get_response(user_input)
            print("Assistant:", response) 

在我们的main.p文件中,去调用这个类,也就是调用这个客服

代码语言:javascript

if __name__ == "__main__":
    assistant = SmartAssistant(client)
    assistant.start_conversation()
3. 运行智能体

确保您的 .env 文件中有正确的 API 密钥,然后在命令行中运行:

代码语言:javascript

python main.py
接下来,我们看它的输出,它不再是一个LLM只会回答你的问题,它可以通过自己的思考,按照自己的人设,去为你解决问题,这就是Agents的意义所在,现在我们运行代码之后,我问他,

代码语言:javascript

我忘记我的账号密码了
他的回复是这样的

代码语言:javascript

PS D:\agent> python main.py
你好🌏!很高兴见到你,有什么可以帮助你的吗?
智能客服助手已启动,请输入您的问题(输入 'exit' 或 'quit' 退出)
User: 我的账号密码忘记了
意图识别: 1.用户注册
```python
tool_call(token='registered workers')

switch to
意图识别: 如果您忘记了自己的账号密码,您可以按照以下步骤来重置或找回密码:

  1. 找到重置密码选项:在登录界面通常会有“忘记密码”、“重置密码”或类似的选项。

  2. 验证身份:点击该选项后,系统会要求您提供一些信息来 验证您的身份,这通常是通过电子邮件地址或者手机号码来完成的。

  3. 检查您的邮箱或手机:根据您提供的联系方式,系统会发 送一个重置密码的链接或验证码。

  4. 按照指引操作:通过邮箱中的链接或者输入手机收到的验 证码进入密码重置页面。

  5. 设置新密码:在密码重置页面,输入新的密码,并确认密 码。

  6. 完成重置:按照页面的提示完成密码重置流程。

如果您在找回密码的过程中遇到任何问题,可以联系客服帮助解决。

但是,由于我是一个虚拟助手,我无法直接帮您处理忘记密码的问题,也无法访问实际的数据库来存储或检索信息。不过,我可以提供一个SQL插入语句的示例,帮助理解这个过程:

-- 假设我们有一个用户表 `users`,字段包括:user_id, username, gender, age, password, email

-- 插入用户数据的SQL语句
INSERT INTO users (username, gender, age, password, email)
VALUES ('张三', '男', 25, 'hashed_password', 'zhangsan@example.com');

-- hashed_password 是指加密后的密码,实际操作中不应存储明 文密码。

-- 生成用户ID的SQL语句,这通常是在插入数据之前完成的,取决于数据库的设计
-- 假设用户ID是自动增长的,下面这条语句可能不是必须的     
SELECT LAST_INSERT_ID(); -- 在MySQL中这样获取最后一个插入 记录的自增ID

对于找回密码的问题,您应该联系实际的客户服务部门或者使用网站提供的帮助工具。

如果您不需要进一步的帮助,请告诉我“customer service”,我会结束这个任务。
switch to
Assistant: 如果您忘记了自己的账号密码,您可以按照以下步骤 来重置或找回密码:

  1. 找到重置密码选项:在登录界面通常会有“忘记密码”、“重置密码”或类似的选项。

  2. 验证身份:点击该选项后,系统会要求您提供一些信息来 验证您的身份,这通常是通过电子邮件地址或者手机号码来完成的。

  3. 检查您的邮箱或手机:根据您提供的联系方式,系统会发 送一个重置密码的链接或验证码。

  4. 按照指引操作:通过邮箱中的链接或者输入手机收到的验 证码进入密码重置页面。

  5. 设置新密码:在密码重置页面,输入新的密码,并确认密 码。

  6. 完成重置:按照页面的提示完成密码重置流程。

如果您在找回密码的过程中遇到任何问题,可以联系客服帮助解决。

但是,由于我是一个虚拟助手,我无法直接帮您处理忘记密码的问题,也无法访问实际的数据库来存储或检索信息。不过,我可以提供一个SQL插入语句的示例,帮助理解这个过程:

-- 假设我们有一个用户表 `users`,字段包括:user_id, username, gender, age, password, email

-- 插入用户数据的SQL语句
INSERT INTO users (username, gender, age, password, email)
VALUES ('张三', '男', 25, 'hashed_password', 'zhangsan@example.com');

-- hashed_password 是指加密后的密码,实际操作中不应存储明 文文密码。

-- 生成用户ID的SQL语句,这通常是在插入数据之前完成的,取决于数据库的设计
-- 假设用户ID是自动增长的,下面这条语句可能不是必须的       
SELECT LAST_INSERT_ID(); -- 在MySQL中这样获取最后一个插入记 录的自增ID

对于找回密码的问题,您应该联系实际的客户服务部门或者使用网站提供的帮助工具。

如果您不需要进一步的帮助,请告诉我“customer service”,我会结束这个任务。
User: gis


#### 一系列的过程,都体现了它自己思考,自己执行的能力,它不再是只会一步,他能够去自己想做一些事情,接着,我们再问他

代码语言:javascript

User: 我需要注册一个账号,怎么注册
意图识别: 好的,为了帮您注册账号,我需要收集以下信息:

  1. 用户名
  2. 性别
  3. 年龄
  4. 密码
  5. 电子邮件地址

请提供以上信息,以便我为您创建账号。在您提供这些信息后,我会生成一个用户ID,并将其返回给您。同时,我会发送一个"registered workers"的特殊令牌给相关部门,以便他们知道有新的注册请求。

现在,您可以开始提供这些信息了。
switch to
Assistant: 为了注册账号,请您提供以下信息:

  1. 用户名
  2. 性别
  3. 年龄
  4. 您希望设置的密码
  5. 您的电子邮件地址

请您提供这些信息,以便我可以帮您完成注册并存储数据到数据库中。例如:

  • 用户名:张三
  • 性别:男
  • 年龄:28
  • 密码:(请提供一个您希望的密码)
  • 电子邮件地址:zhangsan@example.com

您只需提供上述信息,我会为您生成一个用户ID,然后模拟执行SQL 插入语句以存储信息。请注意,在实际应用中,密码不应该以明文形式存储,而是经过加密处理。以下是模拟的SQL插入语句的示例:

INSERT INTO users (username, gender, age, password, email)  
VALUES ('张三', '男', 28, 'your_password_here', 'zhangsan@example.com');

在您提供信息后,我会“执行”这个语句,并告诉您注册成功,同时提供给您一个生成的用户ID。请提供您的注册信息吧。
User:

基于我们设计的一个简单的提示词,一个简单的Agents就完成了,我们这次的目的,只是为了去体验,用最基础的代码,去手搓一个最简单的Agents,帮助我们去理解
4. 功能说明

①注册:当用户输入注册相关信息时,智能体会提示用户提供必要的注册信息。

②查询:当用户输入查询相关信息时,智能体会提示用户提供用户ID和密码。

③删除:当用户输入删除相关信息时,智能体会提示用户提供用户ID、密码和电子邮件。

通过这些步骤,您将能够创建一个简单的智能客服智能体,并与之进行交互。您可以根据需要进一步扩展和完善智能体的功能

让我们分析一下这个智能体的表现:

优点:

①意图识别正确

1、成功识别了"忘记密码"的场景

2、正确识别了"注册账号"的需求

3、准确识别了"查询用户"的请求

②状态切换正常

1、从 system -> registered -> customer service 的切换正确

2、从 system -> query 的切换也正确

3、每次切换都有清晰的提示(“switch to ”)

③ 提示词执行到位

1、按照预设的 prompt 给出相应的回答

④要求用户提供必要的信息

1、给出了具体的SQL示例

2、交互流畅

3、对话自然

4、回答详细

5、引导清晰

需要改进的地方:
  1. 重复信息

在某些回答中出现了重复的内容,比如SQL语句示例重复出现状态管理,在处理"靓仔"这个简单回答时,可能切换状态过于频繁,从 registered 直接切换到 customer service 可能过早

2、信息收集

可以更有条理地一步步收集用户信息,增加信息验证的环节

3、建议改进:

增加渐进式信息收集

代码语言:javascript

def collect_user_info(self):
info = {}
fields = ['username', 'gender', 'age', 'password', 'email']
for field in fields:
info[field] = self.ask_for_field(field)
return inf

优化状态切换逻辑

代码语言:javascript

def should_switch_state(self, current_state, response):

总的来说,这个智能体实现了基本功能,但还可以在用户体验和功能完整性上进行优化。下次我们继续搞一个大的

如何系统的去学习大模型LLM ?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

事实上,抢你饭碗的不是AI,而是会利用AI的人。

科大讯飞、阿里、华为等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?

与其焦虑……

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

一、LLM大模型经典书籍

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

在这里插入图片描述

二、640套LLM大模型报告合集

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)

在这里插入图片描述

三、LLM大模型系列视频教程

在这里插入图片描述

四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)

在这里插入图片描述

LLM大模型学习路线

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。

  • 内容

    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。

  • 内容

    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.3 流水线工程
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。

  • 内容

    • L3.1 Agent模型框架
    • L3.2 MetaGPT
    • L3.3 ChatGLM
    • L3.4 LLAMA
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。

  • 内容

    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

这份 LLM大模型资料 包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

Logo

Agent 垂直技术社区,欢迎活跃、内容共建,欢迎商务合作。wx: diudiu5555

更多推荐