AWS Machine Learning Blog 05月30日 04:17
Create an agentic RAG application for advanced knowledge discovery with LlamaIndex, and Mistral in Amazon Bedrock
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了如何使用LlamaIndex框架构建Agentic Retrieval Augmented Generation (RAG) 应用,这是一种将大型语言模型(FMs)与外部知识检索和自主代理能力相结合的先进AI方法。该应用能够动态访问和处理信息,分解复杂任务,使用外部工具,进行推理,并适应各种环境。文章详细讲解了使用Mistral Large 2 FM在Amazon Bedrock上构建研究工具的示例,该工具可以与Arxiv、GitHub、TechCrunch和DuckDuckGo等网站交互,并访问包含文档和内部知识的知识库。此外,还介绍了两种构建RAG框架的方案:使用Amazon OpenSearch Serverless进行文档集成,以及使用Amazon Bedrock Knowledge Bases。

💡Agentic RAG应用是一种先进的AI方法,它整合了大型语言模型(FMs)、外部知识检索和自主代理能力,能够动态访问和处理信息,执行多步骤流程,并生成复杂输出。

🛠️LlamaIndex框架用于连接FMs与外部数据源,支持从数据库、API、PDF等来源摄取、构建和检索信息,从而为AI应用赋能代理和RAG功能。在本文的示例中,LlamaIndex被用于构建一个研究工具。

📚该解决方案提供了两种构建RAG框架的选项:一是使用LlamaIndex与Amazon OpenSearch Serverless进行文档集成,将文档分割成块并存储在向量存储中;二是使用Amazon Bedrock Knowledge Bases,该服务可以自动处理文档的加载、处理和分块,并快速创建新的向量存储。

🔑AgentRunner和AgentWorker是该方案的两个主要组件。AgentRunner负责管理对话历史、创建和维护任务、执行任务步骤,并提供用户界面;AgentWorker则处理逐步推理和任务执行。

Agentic Retrieval Augmented Generation (RAG) applications represent an advanced approach in AI that integrates foundation models (FMs) with external knowledge retrieval and autonomous agent capabilities. These systems dynamically access and process information, break down complex tasks, use external tools, apply reasoning, and adapt to various contexts. They go beyond simple question answering by performing multi-step processes, making decisions, and generating complex outputs.

In this post, we demonstrate an example of building an agentic RAG application using the LlamaIndex framework. LlamaIndex is a framework that connects FMs with external data sources. It helps ingest, structure, and retrieve information from databases, APIs, PDFs, and more, enabling the agent and RAG for AI applications.

This application serves as a research tool, using the Mistral Large 2 FM on Amazon Bedrock generate responses for the agent flow. The example application interacts with well-known websites, such as Arxiv, GitHub, TechCrunch, and DuckDuckGo, and can access knowledge bases containing documentation and internal knowledge.

This application can be further expanded to accommodate broader use cases requiring dynamic interaction with internal and external APIs, as well as the integration of internal knowledge bases to provide more context-aware responses to user queries.

Solution overview

This solution uses the LlamaIndex framework to build an agent flow with two main components: AgentRunner and AgentWorker. The AgentRunner serves as an orchestrator that manages conversation history, creates and maintains tasks, executes task steps, and provides a user-friendly interface for interactions. The AgentWorker handles the step-by-step reasoning and task execution.

For reasoning and task planning, we use Mistral Large 2 on Amazon Bedrock. You can use other text generation FMs available from Amazon Bedrock. For the full list of supported models, see Supported foundation models in Amazon Bedrock. The agent integrates with GitHub, arXiv, TechCrunch, and DuckDuckGo APIs, while also accessing internal knowledge through a RAG framework to provide context-aware answers.

In this solution, we present two options for building the RAG framework:

You can select the RAG implementation option that best suits your preference and developer skill level.

The following diagram illustrates the solution architecture.

In the following sections, we present the steps to implement the agentic RAG application. You can also find the sample code in the GitHub repository.

Prerequisites

