当前位置:   article > 正文

Agents安装与使用--例子_llm-math

llm-math

 什么是Agents ?

Agents 是一个具有智能功能的智能体,它使用 LLM 和工具来执行任务

Agents 核心思想是使用LLM来选择要采取的一系列动作。在链式结构中,一系列动作是硬编码的(在代码中)。 在 Agents 中,使用语言模型作为推理引擎来确定要采取的动作及其顺序。

Agents 包括几个关键组件:

- **Agent**: 用于生成指令和执行动作的代理。

- **Tool**: 用于执行动作的函数。

- **Memory**: 用于存储历史对话和生成的指令。

- **LLM**: 用于生成指令和执行动作的 LLM。

第一个例子

搭建工具

- serpai是一个聚合搜索引擎,需要安装谷歌搜索包以及申请账号 https://serpapi.com/manage-api-key

- llm-math是一个封装好的数学计算链

pip install google-search-results

  1. # 导入os模块,用于设置环境变量
  2. import os
  3. # 设置环境变量SERPAPI_API_KEY,用于配置SERPAPI的API密钥
  4. # 这是访问SERPAPI服务所必需的,通过环境变量管理密钥可以提高安全性
  5. os.environ["SERPAPI_API_KEY"] = 'apl_key'
  6. # 导入Tongyi类,用于后续的语言模型操作
  7. from langchain_community.llms.tongyi import Tongyi
  8. # 初始化Tongyi语言模型实例
  9. # 这里没有对Tongyi类的具体功能进行注释,因为注释应该专注于代码的意图,而不是实现细节。
  10. # Tongyi类的具体功能和用途应在更高级别的文档或说明中描述。
  11. llm = Tongyi()
  1. # 导入加载工具和初始化代理的函数,以及代理类型的枚举
  2. from langchain.agents import load_tools
  3. from langchain.agents import initialize_agent
  4. from langchain.agents import AgentType
  5. # 加载特定的工具,为后续的代理初始化准备必要的资源
  6. # 这里加载了"serpapi"和"llm-math"两个工具,其中"llm"可能是为语言模型提供的一个接口或配置
  7. tools = load_tools(["serpapi","llm-math"], llm=llm)
  8. # 初始化代理,配置其为零样本响应描述类型,并设置为verbose模式
  9. # 这里的AgentType.ZERO_SHOT_REACT_DESCRIPTION指定了代理的行为类型,即零样本响应描述
  10. # verbose=True使得代理在执行过程中输出更多的调试信息
  11. agent = initialize_agent(
  12. tools,
  13. llm,
  14. agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,#这里有不同的类型
  15. verbose=True,#是否打印日志
  16. )
  1. # 调用低层模型(LLM)进行文本生成
  2. llm.invoke("请问2024年的美国总统是谁?他的年龄的除以2是多少?")
  3. # 运行代理程序,针对特定问题进行解答
  4. agent.run("请问现任的美国总统是谁?他的年龄的除以2是多少?")

输出示例:'现任美国总统是乔·拜登(Joe Biden),他的年龄除以2是40.5。'

Agents 的类型

- ZERO_SHOT_REACT_DESCRIPTION                   零样本反应描述

- CHAT_ZERO_SHOT_REACT_DESCRIPTION              聊天零样本反应描述

- CONVERSATIONAL_REACT_DESCRIPTION              会话反应描述

- CHAT_CONVERSATIONAL_REACT_DESCRIPTION         聊天会话反应描述

- STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION   聊天结构化零样本反应描述

- STRUCTURED_ZERO_SHOT_REACT_DESCRIPTION        结构化零样本反应描述

ZERO_SHOT_REACT_DESCRIPTION    即在没有示例的情况下可以自主的进行对话的类型。
  1. # 定义tools
  2. tools = load_tools(["serpapi","llm-math"],llm=llm)
  3. # 定义agent--(tools、agent、llm、memory)
  4. agent = initialize_agent(
  5. tools,
  6. llm,
  7. agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
  8. verbose=True,
  9. )
  10. print(agent)
  11. print("------------------------")
  12. print(agent.agent.llm_chain.prompt.template)
  13. #agent.invoke("现在美国总统是谁?他的年龄除以2是多少?")
CHAT_ZERO_SHOT_REACT_DESCRIPTION   零样本增强式生成,即在没有示例的情况下可以自主的进行对话的类型。
  1. tools = load_tools(["serpapi","llm-math"],llm=llm)
  2. agent = initialize_agent(
  3. tools,
  4. llm,
  5. agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
  6. verbose=True,
  7. )
  8. print(agent)
  9. print("------------------------")
  10. print(agent.agent.llm_chain.prompt.messages[0].prompt.template)
  11. print("------------------------")
  12. agent.invoke("现在美国总统是谁?他的年龄除以2是多少?")

