入门教程(使用OpenAI)
本教程将向您展示如何开始使用LlamaIndex构建智能体。我们将从一个基础示例开始,然后演示如何添加RAG(检索增强生成)功能。
设置您的OpenAI API密钥
Section titled “Set your OpenAI API key”LlamaIndex 默认使用 OpenAI 的 gpt-3.5-turbo。请通过将其设置为环境变量来确保您的代码可以访问 API 密钥:
# MacOS/Linuxexport OPENAI_API_KEY=XXXXX
# Windowsset OPENAI_API_KEY=XXXXX让我们从一个简单的示例开始,使用一个能够通过调用工具执行基本乘法的智能体。创建一个名为 starter.py 的文件:
import asynciofrom llama_index.core.agent.workflow import FunctionAgentfrom llama_index.llms.openai import OpenAI
# Define a simple calculator tooldef multiply(a: float, b: float) -> float: """Useful for multiplying two numbers.""" return a * b
# Create an agent workflow with our calculator toolagent = FunctionAgent( tools=[multiply], llm=OpenAI(model="gpt-4o-mini"), system_prompt="You are a helpful assistant that can multiply two numbers.",)
async def main(): # Run the agent response = await agent.run("What is 1234 * 4567?") print(str(response))
# Run the agentif __name__ == "__main__": asyncio.run(main())这将输出类似:The result of \( 1234 \times 4567 \) is \( 5,678,678 \).
发生的情况是:
- 智能体被赋予一个问题:
What is 1234 * 4567? - 在底层,这个问题以及工具的模式(名称、文档字符串和参数)被传递给了LLM
- 智能体选择了
multiply工具并向该工具写入参数 - 智能体从工具接收到结果,并将其插入到最终响应中
AgentWorkflow 也能够记住先前的消息。这包含在 AgentWorkflow 的 Context 中。
如果传入 Context,智能体将使用它来继续对话。
from llama_index.core.workflow import Context
# create contextctx = Context(agent)
# run agent with contextresponse = await agent.run("My name is Logan", ctx=ctx)response = await agent.run("What is my name?", ctx=ctx)现在让我们通过添加文档搜索功能来增强我们的智能体。首先,让我们通过终端获取一些示例数据:
mkdir datawget https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt -O data/paul_graham_essay.txt您的目录结构现在应该看起来像这样:
├── starter.py └── data └── paul_graham_essay.txt
现在我们可以创建一个使用LlamaIndex搜索文档的工具。默认情况下,我们的VectorStoreIndex将使用来自OpenAI的text-embedding-ada-002嵌入来嵌入和检索文本。
我们修改后的 starter.py 应该如下所示:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReaderfrom llama_index.core.agent.workflow import FunctionAgentfrom llama_index.llms.openai import OpenAIimport asyncioimport os
# Create a RAG tool using LlamaIndexdocuments = SimpleDirectoryReader("data").load_data()index = VectorStoreIndex.from_documents(documents)query_engine = index.as_query_engine()
def multiply(a: float, b: float) -> float: """Useful for multiplying two numbers.""" return a * b
async def search_documents(query: str) -> str: """Useful for answering natural language questions about an personal essay written by Paul Graham.""" response = await query_engine.aquery(query) return str(response)
# Create an enhanced workflow with both toolsagent = FunctionAgent( tools=[multiply, search_documents], llm=OpenAI(model="gpt-4o-mini"), system_prompt="""You are a helpful assistant that can perform calculations and search through documents to answer questions.""",)
# Now we can ask questions about the documents or do calculationsasync def main(): response = await agent.run( "What did the author do in college? Also, what's 7 * 8?" ) print(response)
# Run the agentif __name__ == "__main__": asyncio.run(main())智能体现在可以无缝切换使用计算器和搜索文档来回答问题。
为了避免每次重新处理文档,您可以将索引持久化到磁盘:
# Save the indexindex.storage_context.persist("storage")
# Later, load the indexfrom llama_index.core import StorageContext, load_index_from_storage
storage_context = StorageContext.from_defaults(persist_dir="storage")index = load_index_from_storage(storage_context)query_engine = index.as_query_engine()index = VectorStoreIndex.from_vector_store(vector_store)这只是您使用LlamaIndex智能体所能实现的开端!您可以:
- 为你的智能体添加更多工具
- 使用不同的LLM
- 使用系统提示自定义智能体的行为
- 添加流式处理能力
- 实现人机协同工作流程
- 使用多个智能体协作完成任务
一些有用的后续链接: