利用openai,Llama-index库实现多功能的agent [Datawhale学习]

打印 上一主题 下一主题

主题 1744|帖子 1744|积分 5232

参考资料:GitHub - datawhalechina/wow-agent: A simple and trans-platform agent framework and tutorial

目次
一、借助Llama-index实现算数agent
注意:要在.env文件中配置好apikey
1.先构建大模子(智谱glm-4-flash模子)
2.构建其需要利用的算数工具
3.完整代码
二、多模子接入agent
借助Llama-index和OpenWeatherMap实现实时天气
1.构建大模子与(一、借助Llama-index实现agent)相同,这里着重说明后半部分
2.由于OpenWeatherMap是利用经度纬度获取天气,以是需要将地区转换为经纬度
3.再利用经纬度获取天气信息
4.完整代码如下
效果如下
三、数据库接入agent
1.本地安装ollama
运行效果
2.毗连数据库的模子
首先创建数据库,并添加数据
假如你是用的是pycharm,以下方法可以直观的查看表中数据
注意事项:
3.再用本地摆设的模子ollama作为llm实现agent
注意需要提前安装这些库
效果如下
四、RAG接入agent
1.首先接入本地的模子
2.构建索引
3.构建问答引擎
4.完整代码体验RAG
注意:将以下内容命名为问答手册.txt,放置在代码运行目次下(供模子学习)
运行效果
5.将RAG作为工具供agent利用
完整代码
效果如下
五、搜索引擎接入agent
1.接入模子
2.构建llm模子
3.配置搜索引擎
4.完整代码
效果如下


一、借助Llama-index实现算数agent

注意:要在.env文件中配置好apikey

申请一个智谱的免费api参考利用openai,Llama-index实现agent [Datawhale学习]-CSDN博客
1.先构建大模子(智谱glm-4-flash模子)

本次由于要借助react框架,因此启用流式相应更能反映模子自我推理本领
  
  1. import os
  2. from dotenv import load_dotenv
  3. from openai import OpenAI
  4. from pydantic import Field  # 导入Field,用于Pydantic模型中定义字段的元数据
  5. from llama_index.core.llms import (
  6.     CustomLLM,
  7.     CompletionResponse,
  8.     LLMMetadata,
  9. )
  10. from llama_index.core.embeddings import BaseEmbedding
  11. from llama_index.core.llms.callbacks import llm_completion_callback
  12. from typing import List, Any, Generator
  13. # 加载环境变量
  14. load_dotenv()
  15. # 从环境变量中读取api_key
  16. api_key = os.getenv('ZHIPU_API_KEY')
  17. base_url = "https://open.bigmodel.cn/api/paas/v4"
  18. chat_model = "glm-4-flash"
  19. # 定义OurLLM类,继承自CustomLLM基类
  20. class OurLLM(CustomLLM):
  21.     api_key: str = Field(default=api_key)
  22.     base_url: str = Field(default=base_url)
  23.     model_name: str = Field(default=chat_model)
  24.     client: OpenAI = Field(default=None, exclude=True)  # 显式声明 client 字段
  25.     def __init__(self, api_key: str, base_url: str, model_name: str = chat_model, **data: Any):
  26.         super().__init__(**data)
  27.         self.api_key = api_key
  28.         self.base_url = base_url
  29.         self.model_name = model_name
  30.         self.client = OpenAI(api_key=self.api_key, base_url=self.base_url)  # 使用传入的api_key和base_url初始化 client 实例
  31.     @property
  32.     def metadata(self) -> LLMMetadata:
  33.         """Get LLM metadata."""
  34.         return LLMMetadata(
  35.             model_name=self.model_name,
  36.         )
  37.     @llm_completion_callback()
  38.     def complete(self, prompt: str, **kwargs: Any) -> CompletionResponse:
  39.         response = self.client.chat.completions.create(model=self.model_name, messages=[{"role": "user", "content": prompt}])
  40.         if hasattr(response, 'choices') and len(response.choices) > 0:
  41.             response_text = response.choices[0].message.content
  42.             return CompletionResponse(text=response_text)
  43.         else:
  44.             raise Exception(f"Unexpected response format: {response}")
  45.     @llm_completion_callback()
  46.     def stream_complete(
  47.         self, prompt: str, **kwargs: Any
  48.     ) -> Generator[CompletionResponse, None, None]:
  49.         response = self.client.chat.completions.create(
  50.             model=self.model_name,
  51.             messages=[{"role": "user", "content": prompt}],
  52.             stream=True
  53.         )
  54.         try:
  55.             for chunk in response:
  56.                 chunk_message = chunk.choices[0].delta
  57.                 if not chunk_message.content:
  58.                     continue
  59.                 content = chunk_message.content
  60.                 yield CompletionResponse(text=content, delta=content)
  61.         except Exception as e:
  62.             raise Exception(f"Unexpected response format: {e}")
  63. llm = OurLLM(api_key=api_key, base_url=base_url, model_name=chat_model)
复制代码
2.构建其需要利用的算数工具

  
  1. import sys
  2. import os
  3. sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
  4. from llama_index.core.agent import ReActAgent
  5. from llama_index.core.tools import FunctionTool
  6. def multiply(a: float, b: float) -> float:
  7.     """Multiply two numbers and returns the product"""
  8.     return a * b
  9. def add(a: float, b: float) -> float:
  10.     """Add two numbers and returns the sum"""
  11.     return a + b
  12. def main():
  13.     multiply_tool = FunctionTool.from_defaults(fn=multiply)
  14.     add_tool = FunctionTool.from_defaults(fn=add)
  15.     # 创建ReActAgent实例
  16.     agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)
  17.     response = agent.chat("20+(2*4)等于多少?使用工具计算每一步")
  18.     print(response)