The solution has been tested in the AWS Region us-west-2. Complete the following steps before proceeding:

    Set up the following resources:
      Create an Amazon SageMaker Create a SageMaker domain user profile. Launch Amazon SageMaker Studio, select JupyterLab, and create a space. Select the instance t3.medium and the image SageMaker Distribution 2.3.1, then run the space.
    Request model access:
      On the Amazon Bedrock console, choose Model access in the navigation pane. Choose Modify model access. Select the models Mistral Large 2 (24.07), Amazon Titan Text Embeddings V2, and Rerank 1.0 from the list, and request access to these models.
    Configure AWS Identity and Access Management (IAM) permissions:
      In the SageMaker console, go to the SageMaker user profile details and find the execution role that the SageMaker notebook uses. It should look like AmazonSageMaker-ExecutionRole-20250213T123456.
    In the IAM console, create an inline policy for this execution role. that your role can perform the following actions:
      Access to Amazon Bedrock services including:
        Reranking capabilities Retrieving information Invoking models Listing available foundation models
      IAM permissions to:
        Create policies Attach policies to roles within your account
      Full access to Amazon OpenSearch Serverless service
    Run the following command in the JupyterLab notebook terminal to download the sample code from GitHub:
git initgit remote add origin https://github.com/aws-samples/mistral-on-aws.gitgit sparse-checkout initgit sparse-checkout set "notebooks/mistral-llamaindex-agentic-rag"git pull origin main
    Finally, install the required Python packages by running the following command in the terminal:
cd mistral-llamaindex-agentic-ragpip install -r requirements.txt

Initialize the models

Initialize the FM used for orchestrating the agentic flow with Amazon Bedrock Converse API. This API provides a unified interface for interacting with various FMs available on Amazon Bedrock. This standardization simplifies the development process, allowing developers to write code one time and seamlessly switch between different models without adjusting for model-specific differences. In this example, we use the Mistral Large 2 model on Amazon Bedrock.

Next, initialize the embedding model from Amazon Bedrock, which is used for converting document chunks into embedding vectors. For this example, we use Amazon Titan Text Embeddings V2. See the following code:

# Initialise and configure the BedrockConverse LLM with the Mistral Large 2 model and set it as the default in Settingsfrom llama_index.llms.bedrock_converse import BedrockConversefrom llama_index.core import Settingsllm = BedrockConverse(model="mistral.mistral-large-2407-v1:0", max_tokens = 2048)Settings.llm = BedrockConverse(model="mistral.mistral-large-2407-v1:0", max_tokens = 2048)# Initialise and configure the embedding model with Amazon Titan Text Embeddings V2, and set it as the default in Settingsfrom llama_index.embeddings.bedrock import BedrockEmbeddingembed_model = BedrockEmbedding(model_name="amazon.titan-embed-text-v2:0")Settings.embed_model = BedrockEmbedding(model_name="amazon.titan-embed-text-v2:0")

Integrate API tools

Implement two functions to interact with the GitHub and TechCrunch APIs. The APIs shown in this post don’t require credentials. To provide clear communication between the agent and the foundation model, follow Python function best practices, including:

The following code sample shows the function that integrates with the GitHub API. After the function is created, use the FunctionTool.from_defaults() method to wrap the function as a tool and integrate it seamlessly into the LlamaIndex workflow.

See the code repository for the full code samples of the function that integrates with the TechCrunch API.

# Define a function to search GitHub repositories by topic, sorting by stars or update date, and return top resultsimport requestsdef github_search(topic: str, num_results: int = 3, sort_by: str = "stars") -> list:    """    Retrieve a specified number of GitHub repositories based on a given topic,     ranked by the specified criteria.    This function uses the GitHub API to search for repositories related to a     specific topic or keyword. The results can be sorted by the number of stars     (popularity) or the most recent update, with the most relevant repositories     appearing first according to the chosen sorting method.    Parameters:    -----------    topic : str        The topic or keyword to search for in GitHub repositories.        The topic cannot contain blank spaces.    num_results : int, optional        The number of repository results to retrieve. Defaults to 3.    sort_by : str, optional        The criterion for sorting the results. Options include:        - 'stars': Sort by the number of stars (popularity).        - 'updated': Sort by the date of the last update (most recent first).        Defaults to 'stars'.    Returns:    --------    list        A list of dictionaries, where each dictionary contains information         about a repository. Each dictionary includes:        - 'html_url': The URL of the repository.        - 'description': A brief description of the repository.        - 'stargazers_count': The number of stars (popularity) the repository has.    """    url = f"https://api.github.com/search/repositories?q=topic:{topic}&sort={sort_by}&order=desc"    response = requests.get(url).json()    code_repos = [        {            'html_url': item['html_url'],            'description': item['description'],            'stargazers_count': item['stargazers_count'],        }        for item in response['items'][:num_results]    ]    return code_reposgithub_tool = FunctionTool.from_defaults(fn=github_search)

For arXiv and DuckDuckGo integration, we use LlamaIndex’s pre-built tools instead of creating custom functions. You can explore other available pre-built tools in the LlamaIndex documentation to avoid duplicating existing solutions.