输出结果:{'input': '现在美国总统是谁?他的年龄除以2是多少?', 'output': '现任美国总统是乔·拜登,他的年龄除以2是40.5岁。'}

CONVERSATIONAL_REACT_DESCRIPTION   一个对话型的agent,这个agent要求与memory一起使用
  1. from langchain.memory import ConversationBufferMemory
  2. #记忆组件
  3. memory = ConversationBufferMemory(
  4. memory_key="chat_history",
  5. )
  6. # 定义tool
  7. tools = load_tools(["serpapi","llm-math"],llm=llm)
  8. # 定义agent
  9. agent = initialize_agent(
  10. tools,
  11. llm,
  12. agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
  13. memory=memory,#记忆组件
  14. verbose=True,
  15. )
  16. print(agent)
  17. print(agent.agent.llm_chain.prompt.template)
  18. agent.run("我是张三,今年18岁,性别女,现在在深圳工作,工作年限1年,月薪5000元")
  19. agent.run("我的名字是什么?")
  20. agent.run("有什么好吃的泰国菜可以推荐给我吗?")
  21. agent.run("这些我都没吃过!我名字的最后一个字母是什么?1998年的世界杯谁夺冠了?")
  22. agent.run("中国陕西西安现在的气温多少?截止目前我们聊了什么?")

输出结果:

'你好,张三。你是一名18岁的女性,在深圳工作,已经有一年的工作经验,目前的月薪是5000元。如果你有任何问题或需要进一步的建议,请随时告诉我。'

输出结果:'你的名字是张三。'

输出结果:'当然,这里有一些推荐的泰国菜供你尝试:\n\n1. 青木瓜沙拉 (Som Tam) - 这是一道清爽的沙拉,通常由未成熟的木瓜、辣椒、蒜、青柠檬、鱼露和花生混合制成。\n2. 泰式炒河粉 (Pad Thai) - 这是泰国最著名的菜肴之一,由米粉、蔬菜、鸡蛋、虾或鸡肉以及甜、酸、咸的酱汁炒制而成。\n3. 冬阴功汤 (Tom Yum Goong) - 这是一道酸辣海鲜汤,含有柠檬草、香茅、辣椒、大蒜和 shrimp,口感鲜美。\n4. 泰式椰奶鸡汤 (Khao Soi) - 这是一种咖喱面条汤,通常配有炸过的面条、鸡肉或牛肉,以及浓郁的椰奶为基础的汤底。\n5. 红咖喱 (Gaeng Daeng) - 一道辣味浓郁的菜肴,通常与肉类(如鸡肉、牛肉或猪肉)和蔬菜一起烹饪。\n6. 烤肉串 (Moo Ping) - 猪肉串,腌制后在炭火上烤制,味道甜美且多汁。\n7. 椰香糯米饭 (Kao Niew Ma Muang) - 与芒果一起食用的糯米,是泰国甜点的经典选择。\n\n这些都是非常受欢迎的泰国菜,你可以根据自己的口味选择尝试。希望你会喜欢!'

输出结果:'你名字的最后一个字母是“三”。1998年的世界杯,法国国家足球队夺得了冠军。'

输出结果:'目前中国陕西西安的气温是98华氏度,天气情况是大部分晴朗。我们聊天的内容包括你叫张三,18岁,女性,目前在深圳工作,有1年工作经验,月薪5000元,你喜欢的泰国菜,以及1998年世界杯的冠军是法国队。'

CHAT_CONVERSATIONAL_REACT_DESCRIPTION   使用了chatmodel
  1. from langchain.memory import ConversationBufferMemory
  2. #记忆组件
  3. memory = ConversationBufferMemory(
  4. memory_key="chat_history",
  5. return_messages=True,
  6. )
  7. tools = load_tools(["serpapi","llm-math"],llm=llm)
  8. agent = initialize_agent(
  9. tools,
  10. llm,
  11. agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
  12. memory=memory,#记忆组件
  13. verbose=True,
  14. )
  15. print(agent)
  16. print("1 ------------------------")
  17. print(len(agent.agent.llm_chain.prompt.messages))
  18. print("2 ------------------------")
  19. print(agent.agent.llm_chain.prompt.messages[0].prompt.template)
  20. print("3 ------------------------")
  21. print(agent.agent.llm_chain.prompt.messages[1])
  22. print("4 ------------------------")
  23. print(agent.agent.llm_chain.prompt.messages[2].prompt.template)
  24. print("5 ------------------------")
  25. print(agent.agent.llm_chain.prompt.messages[3])
  26. agent.run("有什么好吃的泰国菜可以推荐给我吗?用中文回答")