复制代码
3.完整代码

  
  1. import os
  2. from dotenv import load_dotenv
  3. from openai import OpenAI
  4. from pydantic import Field  # 导入Field,用于Pydantic模型中定义字段的元数据
  5. from llama_index.core.llms import (
  6.     CustomLLM,
  7.     CompletionResponse,
  8.     LLMMetadata,
  9. )
  10. from llama_index.core.embeddings import BaseEmbedding
  11. from llama_index.core.llms.callbacks import llm_completion_callback
  12. from typing import List, Any, Generator
  13. # 加载环境变量
  14. load_dotenv()
  15. # 从环境变量中读取api_key
  16. api_key = os.getenv('ZHIPU_API_KEY')
  17. base_url = "https://open.bigmodel.cn/api/paas/v4"
  18. chat_model = "glm-4-flash"
  19. # 定义OurLLM类,继承自CustomLLM基类
  20. class OurLLM(CustomLLM):
  21.     api_key: str = Field(default=api_key)
  22.     base_url: str = Field(default=base_url)
  23.     model_name: str = Field(default=chat_model)
  24.     client: OpenAI = Field(default=None, exclude=True)  # 显式声明 client 字段
  25.     def __init__(self, api_key: str, base_url: str, model_name: str = chat_model, **data: Any):
  26.         super().__init__(**data)
  27.         self.api_key = api_key
  28.         self.base_url = base_url
  29.         self.model_name = model_name
  30.         self.client = OpenAI(api_key=self.api_key, base_url=self.base_url)  # 使用传入的api_key和base_url初始化 client 实例
  31.     @property
  32.     def metadata(self) -> LLMMetadata:
  33.         """Get LLM metadata."""
  34.         return LLMMetadata(
  35.             model_name=self.model_name,
  36.         )
  37.     @llm_completion_callback()
  38.     def complete(self, prompt: str, **kwargs: Any) -> CompletionResponse:
  39.         response = self.client.chat.completions.create(model=self.model_name, messages=[{"role": "user", "content": prompt}])
  40.         if hasattr(response, 'choices') and len(response.choices) > 0:
  41.             response_text = response.choices[0].message.content
  42.             return CompletionResponse(text=response_text)
  43.         else:
  44.             raise Exception(f"Unexpected response format: {response}")
  45.     @llm_completion_callback()
  46.     def stream_complete(
  47.         self, prompt: str, **kwargs: Any
  48.     ) -> Generator[CompletionResponse, None, None]:
  49.         response = self.client.chat.completions.create(
  50.             model=self.model_name,
  51.             messages=[{"role": "user", "content": prompt}],
  52.             stream=True
  53.         )
  54.         try:
  55.             for chunk in response:
  56.                 chunk_message = chunk.choices[0].delta
  57.                 if not chunk_message.content:
  58.                     continue
  59.                 content = chunk_message.content
  60.                 yield CompletionResponse(text=content, delta=content)
  61.         except Exception as e:
  62.             raise Exception(f"Unexpected response format: {e}")
  63. llm = OurLLM(api_key=api_key, base_url=base_url, model_name=chat_model)
  64. import sys
  65. import os
  66. sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
  67. from llama_index.core.agent import ReActAgent
  68. from llama_index.core.tools import FunctionTool
  69. def multiply(a: float, b: float) -> float:
  70.     """Multiply two numbers and returns the product"""
  71.     return a * b
  72. def add(a: float, b: float) -> float:
  73.     """Add two numbers and returns the sum"""
  74.     return a + b
  75. def main():
  76.     multiply_tool = FunctionTool.from_defaults(fn=multiply)
  77.     add_tool = FunctionTool.from_defaults(fn=add)
  78.     # 创建ReActAgent实例
  79.     agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)
  80.     response = agent.chat("20+(2*4)等于多少?使用工具计算每一步")
  81.     print(response)if __name__ == "__main__":    main()
复制代码
用智谱glm-4-flash运行效果

GPT-4o运行效果

可以两个效果对比一下,好像也差不多,可能模子简单的情况下不易区分
二、多模子接入agent

借助Llama-index和OpenWeatherMap实现实时天气

OpenWeatherMap具体利用请参考OpenWeatherMap API指南-CSDN博客
1.构建大模子与(一、借助Llama-index实现agent)相同,这里着重说明后半部分

(首先需要去OpenWeatherMap官网注册申请“API密钥”:Members,并将密钥储存在.env文件中)
即OpenWeatherMap_API_KEY=
2.由于OpenWeatherMap是利用经度纬度获取天气,以是需要将地区转换为经纬度

  
  1. def get_coordinates(city: str) -> dict:
  2.     api_key = os.getenv('OpenWeatherMap_API_KEY')
  3.     # OpenWeatherMap API endpoint for current weather
  4.     url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}"
  5.     try:
  6.         # Send a GET request to the OpenWeatherMap API
  7.         response = requests.get(url)
  8.         # Check if the response is successful (status code 200)
  9.         if respo
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表