# Import and configure the ArxivToolSpec and DuckDuckGoSearchToolSpec from LlamaIndex prebuilt toolsfrom llama_index.tools.arxiv import ArxivToolSpecfrom llama_index.tools.duckduckgo import DuckDuckGoSearchToolSpecarxiv_tool = ArxivToolSpec()search_tool = DuckDuckGoSearchToolSpec()api_tools = arxiv_tool.to_tool_list() + search_tool.to_tool_list()# Consolidate all tools into one list. api_tools.extend([news_tool, github_tool])

RAG option 1: Document integration with Amazon OpenSearch Serverless

Next, programmatically build the RAG component using LlamaIndex to load, process, and chunk documents.  store the embedding vectors in Amazon OpenSearch Serverless. This approach offers greater flexibility for advanced scenarios, such as loading various file types (including .epub and .ppt) and selecting advanced chunking strategies based on file types (such as HTML, JSON, and code).

Before moving forward, you can download some PDF documents for testing from the AWS website using the following command, or you can use your own documents. The following documents are AWS guides that help in choosing the right generative AI service (such as Amazon Bedrock or Amazon Q) based on use case, customization needs, and automation potential. They also assist in selecting AWS machine learning (ML) services (such as SageMaker) for building models, using pre-trained AI, and using cloud infrastructure.

# download test documents from below links!wget -O docs/genai_on_aws.pdf https://docs.aws.amazon.com/pdfs/decision-guides/latest/generative-ai-on-aws-how-to-choose/generative-ai-on-aws-how-to-choose.pdf?did=wp_card&trk=wp_card#guide!wget -O docs/ml_on_aws.pdf https://docs.aws.amazon.com/pdfs/decision-guides/latest/machine-learning-on-aws-how-to-choose/machine-learning-on-aws-how-to-choose.pdf?did=wp_card&trk=wp_card#guide

Load the PDF documents using SimpleDirectoryReader() in the following code. For a full list of supported file types, see the LlamaIndex documentation.

# use Llamaindex to load documents from llama_index.core import SimpleDirectoryReaderloader = SimpleDirectoryReader('docs/')documents = loader.load_data()

Next, create an Amazon OpenSearch Serverless collection as the vector database. Check the utils.py file for details on the create_collection() function.

# Create Amazon OpenSearch Serverless collection from utils import *import sagemaker import randomregion_name = "us-west-2"suffix = random.randrange(1, 500)collection_name = "llamaindex-blog-"+str(suffix)notebook_execution_role = sagemaker.get_execution_role()endpoint = create_collection(collection_name, notebook_execution_role)

After you create the collection, create an index to store embedding vectors:

## create an index in the collectionindex_name = "pdf-rag"create_index(index_name, endpoint, emb_dim=1024)

Next, use the following code to implement a document search system using LlamaIndex integrated with Amazon OpenSearch Serverless. It first sets up AWS authentication to securely access OpenSearch Service, then configures a vector client that can handle 1024-dimensional embeddings (specifically designed for the Amazon Titan Embedding V2 model). The code processes input documents by breaking them into manageable chunks of 1,024 tokens with a 20-token overlap, converts these chunks into vector embeddings, and stores them in the OpenSearch Serverless vector index. You can select a different or more advanced chunking strategy by modifying the transformations parameter in the VectorStoreIndex.from_documents() method. For more information and examples, see the LlamaIndex documentation.

import boto3from llama_index.vector_stores.opensearch import  OpensearchVectorStore,   OpensearchVectorClientfrom opensearchpy import RequestsHttpConnection, AWSV4SignerAuthfrom llama_index.core import VectorStoreIndex, StorageContextfrom llama_index.core.node_parser import SentenceSplitter## integrate Amazon OpenSearch Serverless collection and index to llamaindex dim = 1024 # Amazon Titan Embedding V2 model dimension service = 'aoss'credentials = boto3.Session().get_credentials()awsauth = AWSV4SignerAuth(credentials, region_name, service)client = OpensearchVectorClient(    endpoint,     index_name,     dim,     embedding_field="vector",     text_field="chunk",    http_auth=awsauth,    use_ssl=True,    verify_certs=True,    connection_class=RequestsHttpConnection,)# initialise vector store and save document chunks to the vector store vector_store = OpensearchVectorStore(client)storage_context = StorageContext.from_defaults(vector_store=vector_store)index = VectorStoreIndex.from_documents(    documents,     storage_context=storage_context,    transformations=[SentenceSplitter(chunk_size=1024, chunk_overlap=20)])

