ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【Agent】9. 如何构建一个聊天机器人 - SEC文件分析案例

【Agent】9. 如何构建一个聊天机器人 - SEC文件分析案例 LlamaIndex作为数据和语言学习模型(LLMs)之间的桥梁提供了一套工具包使您能够围绕数据建立查询接口用于各种任务如问答和摘要。1. 案例目标本教程将指导您使用数据代理(Data Agent)构建一个上下文增强的聊天机器人。这个由LLMs驱动的代理能够智能地执行关于您的数据的任务。最终结果是一个聊天机器人代理配备了LlamaIndex提供的强大数据接口工具可以回答关于您数据的问题。我们将构建一个10-K聊天机器人使用来自Dropbox的原始UBER 10-K HTML文件。用户可以与聊天机器人交互询问与10-K文件相关的问题。2. 技术栈与核心依赖LlamaIndex- 作为数据和LLMs之间的桥梁OpenAI API- 提供语言模型和嵌入模型Unstructured- 用于解析HTML文件VectorStoreIndex- 用于构建向量索引SubQuestionQueryEngine- 用于综合多个10-K文件的答案FunctionAgent- 用于构建聊天机器人代理核心依赖包%pip install llama-index-readers-file %pip install llama-index-embeddings-openai %pip install llama-index-agent-openai %pip install llama-index-llms-openai %pip install llama-index-question-gen-openai %pip install unstructured3. 环境配置首先需要设置OpenAI API密钥import os os.environ[OPENAI_API_KEY] sk-...然后配置LlamaIndex的全局默认设置from llama_index.core import Settings from llama_index.llms.openai import OpenAI from llama_index.embeddings.openai import OpenAIEmbedding # 全局默认设置 Settings.llm OpenAI(modelgpt-4o-mini) Settings.embed_model OpenAIEmbedding(model_nametext-embedding-3-large) Settings.chunk_size 512 Settings.chunk_overlap 644. 案例实现4.1 数据摄取首先下载原始的10-K文件(2019-2022年)# 注意代码示例假设您在Jupyter notebook中操作 # 下载文件 !mkdir data !wget https://www.dropbox.com/s/948jr9cfs7fgj99/UBER.zip?dl1 -O data/UBER.zip !unzip data/UBER.zip -d data使用Unstructured库将HTML文件解析为格式化文本from llama_index.readers.file import UnstructuredReader from pathlib import Path years [2022, 2021, 2020, 2019] loader UnstructuredReader() doc_set {} all_docs [] for year in years: year_docs loader.load_data( filePath(f./data/UBER/UBER_{year}.html), split_documentsFalse ) # 将年份元数据插入到每一年 for d in year_docs: d.metadata {year: year} doc_set[year] year_docs all_docs.extend(year_docs)4.2 为每年设置向量索引为每年设置一个向量索引。每个向量索引允许我们询问关于特定年份10-K文件的问题# 初始化简单向量索引 # 注意如果索引已经加载不要运行此单元格 from llama_index.core import VectorStoreIndex, StorageContext index_set {} for year in years: storage_context StorageContext.from_defaults() cur_index VectorStoreIndex.from_documents( doc_set[year], storage_contextstorage_context, ) index_set[year] cur_index storage_context.persist(persist_dirf./storage/{year})要从磁盘加载索引# 从磁盘加载索引 from llama_index.core import StorageContext, load_index_from_storage index_set {} for year in years: storage_context StorageContext.from_defaults( persist_dirf./storage/{year} ) cur_index load_index_from_storage( storage_context, ) index_set[year] cur_index4.3 设置子问题查询引擎以综合跨10-K文件的答案由于我们有4年的文档访问权限我们可能不仅想询问关于特定年份10-K文档的问题还想询问需要分析所有10-K文件的问题。为此我们可以使用子问题查询引擎。它将查询分解为子查询每个子查询由单个向量索引回答并综合结果以回答整体查询。首先为每个向量索引定义一个QueryEngineToolfrom llama_index.core.tools import QueryEngineTool individual_query_engine_tools [ QueryEngineTool.from_defaults( query_engineindex_set[year].as_query_engine(), namefvector_index_{year}, description( useful for when you want to answer queries about the f {year} SEC 10-K for Uber ), ) for year in years ]创建子问题查询引擎from llama_index.core.query_engine import SubQuestionQueryEngine query_engine SubQuestionQueryEngine.from_defaults( query_engine_toolsindividual_query_engine_tools, )4.4 设置聊天机器人代理我们使用LlamaIndex数据代理来设置外部聊天机器人代理它可以访问一组工具。具体来说我们将使用FunctionAgent利用OpenAI API函数调用。首先为子问题查询引擎定义QueryEngineToolquery_engine_tool QueryEngineTool.from_defaults( query_enginequery_engine, namesub_question_query_engine, description( useful for when you want to answer queries that require analyzing multiple SEC 10-K documents for Uber ), )将工具组合成一个单一列表tools individual_query_engine_tools [query_engine_tool]创建代理from llama_index.core.agent.workflow import FunctionAgent from llama_index.llms.openai import OpenAI agent FunctionAgent(toolstools, llmOpenAI(modelgpt-4o))4.5 设置聊天循环agent FunctionAgent(toolstools, llmOpenAI(modelgpt-4o)) ctx Context(agent) while True: text_input input(User: ) if text_input exit: break response await agent.run(text_input, ctxctx) print(fAgent: {response})5. 案例效果5.1 简单问候当测试简单的hello查询时代理不使用任何工具from llama_index.core.workflow import Context # 设置此特定交互的上下文 ctx Context(agent) response await agent.run(hi, i am bob, ctxctx) print(str(response)) # 输出: Hello Bob! How can I assist you today?5.2 特定年份查询当测试关于特定年份10-K的查询时代理将使用相关的向量索引工具response await agent.run( What were some of the biggest risk factors in 2020 for Uber?, ctxctx ) print(str(response)) # 输出: In 2020, some of the biggest risk factors for Uber included: # 1. Legal and Regulatory Risks... # 2. Data Privacy and Security Risks... # ... (详细列出2020年的风险因素)5.3 跨年份比较查询当测试比较/对比跨年份风险因素的查询时代理将使用子问题查询引擎工具cross_query_str ( Compare/contrast the risk factors described in the Uber 10-K across years. Give answer in bullet points. ) response await agent.run(cross_query_str, ctxctx) print(str(response)) # 输出: Heres a comparison of the risk factors for Uber across the years 2020, 2021, and 2022: # - COVID-19 Impact: # - 2020: The pandemic significantly affected business operations... # - 2021: Continued impact of the pandemic was a concern... # - 2022: The pandemics impact was less emphasized... # ... (详细比较各年份的风险因素)6. 案例实现思路6.1 数据处理与索引构建案例首先通过Unstructured库解析HTML格式的SEC 10-K文件将非结构化数据转换为LlamaIndex可以处理的Document对象。然后为每年的文档创建单独的向量索引这样可以对特定年份的文档进行高效查询。6.2 多文档查询处理为了处理跨多个文档的查询案例采用了子问题查询引擎(SubQuestionQueryEngine)。这个引擎能够将复杂查询分解为多个子查询每个子查询针对特定的向量索引执行然后将结果综合起来形成最终答案。6.3 代理架构设计聊天机器人基于FunctionAgent构建它能够根据查询内容智能选择合适的工具。代理可以访问两种类型的工具针对特定年份的向量索引工具子问题查询引擎工具(用于跨年份查询)这种设计使代理能够根据查询的复杂性自动选择最合适的处理方式。6.4 上下文管理案例使用Context对象来管理对话状态使代理能够保持对话上下文提供更连贯的交互体验。7. 扩展建议7.1 扩展数据源添加更多公司的SEC文件构建跨公司比较分析功能集成其他类型的财务文档如10-Q(季度报告)或8-K(当前报告)添加实时新闻源提供最新的公司动态信息7.2 增强查询能力实现更复杂的查询类型如趋势分析、预测模型添加可视化功能如图表生成展示财务数据趋势集成专门的财务分析工具提供比率计算、行业比较等功能7.3 优化性能与用户体验实现查询缓存减少重复查询的响应时间添加查询历史和收藏功能方便用户回顾重要信息实现查询建议和自动完成功能提升用户交互体验7.4 高级功能集成多模态能力处理图表、表格等非文本信息实现自定义警报功能当检测到特定财务指标变化时通知用户添加协作功能允许多用户共享查询结果和注释8. 总结本案例展示了如何使用LlamaIndex构建一个基于SEC 10-K文件的智能聊天机器人。通过结合向量索引、子问题查询引擎和FunctionAgent我们创建了一个能够理解复杂查询并提供准确答案的系统。该案例的核心价值在于数据整合将非结构化的财务文档转换为可查询的结构化知识智能路由代理能够根据查询类型自动选择最合适的处理工具跨文档分析能够综合多个文档的信息提供全面的答案可扩展架构系统设计允许轻松添加新的数据源和查询工具这个案例为构建领域特定的问答系统提供了一个很好的模板可以扩展到金融、法律、医疗等需要处理大量专业文档的领域。
返回列表