当前位置: 首页 > news >正文

借助LlamaIndex实现简单Agent

借助LlamaIndex实现简单Agent

1 简介

智能体的构建发展是一个趋势,借助LlamaIndex简单实现Agent。本文主要借助LlamaIndex中的FunctionTool和Workflow。Workflow是使用事件流的方法实现。

2 构建公共类

由于LlamaIndex中的OpenAI无法直接连接国内大模型,因此需要使用OpenAI构建CustomLikeOpenAI。

from typing import Anyfrom llama_index.core.base.llms.types import CompletionResponseGen, LLMMetadata, CompletionResponse
from llama_index.core.llms import CustomLLM
from openai import OpenAI
from pydantic import Fieldclass CustomLikeOpenAI(CustomLLM):model: str = Field(description="自定义模型名称")api_key: str = Field(description="自定义API Key")api_base: str = Field(description="自定义API地址")context_window: int = Field(default=32768, description="上下文窗口大小")temperature: float = Field(ge=0, le=1, default=0.3, description="设置温度,值域须为 [0, 1]")num_output: int = Field(default=8192, description="设置max_tokens")def __init__(self, **data):# 必须调用父类初始化super().__init__(**data)# 创建对象self._client = OpenAI(api_key=self.api_key,base_url=self.api_base)@propertydef metadata(self) -> LLMMetadata:"""Get LLM metadata."""return LLMMetadata(context_window=self.context_window,num_output=self.num_output,model_name=self.model)def complete(self, prompt: str, **kwargs: Any) -> CompletionResponse:"""生成文本:param prompt: 添加提示词:param kwargs: 其他相关参数:return: CompletionResponse"""# 构建生成completion = self._client.chat.completions.create(model=self.model,messages=[{"role": "user", "content": prompt}],temperature=self.temperature,max_tokens=self.num_output)# 返回值return CompletionResponse(text=completion.choices[0].message.content)def stream_complete(self, prompt: str, **kwargs: Any) -> CompletionResponseGen:"""生成流式文本:param prompt: 提示词:param kwargs: 其他参数:return: CompletionResponseGen迭代器"""# 根据需要可以不实现,如果不想实现使用下面代码即可# raise NotImplementedError("Streaming not supported")# 构建数据流stream = self._client.chat.completions.create(model=self.model,messages=[{"role": "user", "content": prompt}],temperature=self.temperature,max_tokens=self.num_output,stream=True)# 遍历数据流for chunk in stream:# 获取新文本delta = chunk.choices[0].delta# 判断数据是否存在if delta.content:yield CompletionResponse(text=delta.content, delta=delta.content)

3 函数调用实现Agent

源代码

# 使用LlamaIndex中的ReActAgent和函数调用的方法,实现Agent
# ReActAgent集成AgentRunner/AgentWorker 此方法LlamaIndex未来会被舍弃,推荐使用AgentWorkflow 和 Workflows.
# 需要安装的组件
"""
pip install llama-index
pip install llama-index-llms-openai-like
"""import asynciofrom llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionToolfrom my_custom_rag.custom_like_openai import CustomLikeOpenAIdef add(x: int, y: int) -> int:"""Useful function to add two numbers."""return x + ydef multiply(x: int, y: int) -> int:"""Useful function to multiply two numbers."""return x * yasync def main():# 函数回调tools = [FunctionTool.from_defaults(fn=add, description="实现加法"),FunctionTool.from_defaults(fn=multiply, description="实现乘法")]# Llama index中的OpenAILike调用千问和Kimi不能使用,一直报参数错误,所以只能自定义了llm = CustomLikeOpenAI(model="XXXX",api_base="XXXX",api_key="XXXX")# 构建Agentagent = ReActAgent.from_tools(llm=llm,verbose=True,tools=tools)ret = agent.chat(message="1乘以10等于几")print(ret)if __name__ == "__main__":asyncio.run(main())

截图

4 WorkFlow实现Agent

运行流程