You can add a reranking step in the RAG pipeline, which improves the quality of information retrieved by making sure that the most relevant documents are presented to the language model, resulting in more accurate and on-topic responses:

from llama_index.postprocessor.bedrock_rerank import AWSBedrockRerankreranker = AWSBedrockRerank(    top_n=3,    model_id="amazon.rerank-v1:0",#  another rerank model option is: cohere.rerank-v3-5:0    region_name="us-west-2",)query_engine = index.as_query_engine(    similarity_top_k=10,    node_postprocessors=[reranker],)

Use the following code to test the RAG framework. You can compare results by enabling or disabling the reranker model.

response = query_engine.query(    "In which situation should I use Amazon Bedrock over Amazon SageMaker?",)

Next, convert the vector store into a LlamaIndex QueryEngineTool, which requires a tool name and a comprehensive description. This tool is then combined with other API tools to create an agent worker that executes tasks in a step-by-step manner. The code initializes an AgentRunner to orchestrate the entire workflow, analyzing text inputs and generating responses. The system can be configured to support parallel tool execution for improved efficiency.

# create QueryEngineTool based on the OpenSearch vector store from llama_index.core.tools import QueryEngineTool, ToolMetadataoss_tool = QueryEngineTool(        query_engine=query_engine,        metadata=ToolMetadata(            name="oss_guide_tool",            description="""            These decision guides help users select appropriate AWS machine learning and generative AI services based on specific needs.             They cover pre-built solutions, customizable platforms, and infrastructure options for ML workflows,             while outlining how generative AI can automate processes, personalize content, augment data, reduce costs,             and enable faster experimentation in various business contexts.""",        ),    )all_tools = api_tools +[oss_tool]agent_worker = FunctionCallingAgentWorker.from_tools(    all_tools,     llm=llm,     verbose=True, # Set verbose=True to display the full trace of steps.     system_prompt = system_prompt,    # allow_parallel_tool_calls = True  # Uncomment this line to allow multiple tool invocations)agent = AgentRunner(agent_worker)response = agent.chat(text_input)

You have now completed building the agentic RAG application using LlamaIndex and Amazon OpenSearch Serverless. You can test the chatbot application with your own questions. For example, ask about the latest news and features regarding Amazon Bedrock, or inquire about the latest papers and most popular GitHub repositories related to generative AI.

RAG option 2: Document integration with Amazon Bedrock Knowledge Bases

In this section, you use Amazon Bedrock Knowledge Bases to build the RAG framework. You can create an Amazon Bedrock knowledge base on the Amazon Bedrock console or follow the provided notebook example to create it programmatically. Create a new Amazon Simple Storage Service (Amazon S3) bucket for the knowledge base, then upload the previously downloaded files to this S3 bucket. You can select different embedding models and chunking strategies that work better for your data. After you create the knowledge base, remember to sync the data. Data synchronization might take a few minutes.

To enable your newly created knowledge base to invoke the rerank model, you need to modify its permissions. First, open the Amazon Bedrock console and locate the service role that matches the one shown in the following screenshot.

Choose the role and add the following provided IAM permission policy as an inline policy. This additional authorization grants your knowledge base the necessary permissions to successfully invoke the rerank model on Amazon Bedrock.

{    "Version": "2012-10-17",    "Statement": [        {            "Effect": "Allow",            "Action": "bedrock:InvokeModel",            "Resource": "arn:aws:bedrock:us-west-2::foundation-model/amazon.rerank-v1:0"        },        {            "Effect": "Allow",            "Action": "bedrock:Rerank",            "Resource": "*"        }    ]}

Use the following code to integrate the knowledge base into the LlamaIndex framework. Specific configurations can be provided in the retrieval_config parameter, where numberOfResults is the maximum number of retrieved chunks from the vector store, and overrideSearchType has two valid values: HYBRID and SEMANTIC. In the rerankConfiguration, you can optionally provide a rerank modelConfiguration and numberOfRerankedResults to sort the retrieved chunks by relevancy scores and select only the defined number of results. For the full list of available configurations for retrieval_config, refer to the Retrieve API documentation.

# Configure a knowledge base retriever using AmazonKnowledgeBasesRetrieverfrom llama_index.core.query_engine import RetrieverQueryEnginefrom llama_index.retrievers.bedrock import AmazonKnowledgeBasesRetriever# maximum number of relevant text chunks that will be retrieved# If you need quick, focused answers: lower numbers (1-3)# If you need detailed, comprehensive answers: higher numbers (5-10)top_k = 10# search mode options: HYBRID, SEMANTIC# HYBRID search combines the strengths of semantic search and keyword search # Balances semantic understanding with exact matching# https://docs.llamaindex.ai/en/stable/examples/retrievers/bedrock_retriever/search_mode = "HYBRID"kb_retriever = AmazonKnowledgeBasesRetriever(    knowledge_base_id=knowledge_base_id,    retrieval_config={        "vectorSearchConfiguration": {            "numberOfResults": top_k,            "overrideSearchType": search_mode,            'rerankingConfiguration': {                'bedrockRerankingConfiguration': {                    'modelConfiguration': {                        'modelArn': 'arn:aws:bedrock:us-west-2::foundation-model/amazon.rerank-v1:0'                    },                    'numberOfRerankedResults': 3                },                'type': 'BEDROCK_RERANKING_MODEL'            }        },            })kb_engine = RetrieverQueryEngine(retriever=kb_retriever)

Like the first option, you can create the knowledge base as a QueryEngineTool in LlamaIndex and combine it with other API tools. Then, you can create a FunctionCallingAgentWorker using these combined tools and initialize an AgentRunner to interact with them. By using this approach, you can chat with and take advantage of the capabilities of the integrated tools.

# Create a query tool for Bedrock Knowledge Basekb_tool = QueryEngineTool(        query_engine=kb_engine,        metadata=ToolMetadata(            name="kb_tool",            description="""            These decision guides help users select appropriate AWS machine learning and generative AI services based on specific needs.             They cover pre-built solutions, customizable platforms, and infrastructure options for ML workflows,             while outlining how generative AI can automate processes, personalize content, augment data, reduce costs,             and enable faster experimentation in various business contexts.""",        ),    )# Update the agent to include all API tools and the Knowledge Base tool.all_tools = api_tools +[kb_tool]agent_worker = FunctionCallingAgentWorker.from_tools(    all_tools,     llm=llm,     verbose=True, # Set verbose=True to display the full trace of steps.     system_prompt = system_prompt,    # allow_parallel_tool_calls = True  # Uncomment this line to allow multiple tool invocations)agent = AgentRunner(agent_worker)response = agent.chat(text_input)

Now you have built the agentic RAG solution using LlamaIndex and Amazon Bedrock Knowledge Bases.

Clean up

When you finish experimenting with this solution, use the following steps to clean up the AWS resources to avoid unnecessary costs:

    In the Amazon S3 console, delete the S3 bucket and data created for this solution. In the OpenSearch Service console, delete the collection that was created for storing the embedding vectors. In the Amazon Bedrock Knowledge Bases console, delete the knowledge base you created. In the SageMaker console, navigate to your domain and user profile, and launch SageMaker Studio to stop or delete the JupyterLab instance.

Conclusion

This post demonstrated how to build a powerful agentic RAG application using LlamaIndex and Amazon Bedrock that goes beyond traditional question answering systems. By integrating Mistral Large 2 as the orchestrating model with external APIs (GitHub, arXiv, TechCrunch, and DuckDuckGo) and internal knowledge bases, you’ve created a versatile technology discovery and research tool.

We showed you two complementary approaches to implement the RAG framework: a programmatic implementation using LlamaIndex with Amazon OpenSearch Serverless, providing maximum flexibility for advanced use cases, and a managed solution using Amazon Bedrock Knowledge Bases that simplifies document processing and storage with minimal configuration. You can try out the solution using the following code sample.

For more relevant information, see Amazon Bedrock, Amazon Bedrock Knowledge Bases, Amazon OpenSearch Serverless, and Use a reranker model in Amazon Bedrock. Refer to Mistral AI in Amazon Bedrock to see the latest Mistral models that are available on both Amazon Bedrock and AWS Marketplace.


About the Authors

Ying Hou, PhD, is a Sr. Specialist Solution Architect for Gen AI at AWS, where she collaborates with model providers to onboard the latest and most intelligent AI models onto AWS platforms. With deep expertise in Gen AI, ASR, computer vision, NLP, and time-series forecasting models, she works closely with customers to design and build cutting-edge ML and GenAI applications. Outside of architecting innovative AI solutions, she enjoys spending quality time with her family, getting lost in novels, and exploring the UK’s national parks.

Preston Tuggle is a Sr. Specialist Solutions Architect with the Third-Party Model Provider team at AWS. He focuses on working with model providers across Amazon Bedrock and Amazon SageMaker, helping them accelerate their go-to-market strategies through technical scaling initiatives and customer engagement.

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Agentic RAG LlamaIndex Amazon Bedrock AI应用
相关文章