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

wow-agent---task2使用llama-index创建Agent

一:创造俩个函数,multiply和add作为fuction calling被LLM当做工具来使用,实现计算一个简单的计算题:

from llama_index.llms.ollama import Ollama
from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool

llm = Ollama(model="qwen2.5:latest", request_timeout=120.0)

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()

计算后的输出:

二:统计数据库中俩个部门的人数总和,数据库如下:

首先要创建数据库,这个以sqlite为例进行创建

import sqlite3
# 创建数据库
sqllite_path = 'llmdb.db'
con = sqlite3.connect(sqllite_path)

# 创建表
sql = """
CREATE TABLE `section_stats` (
  `部门` varchar(100) DEFAULT NULL,
  `人数` int(11) DEFAULT NULL
);
"""
c = con.cursor()
cursor = c.execute(sql)
c.close()
con.close()

写入数据

import sqlite3
# 创建数据库
sqllite_path = 'llmdb.db'

con = sqlite3.connect(sqllite_path)
c = con.cursor()
data = [
    ["专利部",22],
    ["商标部",25],
]
for item in data:
    sql = """
    INSERT INTO section_stats (部门,人数) 
    values('%s','%d')
    """%(item[0],item[1])
    c.execute(sql)
    con.commit()
c.close()
con.close()

最后让LLM调用add工具进行俩个部门的人数统计

from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, Settings
from llama_index.core.tools import QueryEngineTool
from llama_index.core import SQLDatabase
from llama_index.core.query_engine import NLSQLTableQueryEngine
from sqlalchemy import create_engine, select
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding

llm = Ollama(model="qwen2.5:latest", request_timeout=120.0)
embedding = OllamaEmbedding(model_name="bge-m3:latest")
Settings.llm = llm
Settings.embed_model = embedding
## 创建数据库查询引擎
engine = create_engine("sqlite:///llmdb.db")
# prepare data
sql_database = SQLDatabase(engine, include_tables=["section_stats"])
query_engine = NLSQLTableQueryEngine(
    sql_database=sql_database,
    tables=["section_stats"],
    llm=Settings.llm,
    embed_model=Settings.embed_model
)

def multiply(a: float, b: float) -> float:
    """将两个数字相乘并返回乘积。"""
    return a * b

multiply_tool = FunctionTool.from_defaults(fn=multiply)

def add(a: float, b: float) -> float:
    """将两个数字相加并返回它们的和。"""
    return a + b

add_tool = FunctionTool.from_defaults(fn=add)

# 把数据库查询引擎封装到工具函数对象中
staff_tool = QueryEngineTool.from_defaults(
    query_engine,
    name="section_staff",
    description="查询部门的人数。"
)

agent = ReActAgent.from_tools([multiply_tool, add_tool, staff_tool], verbose=True)
response = agent.chat("请从数据库表中获取`专利部`和`商标部`的人数,并将这两个部门的人数相加!最后输出想加的结果")
print(response)

三:RAG实现,这里使用faiss向量数据库---pip install faiss-cpu,有条件的也可以用faiss-gpu。

文本内容huahua.txt

from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.core import SimpleDirectoryReader,Document
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.ingestion.pipeline import run_transformations
from llama_index.vector_stores.faiss import FaissVectorStore
import faiss
from llama_index.core import StorageContext, VectorStoreIndex
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.response_synthesizers  import get_response_synthesizer
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.tools import QueryEngineTool
from llama_index.core.tools import ToolMetadata
from llama_index.core.agent import ReActAgent

embedding = OllamaEmbedding(model_name="bge-m3:latest")
llm = Ollama(model="qwen2.5:latest", request_timeout=120.0)

#加载文档
documents = SimpleDirectoryReader(input_files=['huahua.txt']).load_data()
# 构建节点
transformations = [SentenceSplitter(chunk_size = 512)]
nodes = run_transformations(documents, transformations=transformations)

# 构建索引
emb = embedding.get_text_embedding("你好呀呀")
vector_store = FaissVectorStore(faiss_index=faiss.IndexFlatL2(len(emb)))
storage_context = StorageContext.from_defaults(vector_store=vector_store)

index = VectorStoreIndex(
    nodes = nodes,
    storage_context=storage_context,
    embed_model = embedding,
)

# 构建检索器,想要自定义参数,可以构造参数字典
kwargs = {'similarity_top_k': 5, 'index': index, 'dimensions': len(emb)}
# 必要参数
retriever = VectorIndexRetriever(**kwargs)
# 构建合成器
response_synthesizer = get_response_synthesizer(llm=llm, streaming=True)
# 构建问答引擎
engine = RetrieverQueryEngine(
      retriever=retriever,
      response_synthesizer=response_synthesizer,
        )

query_engine_tools = [
    QueryEngineTool(
        query_engine=engine,
        metadata=ToolMetadata(
            name="RAG工具",
            description=(
                "用于在原文中检索相关信息"
            ),
        ),
    ),
]

agent = ReActAgent.from_tools(query_engine_tools, llm=llm, verbose=True)
response = agent.chat("花花是谁?")
print(response)

