Datawhale AI Agent 学习笔记2- 接入RAG

    本期学习任务的Task2,主要任务是学习如何用LLama-index、RAG接入Agent、数据库创建Agent接入和搜索引擎Agent,需要学习的新知识、新技术比Task1更多,个人感觉难度也更大。

    跟着dw的教程走是最佳学习方法,按照教程的顺序,将第4到7章完成学习一遍,并从github上下载了dw的wow-rag项目,阅读tutorials目录下的四个md文档,对如何使用llamaindex的ReActAgent和FunctionTool(需要阅读代码,理解结合推理、行动);构建RAG,使用嵌入模型,读取知识库文件内容,构建Vector向量(学习配置对话模型和嵌入模型);也可以通过连接数据库、指定数据表配置对话模型和嵌入模型。

    RAG当作智能体可以调用的一个工具,可以参考dw之前发布的教程里多种不同的方式配置对话模型和嵌入模型,让RAG作为工具对不同类型的知识库进行检索,和大模型结合起来工作。

    下面是检索文言文知识的智能体样例代码。

import os
import faiss
import requests
from dotenv import load_dotenv
from openai import OpenAI
from pydantic import Field  # 导入Field,用于Pydantic模型中定义字段的元数据
from llama_index.core import SimpleDirectoryReader,Document,StorageContext, VectorStoreIndex
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.embeddings import BaseEmbedding
from llama_index.core.llms.callbacks import llm_completion_callback
from llama_index.core.ingestion.pipeline import run_transformations
from llama_index.llms.zhipuai import ZhipuAI
from llama_index.embeddings.zhipuai import ZhipuAIEmbedding
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.agent import ReActAgent
from llama_index.core.llms import (
    CustomLLM,
    CompletionResponse,
    LLMMetadata,
)
from llama_index.vector_stores.faiss import FaissVectorStore
from typing import List, Any, Generator
from llama_index.core.tools import FunctionTool


# 加载环境变量
load_dotenv()
# 从.env文件中读取api_key
api_key = os.getenv('ZHIPU_APIKEY')
base_url = "https://open.bigmodel.cn/api/paas/v4/"
bocha_url = 'https://api.bochaai.com/v1/web-search'
chat_model = "glm-4-flash"
emb_model = "embedding-3"

# 先把BOCHA_API_KEY填写到.env文件中去。
BOCHA_API_KEY = os.getenv('BOCHA_API_KEY')

#定义智谱大模型
'''
llm_zp=LLM(api_key=api_key, base_url=base_url, model_name=chat_model)
'''
llm_zp = ZhipuAI(
    api_key = api_key,
    model = chat_model,
)    
embedding = ZhipuAIEmbedding(
    api_key = api_key,
    model = emb_model,
)    


# 定义Bocha Web Search工具
def bocha_web_search_tool(query: str, count: int = 8) -> str:
    """
    使用Bocha Web Search API进行联网搜索,返回搜索结果的字符串。
    
    参数:
    - query: 搜索关键词
    - count: 返回的搜索结果数量

    返回:
    - 搜索结果的字符串形式
    """
    
    headers = {
        'Authorization': f'Bearer {BOCHA_API_KEY}',  # 请替换为你的API密钥
        'Content-Type': 'application/json'
    }
    data = {
        "query": query,
        "freshness": "noLimit", # 搜索的时间范围,例如 "oneDay", "oneWeek", "oneMonth", "oneYear", "noLimit"
        "summary": True, # 是否返回长文本摘要总结
        "count": count
    }

    response = requests.post(bocha_url, headers=headers, json=data)
    if response.status_code == 200:
        # 返回给大模型的格式化的搜索结果文本
        # 可以自己对博查的搜索结果进行自定义处理
        return str(response.json())
    else:
        raise Exception(f"API请求失败,状态码: {response.status_code}, 错误信息: {response.text}")
#定义搜索引擎
search_tool = FunctionTool.from_defaults(fn=bocha_web_search_tool)
search_agent = ReActAgent.from_tools([search_tool], llm=llm_zp, verbose=True)


'''
emb = embedding.get_text_embedding("你好呀呀")
print(len(emb))
print(type(emb))
'''
documents = SimpleDirectoryReader(input_files=['../docs/文言文知识.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_zp, streaming=True)

# 构建问答引擎
engine = RetrieverQueryEngine(retriever=retriever, response_synthesizer=response_synthesizer)
question = "我想搜索文言文里修辞的概念" #此处模拟用户输入
response = engine.query(question)
if len(response.resp_gen) > 0:
    responseByRAG = ''
    for text in response.response_gen:
        print(text, end="")
        responseByRAG = responseByRAG + text + "\r\n"
    print(responseByRAG)
    mypromp = "你是一位文言文专家,请回答文言文问题:"+question+"。\r\n这是提供你参考的内容:"+responseByRAG
    messages = [
        {"role": "user", "content": mypromp}
    ]
    # 调用API
    llmresponse = client.chat.completions.create(model=chat_model,  messages=messages, )
    print(llmresponse.choices[0].message.content)    
else:
    #通过搜索引擎检索
    print(f"通过搜索引擎检索 {question}")
    responseBySrch = search_agent.chat(f"请帮我搜索以下内容:{question}")
    print(responseBySrch)

        

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值