flowchart TDsubgraph 说明A1[(1)找到启动的方法,含有StartEvent参数的方法 ] --> B1B1[(2)执行第一个任务流,根据含有StartEvent参数的方法的输出找到的方法 ] --> C1C1[(3)执行任务流,根据上一个方法的输出找到下一个方法] --> D1D1[(4)执行结束,直到执行方法的返回值是StopEvent]endsubgraph 函数A2[(1)call_tool] --> B2B2[(2)generate_joke] --> C2C2[(3)……] --> D2D2[(4)critique_joke]end    

代码

# 需要安装的组件
"""
pip install llama-index
pip install llama-index-llms-openai-like
"""import asynciofrom llama_index.core.workflow import (Event,StartEvent,StopEvent,Workflow,step
)from my_custom_rag.custom_like_openai import CustomLikeOpenAIclass ToolCallEvent(Event):"""用于回调返回数据"""data: strclass JokeEvent(Event):"""笑话实体类"""joke: strclass JokeFlow(Workflow):# Llama index中的OpenAILike调用千问和Kimi不能使用,一直报参数错误,所以只能自定义了llm = CustomLikeOpenAI(model="XXXX",api_base="XXXX",api_key="XXXX")@stepasync def call_tool(self, ev: StartEvent) -> ToolCallEvent:"""生成笑话:param ev: 开始事件:return: 返回笑话事件"""topic = ev.topicprompt = f"根据主题 {topic} 拓展相关主题."response = await self.llm.acomplete(prompt)print("生成的相关主题:", response)return ToolCallEvent(data=str(response))@stepasync def generate_joke(self, ev: ToolCallEvent) -> JokeEvent:"""评价笑话事件:param ev: 笑话事件:return: 停止事件"""prompt = f"写一个关于{ev.data}主题的笑话."response = await self.llm.acomplete(prompt)print("生成的笑话:", response)return JokeEvent(joke=str(response))@stepasync def critique_joke(self, ev: JokeEvent) -> StopEvent:"""评价笑话事件:param ev: 笑话事件:return: 停止事件"""joke = ev.jokeprompt = f"请分析和评价笑话: {joke}"response = await self.llm.acomplete(prompt)return StopEvent(result=str(response))async def main():w = JokeFlow(timeout=60, verbose=True)result = await w.run(topic="水果")print(str(result))if __name__ == "__main__":asyncio.run(main())

截图

http://www.xdnf.cn/news/40303.html

相关文章:

  • 多模态融合(十一): SwinFusion——武汉大学马佳义团队(二)
  • 英语四级翻译题练习文章示例
  • 生物化学笔记:医学免疫学原理23 免疫检查点分子与肿瘤免疫治疗(PD-1抑制剂黑色素瘤)
  • 最长子序列长度(LIS)--个数遍历的二分+贪心优化
  • 代码随想录背包问题完结
  • 面向AI时代与数字化转型关键期:中小企业IT人才储备计划研究分析
  • 在复杂性的迷宫里寻找路标 —— 读《人月神话》有感
  • 免费将AI生成图像放大4倍的方法
  • 如何写 commit message?
  • 细说STM32单片机FreeRTOS中断管理及其应用方法
  • 深入浅出伯努利分布:从 0‑1 随机世界到统计学习基石
  • 服务部署丨通过Docker部署AutoBangumi+qBittorrent实现自动追番
  • 云服务器性价比测评:Intel vs AMD vs Graviton
  • YuE本地部署完整教程,可用于ai生成音乐,歌曲
  • 老婆是用来爱的,不是用来吼的
  • CAN与CANFD协议说明
  • [Java · 初窥门径] Java API 文档使用说明
  • Python实例题:神经网络实现人脸识别任务
  • 离线安装elasticdump并导入和导出数据
  • 深度补全网络:如CSPN++填补稀疏点云的深度信息
  • 运筹学之遗传算法
  • 2024期刊综述论文 Knowledge Graphs and Semantic Web Tools in Cyber Threat Intelligence
  • SICAR标准功能块 FB1514 “Robot_request_FB”
  • 洛谷的几道题(2)
  • 解决win10执行批处理报编码错误
  • 【双指针】对撞指针 快慢指针 移动零
  • 文献×材料 | 基于ANSYS的刹车片环保材料分析研究
  • C 语 言 --- 指 针 3
  • IsaacSim Asserts 配置
  • [Java]反射、String类补充