本期学习任务的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)
878

被折叠的 条评论
为什么被折叠?



