【引言】

你是否焦虑过,未来AI会取代自己的工作?别慌,与其被动等待,不如主动出击!今天,我将带你踏入AI的神秘世界,手搓一个具备“思考能力”的智能体,让你从AI的“被使用者”华丽转身为“掌控者”! 这不是科幻电影,而是触手可及的现实。

1. AI时代,你真的了解AI吗?

你以为ChatGPT就是AI的全部? 那就大错特错了!那些看似“无所不能”的大模型,本质上只是强大的语言工具,缺少真正的“思考”能力。它们更像是鹦鹉学舌,而非真正的智能。 我们今天要做的,就是突破这个瓶颈,构建一个具备思维链(Chain of Thought)能力的智能体,让AI不再是“复读机”,而是真正的“思考者”。

2. 焦虑?恐惧?不如行动!手搓你的专属AI!

你可能觉得代码遥不可及,觉得AI是高不可攀的技术。但我要告诉你,这篇教程将颠覆你的认知! 我们将从零开始,用最简单易懂的方式,让你也能拥有一个属于自己的“思考型”智能体。

我们的目标是什么?

  • 打破AI的神秘感: 不再仰望,而是掌握AI的核心技术。

  • 提升职场竞争力: 在AI时代,懂得利用AI工具的人,才能脱颖而出。

  • 满足好奇心: 亲手打造AI,体验科技带来的乐趣。

3. 从0开始,手搓你的思维链智能体:

核心代码全公开,无需高深编程基础!

接下来,我们将手把手教你如何编写代码,构建属于你自己的思维链智能体。 别担心,即使你是编程小白,也能轻松上手。

准备工作:

  1. 环境配置: 安装Python 和必要的库(openai, dotenv, llama-index 等)。

  2. 获取API Key: 你需要在智谱AI平台申请API Key(别怕,教程会教你)。

  3. 创建 .env 文件: 填写你的API Key,保护隐私。

核心代码(完整代码如下,请复制粘贴):

代码需要使用智谱ai的apikey,什么?你没有,快点下面的链接注册吧,限时赠送2000万tokens

链接:https://www.bigmodel.cn/invite?icode=SAztz%2BUqPqrsFdep498Qc%2F2gad6AKpjZefIo3dVEQyA%3D

import os
from dotenv import load_dotenv
import json
import re

# 加载环境变量
load_dotenv()
# 从环境变量中读取api_key
api_key = os.getenv('ZISHU_API_KEY1')
if not api_key:
    raise ValueError("环境变量 ZISHU_API_KEY1 未设置或为空,请检查 .env 文件!")    
base_url = "https://open.bigmodel.cn/api/paas/v4/"
chat_model = "glm-4-flash"
emb_model = "embedding-3"
from openai import OpenAI
from pydantic import Field  # 导入Field,用于Pydantic模型中定义字段的元数据
from llama_index.core.llms import (
    CustomLLM,
    CompletionResponse,
    LLMMetadata,
)
from llama_index.core.embeddings import BaseEmbedding
from llama_index.core.llms.callbacks import llm_completion_callback
from typing import List, Any, Generator
# 定义OurLLM类,继承自CustomLLM基类
class OurLLM(CustomLLM):
    api_key: str = Field(default=api_key)
    base_url: str = Field(default=base_url)
    model_name: str = Field(default=chat_model)
    client: OpenAI = Field(default=None, exclude=True)  # 显式声明 client 字段

    def __init__(self, api_key: str, base_url: str, model_name: str = chat_model, **data: Any):
        super().__init__(**data)
        self.api_key = api_key
        self.base_url = base_url
        self.model_name = model_name
        self.client = OpenAI(api_key=self.api_key, base_url=self.base_url)  # 使用传入的api_key和base_url初始化 client 实例

    @property
    def metadata(self) -> LLMMetadata:
        """Get LLM metadata."""
        return LLMMetadata(
            model_name=self.model_name,
        )

    @llm_completion_callback()
    def complete(self, prompt: str, **kwargs: Any) -> CompletionResponse:
        response = self.client.chat.completions.create(model=self.model_name, messages=[{"role": "user", "content": prompt}])
        if hasattr(response, 'choices') and len(response.choices) > 0:
            response_text = response.choices[0].message.content
            return CompletionResponse(text=response_text)
        else:
            raise Exception(f"Unexpected response format: {response}")

    @llm_completion_callback()
    def stream_complete(
        self, prompt: str, **kwargs: Any
    ) -> Generator[CompletionResponse, None, None]:
        response = self.client.chat.completions.create(
            model=self.model_name,
            messages=[{"role": "user", "content": prompt}],
            stream=True
        )

        try:
            for chunk in response:
                chunk_message = chunk.choices[0].delta
                if not chunk_message.content:
                    continue
                content = chunk_message.content
                yield CompletionResponse(text=content, delta=content)

        except Exception as e:
            raise Exception(f"Unexpected response format: {e}")

llm = OurLLM(api_key=api_key, base_url=base_url, model_name=chat_model)
response = llm.stream_complete("你是谁?")
print('res:',response)
# for chunk in response:
#    print(chunk, end="", flush=True)
import sys
import os

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))

from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool


def multiply(a: float, b: float) -> float:
    """Multiply two numbers and returns the product"""
    return a * b


def add(a: float, b: float) -> float:
    """Add two numbers and returns the sum"""
    return a + b


def main():

    multiply_tool = FunctionTool.from_defaults(fn=multiply)
    add_tool = FunctionTool.from_defaults(fn=add)

    # 创建ReActAgent实例
    agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)

    response = agent.chat("20+(2*4)等于多少?使用工具计算每一步")

    print(response)


if __name__ == "__main__":
    main()

代码详解:

  • 引入库: 导入必要的库,如openai, dotenv, llama-index等。

  • 加载环境变量: 从.env文件中读取API Key。

  • 定义OurLLM类: 继承CustomLLM,对接智谱AI的API。

  • 定义工具函数: 创建multiply和add函数,让AI具备计算能力。

  • 创建ReActAgent: 使用工具和LLM,构建具备思维链能力的Agent。

  • 测试Agent: 向Agent提问,验证其“思考能力”。

4. 为什么这个智能体能“思考”?

关键在于思维链(Chain of Thought) 的应用。这个智能体不再直接给出答案,而是会一步步分解问题,逐步推理:

  1. 观察: 理解用户的问题。

  2. 思考: 制定解决问题的步骤。

  3. 行动: 调用工具计算。

  4. 总结: 给出最终答案。

5. 这不仅仅是代码,更是通往未来的钥匙!

学会构建思维链智能体,你将:

  • 掌握AI核心技术,不再是AI的“小白”。

  • 拓展职业发展道路,成为AI领域的佼佼者。

  • 拥有更强大的工作效率,轻松应对复杂任务。

  • 体验科技带来的成就感,开启探索未知的旅程。

6. 现在就行动起来,打造属于你的专属AI吧!

【互动环节】

  • 点赞! 如果你觉得这篇文章对你有帮助。

  • 评论! 分享你对AI的看法,或者遇到的问题。

  • 分享! 让更多人了解AI,拥抱AI。

【结尾】

AI不是洪水猛兽,而是我们强大的工具。与其被动接受,不如主动拥抱。 让我们一起,手搓智能体,迎接AI时代的新挑战!

【特别提示】

本教程仅为入门教程,更多高级应用,请持续关注本账号!

源代码链接:https://github.com/renxingwill/ai_agent

Logo

更多推荐