【橘子大模型】基于Rag构建Agent简版

一、简介

如我上文所说,我们其实已经具备了各种langchain的操作知识,那么现在我们整合一下这些知识,我们来基于rag和agent来构建我们的应用。
那么为什么要这么做呢,或者说rag和agent分别起到什么作用,在我们整合之后。
我们已经知道了agent可以为我们去调用一堆tool,不管是自己实现的tool还是langchain内置的。
那么如果这些tool获取的知识不够呢或者比较本地化的知识网上没有呢,无法从外部获取呢。
你应该记得我们之前操作rag的时候是对一些pdf文档进行了切分,然后我们把这些内容向量化到了数据库中,作为知识来提供检索。

换言之,我们可以把这个向量库当成一个外挂的知识库。那么我们也知道agent是可以调用tool的。这些条件之下,我们是不是可以自己写一个tool,去对rag进行检索,然后把这个自己写的tool加入到agent调用的tools中,然后访问的时候,让agent来为我们选择走哪里。这样就统一了。

二、代码实现

from langchain_core.documents import Document
from langchain_ollama import ChatOllama
from dotenv import load_dotenv
from langchain_ollama import OllamaEmbeddings
from langchain_community.utilities.sql_database import SQLDatabase
from langchain_community.agent_toolkits.sql.toolkit import SQLDatabaseToolkit
from langchain_elasticsearch import ElasticsearchStore
from langchain_core.tools import tool
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver
from langchain_core.messages import HumanMessage


model_name = "qwen2.5:14b"
load = load_dotenv("./.env")
llm = ChatOllama(base_url = "http://127.0.0.1:11434",model = model_name,temperature = 1.0,num_predict = 2000)

# tools
db = SQLDatabase.from_uri("mysql+pymysql://用户:密码@ip:端口/数据库名")
toolkit = SQLDatabaseToolkit(db=db, llm=llm)
tools = toolkit.get_tools()

# 构建向量化组件
embed = OllamaEmbeddings(model=model_name)
# 存储es
elastic_vector_search = ElasticsearchStore(
    es_url="http://localhost:9200",
    index_name="langchain_index",
    embedding=embed,
)

retriever = elastic_vector_search.as_retriever(
    search_type="similarity",
    search_kwargs={"k":1}
)

@tool
def check_food(query:str) -> str:
    """
    你必须使用这个tool,根据传入的参数query来回答问题
    """
    return retriever.invoke(query)

# 把我们自己的tool添加到tools数组中,此时就等于把rag做成了tool,加入到了我们的目标调用中
tools.append(check_food)

# agent
memory = MemorySaver()
print("**********************打印一下现在的tool")
print(tools)
agent_executor = create_react_agent(llm, tools, checkpointer=memory)

# 用户问题
config = {"configurable": {"thread_id": "abc123"}}
for step in agent_executor.stream(
    {"messages": [HumanMessage(content="潍坊市有哪些美食")]},
    config,
    stream_mode="values",
):
    step["messages"][-1].pretty_print()

我们这里把调用rag封装为了一个tool,然后绑定到agent上,由agent来为我们选择执行哪个tool,只不过我这里有点问题,
我向量化存储用的模型是:llama3.2:latest 他的向量维度是3072
但是这个模型比较小,所以我检索的时候换了一个qwen2.5:14b 他的向量维度是5120。这样对不上会报错。于是我就去修改了es索引的

"vector": {
        "type": "dense_vector",
        "dims": 5120,
        "index": true,
        "similarity": "cosine",
        "index_options": {
          "type": "int8_hnsw",
          "m": 16,
          "ef_construction": 100
        }
      }

dims这个值,但是es这个维度限制在1-4096。所以建议大家测试的时候最好统一向量维度,代码就是上面那样,你问一个问题,如果答案在数据库中他会给你调用SQLDatabase这个tool去查数据库的表,如果是不在,那就去rag中调用check_food这个tool向量检索,如果都有可能都会调用,agent会搞定一切的。
这里我就不调整了,我们下面来看监控和测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值