输出结果:'泰国菜有很多美味的选项可以推荐。例如,泰式绿咖喱(Green Curry)是一道经典的菜肴,由嫩鸡块、椰奶和绿色咖喱酱制成,口味辛辣中带有香草和柠檬叶的香气。另一道不容错过的菜品是 pad Thai(泰式炒河粉),它混合了炒米粉、豆芽、胡萝卜、鸡肉或虾,并通常搭配花生碎和酸橙汁调味。还有泰式冬阴功汤(Tom Yum Soup),这是一道酸辣口味的汤,含有柠檬草、辣椒、虾和香茅,味道非常开胃。尝试这些菜品,你一定会喜欢上泰国美食的!'

STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION    对输出做了结构化处理
  1. from langchain.memory import ConversationBufferMemory
  2. #记忆组件
  3. memory = ConversationBufferMemory(
  4. memory_key="chat_history",
  5. return_messages=True,
  6. )
  7. ## 定义tool
  8. tools = load_tools(["serpapi","llm-math"],llm=llm)
  9. # 定义agent
  10. agent = initialize_agent(
  11. tools,
  12. llm,
  13. agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, #agent类型
  14. memory=memory,#记忆组件
  15. handle_parsing_errors=True,
  16. verbose=True,
  17. )
  18. print(agent)
  19. print(agent.agent.llm_chain.prompt.messages[0].prompt.template)
  20. print(agent.agent.llm_chain.prompt.messages[1].prompt.template)
  21. agent.run("有什么好吃的泰国菜可以推荐给我吗?用中文回答")

输出结果:'泰国菜有很多美味的选择,以下是一些推荐:\n1. 冬阴功汤 (Tom Yum Soup) - 酸辣口味,带有柠檬草和香茅的味道。\n2. 红咖喱鸡 (Gaeng Daeng Gai) - 辣味浓郁的红咖喱与鸡肉和蔬菜搭配。\n3. 泰式炒河粉 (Pad Thai) - 炒米粉配上豆芽、花生、鸡蛋和蔬菜,可选鸡肉、虾或豆腐。\n4. 香芒糯米饭 (Mango Sticky Rice) - 甜点,由糯米、芒果和椰奶组成。\n5. 椰奶鸡汤 (Tom Kha Gai) - 鸡肉和椰奶为基础的汤,口感醇厚且微辣。\n\n尝试这些菜品,你会享受到泰国美食的美妙滋味!'

Tools

langchain预制了大量的tools,基本这些工具能满足大部分需求。 https://python.langchain.com.cn/docs/modules/agents/tools/

- 加载预制tool的方法

- 几种tool的使用方式

  1. #添加预制工具的方法很简单
  2. from langchain.agents import load_tools
  3. tool_names = [...]
  4. tools = load_tools(tool_names) #使用load方法
  5. #有些tool需要单独设置llm
  6. from langchain.agents import load_tools
  7. tool_names = [...]
  8. llm = ...
  9. tools = load_tools(tool_names, llm=llm) #在load的时候指定llm
SerpAPI    最常见的聚合搜索引擎

https://serper.dev/dashboard,支持google\bing

  1. from langchain.utilities import SerpAPIWrapper
  2. search = SerpAPIWrapper()
  3. search.run("美国现在的总统是谁?")
  4. # 支持自定义参数,比如将引擎切换到bing,设置搜索语言等
  5. params = {
  6. "engine": "bing",
  7. "gl": "us",
  8. "hl": "en",
  9. }
  10. search = SerpAPIWrapper(params=params)
  11. search.run("美国现在的总统是谁?")
Dall-E    openai出品的文到图AI大模型

Eleven Labs Text2Speech

ElevenLabs 是非常优秀的TTS合成API

```

pip install elevenlabs

pip install --upgrade pydantic

```

  1. import os
  2. os.environ["ELEVEN_API_KEY"] = "23261e4a3b79697822252a505a169863"
  3. from langchain.tools import ElevenLabsText2SpeechTool
  4. text_to_speak = "Hello! 你好! Hola! नमस्ते! Bonjour! こんにちは! مرحبا! 안녕하세요! Ciao! Cześć! Привіт! வணக்கம்!"
  5. tts = ElevenLabsText2SpeechTool(
  6. voice="Bella",
  7. text_to_speak=text_to_speak,
  8. verbose=True
  9. )
  10. tts.name
  11. speech_file = tts.run(text_to_speak)
  12. speech_file = tts.run(text_to_speak)
  13. tts.stream_speech(text_to_speak)
