CH6 - SunXiaoXiang/learn_wowagent GitHub Wiki

使用 wow-RAG 方法一的方式

import os
from dotenv import load_dotenv
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
import sqlite3
from llama_index.llms.zhipuai import ZhipuAI
from llama_index.embeddings.zhipuai import ZhipuAIEmbedding


# 加载环境变量
load_dotenv()

# 从环境变量中读取 api_key
api_key = os.getenv('ZHIPU_API_KEY')

# 配置 API 参数
base_url = "https://open.bigmodel.cn/api/paas/v4/"
chat_model = "glm-4-flash"
emb_model = "embedding-2"

  
# 配置对话模型
llm = ZhipuAI(
	api_key=api_key,
	model=chat_model,
)

  

# 测试对话模型
print("测试对话模型:")
response = llm.complete("你是谁?")
print(response)

  

# 配置嵌入模型
embedding = ZhipuAIEmbedding(
	api_key=api_key,
	model=emb_model,
)

  

# 测试嵌入模型
print("\n测试嵌入模型:")
emb = embedding.get_text_embedding("你好呀呀")
print("嵌入向量长度:", len(emb))
print("嵌入向量类型:", type(emb))

构建索引

# 从指定文件读取,输入为List
from llama_index.core import SimpleDirectoryReader,Document
documents = SimpleDirectoryReader(input_files=['../docs/问答手册.txt']).load_data()

# 构建节点
from llama_index.core.node_parser import SentenceSplitter
transformations = [SentenceSplitter(chunk_size = 512)]

from llama_index.core.ingestion.pipeline import run_transformations
nodes = run_transformations(documents, transformations=transformations)

# 构建索引
from llama_index.vector_stores.faiss import FaissVectorStore
import faiss
from llama_index.core import StorageContext, VectorStoreIndex

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

构建问答模型

# 构建检索器
from llama_index.core.retrievers import VectorIndexRetriever
# 想要自定义参数,可以构造参数字典
kwargs = {'similarity_top_k': 5, 'index': index, 'dimensions': len(emb)} # 必要参数
retriever = VectorIndexRetriever(**kwargs)

# 构建合成器
from llama_index.core.response_synthesizers  import get_response_synthesizer
response_synthesizer = get_response_synthesizer(llm=llm, streaming=True)

# 构建问答引擎
from llama_index.core.query_engine import RetrieverQueryEngine
engine = RetrieverQueryEngine(
      retriever=retriever,
      response_synthesizer=response_synthesizer,
        )

用 RAG 回答一下

# 提问
question = "What are the applications of Agent AI systems ?"
response = engine.query(question)
for text in response.response_gen:
    print(text, end="")

我们可以把这个RAG当作一个工具给Agent调用,让它去思考。 先来配置问答工具

# 配置查询工具
from llama_index.core.tools import QueryEngineTool
from llama_index.core.tools import ToolMetadata
query_engine_tools = [
    QueryEngineTool(
        query_engine=engine,
        metadata=ToolMetadata(
            name="RAG工具",
            description=(
                "用于在原文中检索相关信息"
            ),
        ),
    ),
]

创建ReAct Agent

# 创建ReAct Agent
from llama_index.core.agent import ReActAgent
agent = ReActAgent.from_tools(query_engine_tools, llm=llm, verbose=True)

调用Agent

# 让Agent完成任务
# response = agent.chat("请问商标注册需要提供哪些文件?")
response = agent.chat("What are the applications of Agent AI systems ?")
print(response)

输出 还需要

pip install faiss-cpu