四:这里实现的是调用web_search_tool来进行网页摘要的问答,我这里直接写了个mock输出用于调用,你可以使用curl或者restful借口来实现获取信息,agent的实现原理都是一样。

from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.core.tools import FunctionTool

api_key='ollama'
base_url = 'http://localhost:11434/v1'
chat_model = Ollama(model="qwen2.5:latest", request_timeout=120.0)
emb_model = OllamaEmbedding(model_name="bge-m3:latest")

def web_search_tool(query):
    res="1月17日,商务部等8部门办公厅发布关于做好2025年汽车以旧换新工作的通知。通知称,2025年,对个人消费者报废2012年6月30日前注册登记的汽油乘用车、2014年6月30日前注册登记的柴油及其他燃料乘用车,或2018年12月31日前注册登记的新能源乘用车,并购买纳入工业和信息化部《减免车辆购置税的新能源汽车车型目录》的新能源乘用车或2.0升及以下排量燃油乘用车,给予一次性定额补贴。对报废上述符合条件旧车并购买新能源乘用车的,补贴2万元;对报废上述符合条件燃油乘用车并购买2.0升及以下排量燃油乘用车的,补贴1.5万元。在一个自然年度内,每位个人消费者最多享受一次汽车报废更新补贴。2025年,对个人消费者转让登记在本人名下的乘用车,并购买乘用车新车的,给予一次性补贴支持,购买新能源乘用车补贴最高不超过1.5万元,购买燃油乘用车补贴最高不超过1.3万元。个人消费者申请汽车置换更新补贴,转让的既有乘用车登记在本人名下的时间最迟不得晚于2025年1月8日。每位个人消费者在一个自然年度内最多可享受一次汽车置换更新补贴,就同一辆新车只能选择申领汽车报废更新补贴或者置换更新补贴。汽车以旧换新补贴资金按照总体9:1的原则实行央地共担,并分地区确定具体分担比例。其中,对东部省份按8.5:1.5比例分担,对中部省份按9:1比例分担,对西部省份按9.5:0.5比例分担。各省级财政根据中央资金分配情况按比例安排配套资金,省以下经费分担办法由省级财政确定。"
    return res
    #https://baijiahao.baidu.com/s?id=1821492416829025049

llm = Ollama(model="qwen2.5:latest", request_timeout=120.0)
search_tool = FunctionTool.from_defaults(fn=web_search_tool)
from llama_index.core.agent import ReActAgent
agent = ReActAgent.from_tools([search_tool], llm=llm, verbose=True)

query = "汽车以旧换新补贴资金的比例是怎么分配的?"
response = agent.chat(f"请帮我搜索以下内容:{query}")
print(response)

后记:要充分了解agent的相关概念如LLM模型,嵌入模型,工具调用实现,向量数据库,RAG实现等,再熟悉llama-index的基本使用,以上代码还是可以很轻松的学会,况且你还有各种在线的LLM帮你来解答,个人认为未来agent开发模型会向低代码或无代码化继续演进,接合 RAG可以实现让LLM快速理解领域知识,从而可以更好的深入服务于各个垂直行业的业务。


http://www.kler.cn/a/509529.html

相关文章:

  • [创业之路-254]:《华为数字化转型之道》-1-华为是一个由客户需求牵引、高度数字化、高度智能化、由无数个闭环流程组成的价值创造、评估、分配系统。
  • Jenkins-Pipeline简述
  • FastADMIN实现网站启动时执行程序的方法
  • Spring 核心技术解析【纯干货版】- Ⅶ:Spring 切面编程模块 Spring-Instrument 模块精讲
  • 微信小程序
  • 蓝桥杯刷题第二天——背包问题
  • Ubuntu 空闲硬盘挂载到 文件管理器的 other locations
  • Apache 如何设置 Upgrade-Insecure-Requests 报头 ?
  • 用于零镜头视频对象分割的深度感知测试时训练
  • PyTorch基本功能与实现代码
  • 浙江安吉成新照明电器:Acrel-1000DP 分布式光伏监控系统应用探索
  • vector迭代器的使用以及迭代器失效
  • 非科班转码第5年零241天
  • STM32 物联网智能家居 (五) 设备子系统之点亮LED灯
  • wireshark 网络分析工具
  • 1.5 GPT 模型家族全解析:从 GPT-1 到 GPT-4 的演进与创新
  • Scrapy 爬取 Bangumi 网站的分页与详情页数据
  • unity——Preject3——摄像机动画
  • Java并发05 - AQS共享模式的数据结构
  • windows 搭建flutter环境,开发windows程序
  • 新星杯-ESP32智能硬件开发--ESP32的I/O组成
  • 《重生到现代之从零开始的C++生活》—— 类和对象1
  • “深入浅出”系列之FFmpeg:(3)音视频开发的学习路线和必备知识
  • Transformer 与注意力机制原理说明与面试笔试题
  • ASP.NET Core 基础知识---依赖注入(DI)---生命周期和作用域
  • 中国数字安全产业年度报告(2024)