GraphQL    一种api查询语言,

GraphQL 一种api查询语言,类似sql,我们用它来查询奈飞的数据库,查找一下和星球大战相关的电影,API地址https://swapi-graphql.netlify.app/.netlify/functions/index

```

pip install httpx gql > /dev/null

pip install gql

pip install requests_toolbelt

```

  1. ### from langchain.chat_models import ChatOpenAI
  2. from langchain.agents import load_tools, initialize_agent, AgentType
  3. from langchain.utilities import GraphQLAPIWrapper
  4. llm = ChatOpenAI(
  5. temperature=0,
  6. model="gpt-4",
  7. )
  8. tools = load_tools(
  9. ["graphql"],
  10. graphql_endpoint="https://swapi-graphql.netlify.app/.netlify/functions/index",
  11. )
  12. agent = initialize_agent(
  13. tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
  14. )

Tookit   

tookit是langchain已经封装好的一系列工具,一个工具包是一组工具来组合完成特定的任务

python

一个python代码机器人

 pip install langchain_experimental

  1. from langchain_experimental.agents.agent_toolkits import create_python_agent
  2. from langchain_experimental.tools import PythonREPLTool
  3. from langchain_experimental.utilities import PythonREPL
  4. from langchain.llms.openai import OpenAI
  5. from langchain.agents.agent_types import AgentType
  6. from langchain.chat_models import ChatOpenAI
  7. agent_executor = create_python_agent(
  8. llm=ChatOpenAI(temperature=0, model="gpt-4-1106-preview"),
  9. tool=PythonREPLTool(),
  10. verbose=True,
  11. agent_type=AgentType.OPENAI_FUNCTIONS,
  12. agent_executor_kwargs={"handle_parsing_errors": True},
  13. )
  14. agent_executor.run("What is the 10th fibonacci number?")
SQL Database

使用SQLDatabaseChain构建的agent,用来根据数据库回答一般行动饿问题

  1. from langchain.agents import create_sql_agent
  2. from langchain.agents.agent_toolkits import SQLDatabaseToolkit
  3. from langchain.sql_database import SQLDatabase
  4. from langchain.llms.openai import OpenAI
  5. from langchain.agents import AgentExecutor
  6. from langchain.agents.agent_types import AgentType
  7. from langchain.chat_models import ChatOpenAI
  8. db = SQLDatabase.from_uri("sqlite:///Chinook.db")
  9. toolkit = SQLDatabaseToolkit(db=db, llm=OpenAI(temperature=0))
  10. agent_executor = create_sql_agent(
  11. llm=ChatOpenAI(temperature=0, model="gpt-4-1106-preview"),
  12. toolkit=toolkit,
  13. verbose=True,
  14. agent_type=AgentType.OPENAI_FUNCTIONS
  15. )
  16. agent_executor.run("Describe the playlisttrack table")
自定义Agent

- 定义一个class

- 工具:默认搜索

- 提示词:定义agent要做什么任务

- outparse:约束LLM的行为和输出

- 不同的LLM不同的质量

  1. from langchain.agents import Tool, AgentExecutor, LLMSingleActionAgent, AgentOutputParser
  2. from langchain.prompts import StringPromptTemplate
  3. from langchain import SerpAPIWrapper, LLMChain
  4. from typing import List, Union
  5. from langchain.schema import AgentAction, AgentFinish, OutputParserException
  6. from langchain_community.llms.tongyi import Tongyi
  7. import re
  8. import os
  9. class MyAgentTool:
  10. def __init__(self) -> None:
  11. os.environ["SERPAPI_API_KEY"] = "f265b8d9834ed7692cba6db6618e2a8a9b24ed6964c457296a2626026e8ed594"
  12. self.serpapi = SerpAPIWrapper()
  13. def tools(self):
  14. return [
  15. Tool(
  16. name="search",
  17. description="适用于当你需要回答关于当前事件的问题时",
  18. func=self.serpapi.run,
  19. )
  20. ]
  21. s = MyAgentTool()
  22. s.serpapi.run("python")

