使用LlamaIndex与OpenAI构建具备自我评估能力的智能体AI系统

4 阅读3分钟

如何使用LlamaIndex和OpenAI构建具备自我评估能力的智能体AI系统

在本教程中,将构建一个使用LlamaIndex和OpenAI模型的高级智能体AI工作流。重点关注设计一个可靠的检索增强生成(RAG)智能体,使其能够基于证据进行推理、审慎使用工具,并评估自身输出的质量。通过围绕检索、答案合成和自我评估来构建系统,展示智能体模式如何超越简单的聊天机器人,朝着更值得信赖、可控的AI系统迈进,适用于研究和分析用例。

!pip -q install -U llama-index llama-index-llms-openai llama-index-embeddings-openai nest_asyncio
import os
import asyncio
import nest_asyncio
nest_asyncio.apply()

from getpass import getpass

if not os.environ.get("OPENAI_API_KEY"):
   os.environ["OPENAI_API_KEY"] = getpass("Enter OPENAI_API_KEY: ")

设置环境并安装运行智能体AI工作流所需的所有依赖项。在运行时安全地加载某中心的API密钥,确保凭证不会被硬编码。同时,准备笔记本以平滑处理异步执行。

from llama_index.core import Document, VectorStoreIndex, Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding

Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0.2)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")

texts = [
   "可靠的RAG系统将检索、合成和验证分开。常见的失败包括幻觉和浅层检索。",
   "RAG评估侧重于忠实性、答案相关性和检索质量。",
   "使用工具的智能体需要受约束的工具、验证和自我审查循环。",
   "一个稳健的工作流遵循检索、回答、评估和修订的步骤。"
]

docs = [Document(text=t) for t in texts]
index = VectorStoreIndex.from_documents(docs)
query_engine = index.as_query_engine(similarity_top_k=4)

配置某中心语言模型和嵌入模型,并为智能体构建一个紧凑的知识库。将原始文本转换为索引文档,以便智能体在推理过程中可以检索相关证据。

from llama_index.core.evaluation import FaithfulnessEvaluator, RelevancyEvaluator

faith_eval = FaithfulnessEvaluator(llm=Settings.llm)
rel_eval = RelevancyEvaluator(llm=Settings.llm)

def retrieve_evidence(q: str) -> str:
   r = query_engine.query(q)
   out = []
   for i, n in enumerate(r.source_nodes or []):
       out.append(f"[{i+1}] {n.node.get_content()[:300]}")
   return "\n".join(out)

def score_answer(q: str, a: str) -> str:
   r = query_engine.query(q)
   ctx = [n.node.get_content() for n in r.source_nodes or []]
   f = faith_eval.evaluate(query=q, response=a, contexts=ctx)
   r = rel_eval.evaluate(query=q, response=a, contexts=ctx)
   return f"Faithfulness: {f.score}\nRelevancy: {r.score}"

定义智能体使用的核心工具:证据检索和答案评估。实现忠实性和相关性的自动评分,使智能体能够判断自身响应的质量。

from llama_index.core.agent.workflow import ReActAgent
from llama_index.core.workflow import Context

agent = ReActAgent(
   tools=[retrieve_evidence, score_answer],
   llm=Settings.llm,
   system_prompt="""
始终首先检索证据。
生成结构化的答案。
评估答案,如果分数低则修改一次。
""",
   verbose=True
)

ctx = Context(agent)

创建基于ReAct的智能体,并定义其系统行为,指导其如何检索证据、生成答案和修订结果。同时初始化执行上下文,该上下文在交互过程中维护智能体的状态。这一步将工具和推理整合到一个单一的智能体工作流中。

async def run_brief(topic: str):
   q = f"设计一个可靠的RAG + 工具使用智能体工作流以及如何评估它。主题:{topic}"
   handler = agent.run(q, ctx=ctx)
   async for ev in handler.stream_events():
       print(getattr(ev, "delta", ""), end="")
   res = await handler
   return str(res)

topic = "RAG agent reliability and evaluation"
loop = asyncio.get_event_loop()
result = loop.run_until_complete(run_brief(topic))

print("\n\nFINAL OUTPUT\n")
print(result)

通过将一个主题传递到系统中并流式传输智能体的推理和输出来执行完整的智能体循环。允许智能体异步完成其检索、生成和评估周期。

总结而言,展示了智能体如何在最终确定答案之前检索支持性证据、生成结构化响应并评估其自身的忠实性和相关性。设计保持了模块化和透明性,使得可以轻松地使用额外的工具、评估器或特定领域知识源来扩展工作流。这种方法说明了如何将智能体AI与LlamaIndex和某中心模型结合使用,以构建功能更强大、在推理和响应方面也更可靠和更具自我意识的系统。