快速上手

本章对齐官方 Starter Tutorial (OpenAI):先跑 FunctionAgent + 工具,再接 VectorStoreIndex,最后 persist 与多轮 Context

示例 LLM 用 gpt-4o-mini。框架历史默认曾是 gpt-3.5-turbo,请以当前文档为准。先设置 OPENAI_API_KEY,并准备一个 data/ 目录(任意 .txt / .md 即可)。


最小 FunctionAgent

把普通 Python 函数当成工具:类型注解 + docstring 会进 schema,模型据此决定是否调用。

import asyncio
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.llms.openai import OpenAI

def multiply(a: float, b: float) -> float:
    """Useful for multiplying two numbers."""
    return a * b

agent = FunctionAgent(
    tools=[multiply],
    llm=OpenAI(model="gpt-4o-mini"),
    system_prompt="You are a helpful assistant that can multiply two numbers.",
)

async def main():
    response = await agent.run("What is 1234 * 4567?")
    print(str(response))

if __name__ == "__main__":
    asyncio.run(main())

发生了什么: 问题与工具 schema 送给 LLM → 选出 multiply 并填参 → 框架执行函数 → 模型把结果写成自然语言。官方建议用 async(许多 LLM 客户端支持异步)。


多轮对话:把 Context 传回去

FunctionAgent 的会话状态在 Context 里。同一 ctx 连续 run,模型才能记住上一轮。

from llama_index.core.workflow import Context

ctx = Context(agent)

response = await agent.run("My name is Logan", ctx=ctx)
response = await agent.run("What is my name?", ctx=ctx)
print(str(response))

每次都新建 Context 等于失忆。生产环境要把 Context 按用户 / 会话 ID 持久化(官方 Workflow 文档有 checkpoint 示例)。


五分钟 RAG:目录 → 索引 → 查询引擎

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("这些文档主要讲什么?")
print(response)

默认会用 OpenAI embedding(历史默认 text-embedding-ada-002)把切块写入内存向量库。把查询包成工具,就能和计算器一起交给 Agent:

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.llms.openai import OpenAI
import asyncio

documents = 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:
    """Answer questions about files in the data folder."""
    response = await query_engine.aquery(query)
    return str(response)

agent = FunctionAgent(
    tools=[multiply, search_documents],
    llm=OpenAI(model="gpt-4o-mini"),
    system_prompt="You can calculate and search local documents.",
)

async def main():
    print(await agent.run("文档里作者上大学做了什么?另外 7*8 等于多少?"))

if __name__ == "__main__":
    asyncio.run(main())

持久化,避免每次重新 embedding

index.storage_context.persist(persist_dir="storage")

from 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()

若索引建在 Chroma / pgvector / Qdrant 上,向量已经在库里,通常改为 VectorStoreIndex.from_vector_store(vector_store),不必再 load_index_from_storage。见 向量库集成

自定义过 transformations / embed_model 时,加载必须用同一套 Settings,否则检索空间对不齐。


第一个任务清单

  1. pip install llama-index,设置 OPENAI_API_KEY
  2. 运行最小 FunctionAgent 乘法脚本
  3. 把几份文档放进 data/,跑 VectorStoreIndex + as_query_engine
  4. 加上 search_documents 工具,问一个文档里才有的事实
  5. persist 后重启进程再查询;用同一个 Context 问两轮名字

下一步

评论