构建一个agents类

  1. from typing import Any
  2. class MyAgent:
  3. def __init__(self) -> None:
  4. #agent的提示词,用来描述agent的功能
  5. self.template = """尽你最大可能回答下面问题,你将始终用中文回答. 你在必要时可以使用下面这些工具:
  6. {tools}
  7. Use the following format:
  8. Question: the input question you must answer
  9. Thought: you should always think about what to do
  10. Action: the action to take, should be one of [{tool_names}]
  11. Action Input: the input to the action
  12. Observation: the result of the action
  13. ... (this Thought/Action/Action Input/Observation can repeat N times)
  14. Thought: I now know the final answer
  15. Final Answer: the final answer to the original input question
  16. Begin! 记住使用中文回答,如果你使用英文回答将回遭到惩罚.
  17. Question: {input}
  18. {agent_scratchpad}"""
  19. #定义一个openai的llm
  20. self.llm = Tongyi()
  21. #工具列表
  22. self.tools = self.MyAgentTool().tools()
  23. #agent的prompt
  24. self.prompt = self.MyTemplate(
  25. template=self.template,
  26. tools=self.tools,
  27. #输入变量和中间变量
  28. input_variables=["input", "intermediate_steps"],
  29. )
  30. #定义一个LLMChain
  31. self.llm_chain = LLMChain(
  32. llm=self.llm,
  33. prompt = self.prompt
  34. )
  35. #工具名称列表
  36. self.toolnames = [tool.name for tool in self.tools]
  37. #定义一个agent
  38. self.agent = LLMSingleActionAgent(
  39. llm_chain=self.llm_chain,
  40. allowed_tools=self.toolnames,
  41. output_parser=self.MyOutputParser(),
  42. stop=["\nObservation:"],
  43. )
  44. #运行agent
  45. def run(self, input: str) -> str:
  46. #创建一个agent执行器
  47. agent_executor = AgentExecutor.from_agent_and_tools(
  48. agent=self.agent,
  49. tools=self.tools,
  50. handle_parsing_errors=True,
  51. verbose=True
  52. )
  53. agent_executor.run(input=input)
  54. #自定义工具类
  55. class MyAgentTool:
  56. def __init__(self) -> None:
  57. os.environ["SERPAPI_API_KEY"] = "f265b8d9834ed7692cba6db6618e2a8a9b24ed6964c457296a2626026e8ed594"
  58. self.serpapi = SerpAPIWrapper()
  59. def tools(self):
  60. return [
  61. Tool(
  62. name="search",
  63. description="适用于当你需要回答关于当前事件的问题时",
  64. func=self.serpapi.run,
  65. )
  66. ]
  67. #自定义模版渲染类
  68. class MyTemplate(StringPromptTemplate):
  69. #渲染模版
  70. template: str
  71. #需要用到的工具
  72. tools:List[Tool]
  73. #格式化函数
  74. def format(self, **kwargs: Any) -> str:
  75. #获取中间步骤
  76. intermediate_steps = kwargs.pop("intermediate_steps")
  77. thoughts = ""
  78. for action, observation in intermediate_steps:
  79. thoughts += action.log
  80. thoughts += f"\nObservation: {observation}\nThought: "
  81. #将agent_scratchpad设置为该值
  82. kwargs["agent_scratchpad"] = thoughts
  83. # 从提供的工具列表中创建一个名为tools的变量
  84. kwargs["tools"] = "\n".join([f"{tool.name}: {tool.description}" for tool in self.tools])
  85. #创建一个提供的工具名称列表
  86. kwargs["tool_names"] = ", ".join([tool.name for tool in self.tools])
  87. return self.template.format(**kwargs)
  88. #自定义输出解析类
  89. class MyOutputParser(AgentOutputParser):
  90. #解析函数
  91. def parse(self, output: str) -> Union[AgentAction, AgentFinish]:
  92. #检查agent是否应该完成
  93. if "Final Answer:" in output:
  94. return AgentFinish(
  95. # 返回值通常始终是一个具有单个 `output` 键的字典。
  96. # It is not recommended to try anything else at the moment :)
  97. return_values={"output": output.split("Final Answer:")[-1].strip()},
  98. log=output,
  99. )
  100. #用正则解析出动作和动作输入
  101. regex = r"Action\s*\d*\s*:(.*?)\nAction\s*\d*\s*Input\s*\d*\s*:[\s]*(.*)"
  102. match = re.search(regex, output, re.DOTALL)
  103. #如果没有匹配到则抛出异常
  104. if not match:
  105. raise OutputParserException(f"Could not parse LLM output: `{output}`")
  106. action = match.group(1).strip()
  107. action_input = match.group(2)
  108. # 返回操作和操作输入
  109. return AgentAction(tool=action, tool_input=action_input.strip(" ").strip('"'), log=output)
  1. myagent = MyAgent()
  2. myagent.run("比特币现在多少钱了?预计未来会涨吗?")

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号