LlamaIndex框架快速入门
1 为什么我们需要LlamaIndex
1.1 与大模型交互的方式
所有主流大语言模型,都是通过HTTP协议和客户端进行交互的。
1、使用curl工具访问阿里云百炼平台上的通义千问大模型
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "qwen-plus", "messages": [{"role": "system","content": "You are a helpful assistant."},{"role": "user", "content": "你是谁?"}]
}'
2、使用requests库,以HTTP协议访问大语言模型
import requests
import jsonurl = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"
headers = {"Authorization": "Bearer $DASHSCOPE_API_KEY","Content-Type": "application/json"
}
data = {"model": "qwen-plus","messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "怎么退款?"}]
}
response = requests.post(url, headers=headers, json=data)try:response.raise_for_status() # 检查请求是否成功print(json.dumps(response.json(), indent=2, ensure_ascii=False))
except requests.exceptions.RequestException as e:print(f"请求出错: {e}")if response.text:print(f"错误详情: {response.text}")
{"choices": [{"message": {"role": "assistant","content": "关于退款的具体操作,需要根据您购买的商品或服务的平台(如淘宝、京东、微信、支付宝、App Store、Steam等)以及支付方式来确定。以下是一般性的退款步骤,供您参考:\n\n### 一、电商平台退款(如淘宝、京东等)\n1. 打开购物App(如淘宝、京东);\n2. 进入「我的订单」页面;\n3. 找到需要退款的订单,点击「申请退款」或「退货退款」;\n4. 选择退款原因,填写相关信息;\n5. 提交申请,等待商家处理;\n6. 商家同意后,按提示寄回商品(如需退货);\n7. 商家收货后,退款将原路返回您的支付账户。\n\n### 二、应用内购买退款(如苹果App Store、Google Play)\n- **App Store**:\n 1. 打开设置 → 点击Apple ID → 媒体与购买项目 → 查看账户;\n 2. 进入“购买记录”,找到对应订单;\n 3. 点击“报告问题”并申请退款;\n 4. 或访问 [reportaproblem.apple.com](https://reportaproblem.apple.com) 在线申请。\n\n- **Google Play**:\n 1. 登录 [Google Play商店](https://play.google.com/store);\n 2. 进入“订单历史”;\n 3. 找到应用/商品,点击“申请退款”;\n 4. 通常在购买后48小时内可无理由退款。\n\n### 三、微信/支付宝付款退款\n- 若通过微信或支付宝扫码、转账或小程序付款:\n 1. 打开微信/支付宝;\n 2. 进入「账单」,找到该笔交易;\n 3. 点击「联系商户」或「申请退款」;\n 4. 与商家沟通退款事宜,商家后台操作退款后,款项将原路退回。\n\n### 四、注意事项\n- 退款时间:一般1-7个工作日到账,视支付方式而定;\n- 虚拟商品、已使用服务等可能不支持退款;\n- 如商家拒绝退款,可申请平台介入(如淘宝客服、京东客服等)。\n\n🔔 **建议**:请提供更具体的信息,例如:\n- 在哪个平台购买?\n- 是实物商品还是虚拟服务?\n- 是否已发货或使用?\n\n我可以为您定制更详细的退款指引。"},"finish_reason": "stop","index": 0,"logprobs": null}],"object": "chat.completion","usage": {"prompt_tokens": 22,"completion_tokens": 530,"total_tokens": 552,"prompt_tokens_details": {"cached_tokens": 0}},"created": 1758446051,"system_fingerprint": null,"model": "qwen-plus","id": "chatcmpl-e70bc63e-e337-4f26-8650-01dfad3e6f5a" }
1.2 构建Agent,定制大模型的业务能力
# 安装LlamaIndex依赖
! pip install llama-index
# 安装LlamaIndex集成Langchain的依赖
! pip install langchain
! pip install langchain_community
! pip install dashscope
! pip install llama-index-llms-langchain
! pip install llama-index-embeddings-langchain
! pip install llama-index-llms-dashscope
! pip install llama-index-embeddings-dashscope
1、构建Agent,与大模型进行交互
from langchain_community.chat_models import ChatTongyi
from llama_index.llms.langchain import LangChainLLM
from llama_index.core.agent.workflow import ReActAgent
from llama_index.core.workflow import Context
from config.load_api_key import load_api_key
from pydantic.types import SecretStrllm = LangChainLLM(ChatTongyi(model="qwen-plus",api_key=SecretStr(load_api_key("BAILIAN_API_KEY")))
)agent = ReActAgent(llm=llm)context = Context(agent)
response = await agent.run("怎么退款?",ctx=context)
response
2、增加Memory和Tools
from llama_index.core.memory.chat_memory_buffer import ChatMemoryBufferdef get_weather(city: str) -> str:"""获取某个城市的天气"""print(f"正在获取{city}的天气...")return f"{city}的天气很好!"agent2 = ReActAgent(llm=llm,tools=[get_weather])context2 = Context(agent2)memory = ChatMemoryBuffer.from_defaults(token_limit=400)
response2 = await agent2.run("广州天气怎么样?",ctx=context2,memory=memory)
print(response2.response)response3 = await agent2.run("长沙呢?",ctx=context2,memory=memory)
print(response3.response)
大模型服务平台百炼控制台
1.3 使用LlamaIndex快速实现RAG应用
from llama_index.embeddings.dashscope import DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingType
from llama_index.core import Settings,SimpleDirectoryReader,VectorStoreIndex
from langchain_community.chat_models import ChatTongyi
from config.load_api_key import load_api_key# 创建阿里云百炼大模型客户端
Settings.llm = ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY")
)# 初始化阿里云百炼的Embedding模型
Settings.embed_model = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,api_key=load_api_key("BAILIAN_API_KEY")
)# 加载数据
documents = SimpleDirectoryReader("resources").load_data()
# 创建索引
index = VectorStoreIndex.from_documents(documents)# 构建检索引擎
query_engine = index.as_query_engine()
# 请求,得到响应
response = query_engine.query("怎么退款?")
response
Response(response='如果商家尚未接单,您可以直接在订单页面取消订单,款项会自动退还至您的美团账户余额。若商家已接单,则需在订单页面点击“申请退款”进行操作。商家有24小时处理您的退款申请,若商家同意退款或在24小时内未处理,支付金额将退回至您的美团余额。若商家拒绝退款,您可点击“退款申诉”,由美团客服介入处理。', source_nodes=[NodeWithScore(node=TextNode(id_='5262041a-b4a2-40cc-bc9a-2b440f056c68', embedding=None, metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='ccdb829e-dbf0-42a1-bb5d-84d8962e96ff', node_type='4', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='8d536f16030385598309526c4ed2f61f4845df5b7b0bf30250b253c59a3bb27c'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='6722c752-be18-4096-988f-e2c8e6196b96', node_type='1', metadata={}, hash='95b9fb21e77be8269d178e0248f5ee0fa58cee54023b98a5171c558c4b949cc4')}, metadata_template='{key}: {value}', metadata_separator='\n', text='Q:在线支付取消订单后钱怎么返还?\r\n订单取消后,款项会在一个工作日内,直接返还到您的美团账户余额。\r\n\r\nQ:怎么查看退款是否成功?\r\n退款会在一个工作日之内到美团账户余额,可在“账号管理——我的账号”中查看是否到账。\r\n\r\nQ:美团账户里的余额怎么提现?\r\n余额可到美团网(meituan.com)——“我的美团→美团余额”里提取到您的银行卡或者支付宝账号,另外,余额也可直接用于支付外卖订单(限支持在线支付的商家)。\r\n\r\nQ:余额提现到账时间是多久?\r\n1-7个工作日内可退回您的支付账户。由于银行处理可能有延迟,具体以账户的到账时间为准。\r\n\r\nQ:申请退款后,商家拒绝了怎么办?\r\n申请退款后,如果商家拒绝,此时回到订单页面点击“退款申诉”,美团客服介入处理。\r\n\r\nQ:怎么取消退款呢?\r\n请在订单页点击“不退款了”,商家还会正常送餐的。\r\n\r\nQ:前面下了一个在线支付的单子,由于未付款,订单自动取消了,这单会计算我的参与活动次数吗?\r\n不会。如果是未支付的在线支付订单,可以先将订单取消(如果不取消需要15分钟后系统自动取消),订单无效后,此时您再下单仍会享受活动的优惠。\r\n\r\nQ:为什么我用微信订餐,却无法使用在线支付?\r\n目前只有网页版和美团外卖手机App(非美团手机客户端)订餐,才能使用在线支付,请更换到网页版和美团外卖手机App下单。\r\n\r\nQ:如何进行付款?\r\n美团外卖现在支持货到付款与在线支付,其中微信版与手机触屏版暂不支持在线支付。\r\n\r\nQ:如何查看可以在线支付的商家?\r\n你可以在商家列表页寻找带有“付”标识的商家,提交订单时可以选择支付方式。\r\n\r\nQ:美团外卖支持哪些支付方式?\r\n现已支持美团余额、支付宝、网银(储蓄卡、信用卡)。\r\n\r\nQ:在线支付订单如何退款?\r\n商家接单前,您可以直接取消订单,订单金额会自动退款到美团余额;商家接单后,您在点击“申请退款”,在线申请。提交退款申请之后,商家有24小时处理您的退款申请。商家同意退款,或24小时内没有处理您的退款申请,您的支付金额会退款至您的美团余额。\r\n\r\nQ:在线支付的过程中,订单显示未支付成功,款项却被扣了,怎么办?\r\n出现此问题,可能是银行/支付宝的数据没有即时传输至美团,请您不要担心,稍后刷新页面查看。 如半小时后仍显示"未付款",请先联系银行/支付宝客服,获取您扣款的交易号,然后致电美团外卖客服4008507777,我们会协助您解决。\r\n\r\nQ:哪些商家有优惠?都有些什么优惠?', mimetype='text/plain', start_char_idx=0, end_char_idx=1049, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.3288155210771332), NodeWithScore(node=TextNode(id_='6722c752-be18-4096-988f-e2c8e6196b96', embedding=None, metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='ccdb829e-dbf0-42a1-bb5d-84d8962e96ff', node_type='4', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='8d536f16030385598309526c4ed2f61f4845df5b7b0bf30250b253c59a3bb27c'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='5262041a-b4a2-40cc-bc9a-2b440f056c68', node_type='1', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='e2cf717ac3cd80141f2c75907f4bc73f7ab168026b2cd40ad6d43847f4383ac2'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='f0113afa-befd-4894-aa8b-7d322eccccaa', node_type='1', metadata={}, hash='d736e3bdec1a65af27dcb60951d71d0957ac41815e991c900a9147614b15a430')}, metadata_template='{key}: {value}', metadata_separator='\n', text='商家同意退款,或24小时内没有处理您的退款申请,您的支付金额会退款至您的美团余额。\r\n\r\nQ:在线支付的过程中,订单显示未支付成功,款项却被扣了,怎么办?\r\n出现此问题,可能是银行/支付宝的数据没有即时传输至美团,请您不要担心,稍后刷新页面查看。 如半小时后仍显示"未付款",请先联系银行/支付宝客服,获取您扣款的交易号,然后致电美团外卖客服4008507777,我们会协助您解决。\r\n\r\nQ:哪些商家有优惠?都有些什么优惠?\r\n有优惠的商家在商家列表页均含有优惠标识;具体的优惠可以查看活动详情或者商家详情页中的描述。\r\n\r\nQ:在新用户享受的优惠中,新用户的条件是什么?\r\n新用户是指第一次在美团外卖下单的用户(同一设备、同一手机号、同一账户仅可享受一次)。\r\n\r\nQ:我达到了满赠、满减的优惠的金额,为什么没有享受相关的优惠?\r\n满赠与满减优惠是以订单内菜品的总额来计算的,不包含配送费与包装费。\r\n\r\nQ:超时赔付是什么意思?\r\n超时赔付模式即:商家承诺一个送达时间和一个折扣,从用户下单时间开始计算,如果外卖超过了承诺时间才送到,该份外卖按照折扣价收取费用。由于恶劣天气、某些美食烹调时间过长、或者其他因素,商家会选择性的延长承诺时间或者不做承诺。预订单不参与超时赔付。\r\n\r\nQ:为什么提示我“账户存在异常,无法下单”?\r\n包含(但不仅限于)以下行为者,系统将自动予以封禁(客服无权解封):i)有过虚假交易(编造不存在真实买卖的订单);ii)有过恶意下单行为;\r\n\r\nQ:如何取消订单?\r\n如果商家尚未接单,您可以在订单详情页通过“取消订单”功能进行取消;如果商家已接单,则需要您电话联系后由商家取消订单。\r\n\r\nQ:我的订单为什么被取消了?\r\n如果商家5分钟未接您的订单,为了保障您的权益,系统将会为您自动取消订单;商家接单后可能由于无法联系到您、菜品售完等原因无法配送,因而取消了您的订单,具体原因可查看系统发送的短信或通知。\r\n\r\nQ:如何进行催单?\r\n您可以在订单状态页面点击“电话催单”按钮向商家商家催单。\r\n\r\nQ:刚下单发现信息填错了怎么办?\r\n如果商家尚未接单,您可以自主取消订单;如果商家已经接单,您可以电话联系商家后由对方取消订单。然后重新下一单。\r\n\r\nQ:我的订单是否被商家确认?\r\nApp用户可以在商家确认您的订单时收到推送通知,并且订单状态会实时更新;手机触屏版及微信用户可以刷新订单状态页查看。\r\n\r\nQ:预计送达的时间为什么与我实际收餐的时间不符?', mimetype='text/plain', start_char_idx=836, end_char_idx=1882, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.17640468890104155)], metadata={'5262041a-b4a2-40cc-bc9a-2b440f056c68': {'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, '6722c752-be18-4096-988f-e2c8e6196b96': {'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}})
1.4 总结
2 LlamaIndex基础组件介绍
2.1 LlamaIndex与RAG
先回顾一下1.3的案例
from llama_index.core import Settings,SimpleDirectoryReader,VectorStoreIndex
from langchain_community.chat_models import ChatTongyi
from config.load_api_key import load_api_key
from pydantic.types import SecretStr
from llama_index.embeddings.dashscope import DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingTypeSettings.llm = ChatTongyi(model="qwen-plus",api_key=SecretStr(load_api_key("BAILIAN_API_KEY"))
)Settings.embed_model = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,api_key=load_api_key("BAILIAN_API_KEY")
)documents = SimpleDirectoryReader("resources").load_data()
index = VectorStoreIndex.from_documents(documents)query_engine = index.as_query_engine()
response = query_engine.query("怎么退款?")
response
Response(response='如果商家尚未接单,您可以直接在订单详情页取消订单,款项会自动退还至您的美团账户余额。若商家已接单,您需要点击“申请退款”进行在线申请。提交退款申请后,商家有24小时处理时间。若商家同意退款或在24小时内未处理,支付金额将自动退回到您的美团余额。若商家拒绝退款,您可点击“退款申诉”,由美团客服介入处理。', source_nodes=[NodeWithScore(node=TextNode(id_='6eb46464-9e9f-49cb-bf8c-155ef26bf7bb', embedding=None, metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='bfd74119-615a-455a-b5d8-2dfffe04b3e7', node_type='4', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='8d536f16030385598309526c4ed2f61f4845df5b7b0bf30250b253c59a3bb27c'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='2b4e075d-5be3-4257-81e7-4f10d6dccec6', node_type='1', metadata={}, hash='95b9fb21e77be8269d178e0248f5ee0fa58cee54023b98a5171c558c4b949cc4')}, metadata_template='{key}: {value}', metadata_separator='\n', text='Q:在线支付取消订单后钱怎么返还?\r\n订单取消后,款项会在一个工作日内,直接返还到您的美团账户余额。\r\n\r\nQ:怎么查看退款是否成功?\r\n退款会在一个工作日之内到美团账户余额,可在“账号管理——我的账号”中查看是否到账。\r\n\r\nQ:美团账户里的余额怎么提现?\r\n余额可到美团网(meituan.com)——“我的美团→美团余额”里提取到您的银行卡或者支付宝账号,另外,余额也可直接用于支付外卖订单(限支持在线支付的商家)。\r\n\r\nQ:余额提现到账时间是多久?\r\n1-7个工作日内可退回您的支付账户。由于银行处理可能有延迟,具体以账户的到账时间为准。\r\n\r\nQ:申请退款后,商家拒绝了怎么办?\r\n申请退款后,如果商家拒绝,此时回到订单页面点击“退款申诉”,美团客服介入处理。\r\n\r\nQ:怎么取消退款呢?\r\n请在订单页点击“不退款了”,商家还会正常送餐的。\r\n\r\nQ:前面下了一个在线支付的单子,由于未付款,订单自动取消了,这单会计算我的参与活动次数吗?\r\n不会。如果是未支付的在线支付订单,可以先将订单取消(如果不取消需要15分钟后系统自动取消),订单无效后,此时您再下单仍会享受活动的优惠。\r\n\r\nQ:为什么我用微信订餐,却无法使用在线支付?\r\n目前只有网页版和美团外卖手机App(非美团手机客户端)订餐,才能使用在线支付,请更换到网页版和美团外卖手机App下单。\r\n\r\nQ:如何进行付款?\r\n美团外卖现在支持货到付款与在线支付,其中微信版与手机触屏版暂不支持在线支付。\r\n\r\nQ:如何查看可以在线支付的商家?\r\n你可以在商家列表页寻找带有“付”标识的商家,提交订单时可以选择支付方式。\r\n\r\nQ:美团外卖支持哪些支付方式?\r\n现已支持美团余额、支付宝、网银(储蓄卡、信用卡)。\r\n\r\nQ:在线支付订单如何退款?\r\n商家接单前,您可以直接取消订单,订单金额会自动退款到美团余额;商家接单后,您在点击“申请退款”,在线申请。提交退款申请之后,商家有24小时处理您的退款申请。商家同意退款,或24小时内没有处理您的退款申请,您的支付金额会退款至您的美团余额。\r\n\r\nQ:在线支付的过程中,订单显示未支付成功,款项却被扣了,怎么办?\r\n出现此问题,可能是银行/支付宝的数据没有即时传输至美团,请您不要担心,稍后刷新页面查看。 如半小时后仍显示"未付款",请先联系银行/支付宝客服,获取您扣款的交易号,然后致电美团外卖客服4008507777,我们会协助您解决。\r\n\r\nQ:哪些商家有优惠?都有些什么优惠?', mimetype='text/plain', start_char_idx=0, end_char_idx=1049, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.3288155210771332), NodeWithScore(node=TextNode(id_='2b4e075d-5be3-4257-81e7-4f10d6dccec6', embedding=None, metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='bfd74119-615a-455a-b5d8-2dfffe04b3e7', node_type='4', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='8d536f16030385598309526c4ed2f61f4845df5b7b0bf30250b253c59a3bb27c'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='6eb46464-9e9f-49cb-bf8c-155ef26bf7bb', node_type='1', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='e2cf717ac3cd80141f2c75907f4bc73f7ab168026b2cd40ad6d43847f4383ac2'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='1da56a9e-5dc9-4c96-9ddd-3eecb8753954', node_type='1', metadata={}, hash='d736e3bdec1a65af27dcb60951d71d0957ac41815e991c900a9147614b15a430')}, metadata_template='{key}: {value}', metadata_separator='\n', text='商家同意退款,或24小时内没有处理您的退款申请,您的支付金额会退款至您的美团余额。\r\n\r\nQ:在线支付的过程中,订单显示未支付成功,款项却被扣了,怎么办?\r\n出现此问题,可能是银行/支付宝的数据没有即时传输至美团,请您不要担心,稍后刷新页面查看。 如半小时后仍显示"未付款",请先联系银行/支付宝客服,获取您扣款的交易号,然后致电美团外卖客服4008507777,我们会协助您解决。\r\n\r\nQ:哪些商家有优惠?都有些什么优惠?\r\n有优惠的商家在商家列表页均含有优惠标识;具体的优惠可以查看活动详情或者商家详情页中的描述。\r\n\r\nQ:在新用户享受的优惠中,新用户的条件是什么?\r\n新用户是指第一次在美团外卖下单的用户(同一设备、同一手机号、同一账户仅可享受一次)。\r\n\r\nQ:我达到了满赠、满减的优惠的金额,为什么没有享受相关的优惠?\r\n满赠与满减优惠是以订单内菜品的总额来计算的,不包含配送费与包装费。\r\n\r\nQ:超时赔付是什么意思?\r\n超时赔付模式即:商家承诺一个送达时间和一个折扣,从用户下单时间开始计算,如果外卖超过了承诺时间才送到,该份外卖按照折扣价收取费用。由于恶劣天气、某些美食烹调时间过长、或者其他因素,商家会选择性的延长承诺时间或者不做承诺。预订单不参与超时赔付。\r\n\r\nQ:为什么提示我“账户存在异常,无法下单”?\r\n包含(但不仅限于)以下行为者,系统将自动予以封禁(客服无权解封):i)有过虚假交易(编造不存在真实买卖的订单);ii)有过恶意下单行为;\r\n\r\nQ:如何取消订单?\r\n如果商家尚未接单,您可以在订单详情页通过“取消订单”功能进行取消;如果商家已接单,则需要您电话联系后由商家取消订单。\r\n\r\nQ:我的订单为什么被取消了?\r\n如果商家5分钟未接您的订单,为了保障您的权益,系统将会为您自动取消订单;商家接单后可能由于无法联系到您、菜品售完等原因无法配送,因而取消了您的订单,具体原因可查看系统发送的短信或通知。\r\n\r\nQ:如何进行催单?\r\n您可以在订单状态页面点击“电话催单”按钮向商家商家催单。\r\n\r\nQ:刚下单发现信息填错了怎么办?\r\n如果商家尚未接单,您可以自主取消订单;如果商家已经接单,您可以电话联系商家后由对方取消订单。然后重新下一单。\r\n\r\nQ:我的订单是否被商家确认?\r\nApp用户可以在商家确认您的订单时收到推送通知,并且订单状态会实时更新;手机触屏版及微信用户可以刷新订单状态页查看。\r\n\r\nQ:预计送达的时间为什么与我实际收餐的时间不符?', mimetype='text/plain', start_char_idx=836, end_char_idx=1882, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.17640468890104155)], metadata={'6eb46464-9e9f-49cb-bf8c-155ef26bf7bb': {'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, '2b4e075d-5be3-4257-81e7-4f10d6dccec6': {'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}})
2.2 LlamaIndex基础组件
2.2.1 Prompts构建提示词
在和大语言模型交互的过程中,提示词是最为重要的工具。将对提示词的设计和处理封装成几个重要的参数,这也是构建AI应用最简单的一种方式。LlamaIndex提供了很方便的组件,可以用来构建提示词。
from llama_index.core import PromptTemplatetemplate = ("把语句\"{text}\"翻译成{language}")# 构建提示词模板
prompt_template = PromptTemplate(template=template)# 将提示词模板格式化为具体提示词
prompt = prompt_template.format(text="it is such a rainy day",language="中文")
print(prompt)# 将提示词模板格式化为聊天消息
messages = prompt_template.format_messages(text="it is such a rainy day",language="中文")
messages
除了可以对单条提示词进行格式化,还可以通过ChatPromptTemplate同时格式化多条消息记录
from llama_index.core.llms import ChatMessage,MessageRole
from llama_index.core import ChatPromptTemplate# 消息记录
message_templates = [ChatMessage(content="你是一个专业的翻译助手,负责将用户的语句翻译成{language}.",role=MessageRole.SYSTEM),ChatMessage(content="{text}",role=MessageRole.USER)
]# 构建提示词模板
chat_template = ChatPromptTemplate(message_templates=message_templates)# 格式化为文本
prompt = chat_template.format(text="it is such a rainy day",language="中文")
print(prompt)# 格式化为消息
messages = chat_template.format_messages(text="it is such a rainy day",language="中文")
print(messages)
另外,LlamaIndex还提供了一个RichPromptTemplate,也可以用来动态构建提示词
from llama_index.core.prompts import RichPromptTemplateprompt_template = RichPromptTemplate("把语句\"{{text}}\"翻译成{{language}}")prompt = prompt_template.format(text="it is such a rainy day",language="中文")
prompt
prompt_dicts = query_engine.get_prompts()
for key in prompt_dicts:print(key + ">>>")print(prompt_dicts[key])print("================")
response_synthesizer:text_qa_template>>> metadata={'prompt_type': <PromptType.QUESTION_ANSWER: 'text_qa'>} template_vars=['context_str', 'query_str'] kwargs={} output_parser=None template_var_mappings={} function_mappings={} default_template=PromptTemplate(metadata={'prompt_type': <PromptType.QUESTION_ANSWER: 'text_qa'>}, template_vars=['context_str', 'query_str'], kwargs={}, output_parser=None, template_var_mappings=None, function_mappings=None, template='Context information is below.\n---------------------\n{context_str}\n---------------------\nGiven the context information and not prior knowledge, answer the query.\nQuery: {query_str}\nAnswer: ') conditionals=[(<function is_chat_model at 0x00000207C9437F40>, ChatPromptTemplate(metadata={'prompt_type': <PromptType.CUSTOM: 'custom'>}, template_vars=['context_str', 'query_str'], kwargs={}, output_parser=None, template_var_mappings=None, function_mappings=None, message_templates=[ChatMessage(role=<MessageRole.SYSTEM: 'system'>, additional_kwargs={}, blocks=[TextBlock(block_type='text', text="You are an expert Q&A system that is trusted around the world.\nAlways answer the query using the provided context information, and not prior knowledge.\nSome rules to follow:\n1. Never directly reference the given context in your answer.\n2. Avoid statements like 'Based on the context, ...' or 'The context information ...' or anything along those lines.")]), ChatMessage(role=<MessageRole.USER: 'user'>, additional_kwargs={}, blocks=[TextBlock(block_type='text', text='Context information is below.\n---------------------\n{context_str}\n---------------------\nGiven the context information and not prior knowledge, answer the query.\nQuery: {query_str}\nAnswer: ')])]))] ================
response_synthesizer:refine_template>>> metadata={'prompt_type': <PromptType.REFINE: 'refine'>} template_vars=['query_str', 'existing_answer', 'context_msg'] kwargs={} output_parser=None template_var_mappings={} function_mappings={} default_template=PromptTemplate(metadata={'prompt_type': <PromptType.REFINE: 'refine'>}, template_vars=['query_str', 'existing_answer', 'context_msg'], kwargs={}, output_parser=None, template_var_mappings=None, function_mappings=None, template="The original query is as follows: {query_str}\nWe have provided an existing answer: {existing_answer}\nWe have the opportunity to refine the existing answer (only if needed) with some more context below.\n------------\n{context_msg}\n------------\nGiven the new context, refine the original answer to better answer the query. If the context isn't useful, return the original answer.\nRefined Answer: ") conditionals=[(<function is_chat_model at 0x00000207C9437F40>, ChatPromptTemplate(metadata={'prompt_type': <PromptType.CUSTOM: 'custom'>}, template_vars=['context_msg', 'query_str', 'existing_answer'], kwargs={}, output_parser=None, template_var_mappings=None, function_mappings=None, message_templates=[ChatMessage(role=<MessageRole.USER: 'user'>, additional_kwargs={}, blocks=[TextBlock(block_type='text', text="You are an expert Q&A system that strictly operates in two modes when refining existing answers:\n1. **Rewrite** an original answer using the new context.\n2. **Repeat** the original answer if the new context isn't useful.\nNever reference the original answer or context directly in your answer.\nWhen in doubt, just repeat the original answer.\nNew Context: {context_msg}\nQuery: {query_str}\nOriginal Answer: {existing_answer}\nNew Answer: ")])]))] ================
qa_query_engine = index.as_query_engine()qa_prompt_template_str = ("以下是参考信息.\n""---------------------\n""{{context_str}}\n""---------------------\n""根据参考信息回答⽤户的问题。回答问题时,模拟郭德纲的语⽓,让答案幽默⼀点。\n""问题: {{query_str}}\n""答案: "
)qa_prompt_template = RichPromptTemplate(qa_prompt_template_str)qa_query_engine.update_prompts({"response_synthesizer:text_qa_template": qa_prompt_template}
)answer = qa_query_engine.query("怎么退款")
answer
Response(response='哎哟喂,您这是吃完饭想把钱要回去啊?那得看您到哪步了!\n\n要是刚下单,手一抖想反悔——别慌,趁商家还没接单呢,您赶紧点个“取消订单”,这钱啊,就跟那退潮的海水似的,“哗”一下就退回您美团余额里了,自动的,比郭德纲甩包袱还利索!\n\n可要是商家已经接单了,骑手都跨上电动车了,您这时候说“不吃了”,那您就得走正规流程了——打开订单页面,点“申请退款”。商家有24小时考虑人生,要是他没搭理您,或者点了“同意”,那钱照常退到您余额里,一分不少。\n\n要是商家不同意?嘿,别急,咱还有王法呢!您再点个“退款申诉”,美团客服立马登场,跟法院判案似的,给您主持公道。\n\n总而言之一句话: \n**能撤赶紧撤,晚了就得求人;人不答应别硬来,客服兜底还能赢!**\n\n记住喽,钱不会丢,顶多慢点儿,比我还磨叽不了!', source_nodes=[NodeWithScore(node=TextNode(id_='6eb46464-9e9f-49cb-bf8c-155ef26bf7bb', embedding=None, metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='bfd74119-615a-455a-b5d8-2dfffe04b3e7', node_type='4', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='8d536f16030385598309526c4ed2f61f4845df5b7b0bf30250b253c59a3bb27c'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='2b4e075d-5be3-4257-81e7-4f10d6dccec6', node_type='1', metadata={}, hash='95b9fb21e77be8269d178e0248f5ee0fa58cee54023b98a5171c558c4b949cc4')}, metadata_template='{key}: {value}', metadata_separator='\n', text='Q:在线支付取消订单后钱怎么返还?\r\n订单取消后,款项会在一个工作日内,直接返还到您的美团账户余额。\r\n\r\nQ:怎么查看退款是否成功?\r\n退款会在一个工作日之内到美团账户余额,可在“账号管理——我的账号”中查看是否到账。\r\n\r\nQ:美团账户里的余额怎么提现?\r\n余额可到美团网(meituan.com)——“我的美团→美团余额”里提取到您的银行卡或者支付宝账号,另外,余额也可直接用于支付外卖订单(限支持在线支付的商家)。\r\n\r\nQ:余额提现到账时间是多久?\r\n1-7个工作日内可退回您的支付账户。由于银行处理可能有延迟,具体以账户的到账时间为准。\r\n\r\nQ:申请退款后,商家拒绝了怎么办?\r\n申请退款后,如果商家拒绝,此时回到订单页面点击“退款申诉”,美团客服介入处理。\r\n\r\nQ:怎么取消退款呢?\r\n请在订单页点击“不退款了”,商家还会正常送餐的。\r\n\r\nQ:前面下了一个在线支付的单子,由于未付款,订单自动取消了,这单会计算我的参与活动次数吗?\r\n不会。如果是未支付的在线支付订单,可以先将订单取消(如果不取消需要15分钟后系统自动取消),订单无效后,此时您再下单仍会享受活动的优惠。\r\n\r\nQ:为什么我用微信订餐,却无法使用在线支付?\r\n目前只有网页版和美团外卖手机App(非美团手机客户端)订餐,才能使用在线支付,请更换到网页版和美团外卖手机App下单。\r\n\r\nQ:如何进行付款?\r\n美团外卖现在支持货到付款与在线支付,其中微信版与手机触屏版暂不支持在线支付。\r\n\r\nQ:如何查看可以在线支付的商家?\r\n你可以在商家列表页寻找带有“付”标识的商家,提交订单时可以选择支付方式。\r\n\r\nQ:美团外卖支持哪些支付方式?\r\n现已支持美团余额、支付宝、网银(储蓄卡、信用卡)。\r\n\r\nQ:在线支付订单如何退款?\r\n商家接单前,您可以直接取消订单,订单金额会自动退款到美团余额;商家接单后,您在点击“申请退款”,在线申请。提交退款申请之后,商家有24小时处理您的退款申请。商家同意退款,或24小时内没有处理您的退款申请,您的支付金额会退款至您的美团余额。\r\n\r\nQ:在线支付的过程中,订单显示未支付成功,款项却被扣了,怎么办?\r\n出现此问题,可能是银行/支付宝的数据没有即时传输至美团,请您不要担心,稍后刷新页面查看。 如半小时后仍显示"未付款",请先联系银行/支付宝客服,获取您扣款的交易号,然后致电美团外卖客服4008507777,我们会协助您解决。\r\n\r\nQ:哪些商家有优惠?都有些什么优惠?', mimetype='text/plain', start_char_idx=0, end_char_idx=1049, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.3214395610345586), NodeWithScore(node=TextNode(id_='2b4e075d-5be3-4257-81e7-4f10d6dccec6', embedding=None, metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='bfd74119-615a-455a-b5d8-2dfffe04b3e7', node_type='4', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='8d536f16030385598309526c4ed2f61f4845df5b7b0bf30250b253c59a3bb27c'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='6eb46464-9e9f-49cb-bf8c-155ef26bf7bb', node_type='1', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='e2cf717ac3cd80141f2c75907f4bc73f7ab168026b2cd40ad6d43847f4383ac2'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='1da56a9e-5dc9-4c96-9ddd-3eecb8753954', node_type='1', metadata={}, hash='d736e3bdec1a65af27dcb60951d71d0957ac41815e991c900a9147614b15a430')}, metadata_template='{key}: {value}', metadata_separator='\n', text='商家同意退款,或24小时内没有处理您的退款申请,您的支付金额会退款至您的美团余额。\r\n\r\nQ:在线支付的过程中,订单显示未支付成功,款项却被扣了,怎么办?\r\n出现此问题,可能是银行/支付宝的数据没有即时传输至美团,请您不要担心,稍后刷新页面查看。 如半小时后仍显示"未付款",请先联系银行/支付宝客服,获取您扣款的交易号,然后致电美团外卖客服4008507777,我们会协助您解决。\r\n\r\nQ:哪些商家有优惠?都有些什么优惠?\r\n有优惠的商家在商家列表页均含有优惠标识;具体的优惠可以查看活动详情或者商家详情页中的描述。\r\n\r\nQ:在新用户享受的优惠中,新用户的条件是什么?\r\n新用户是指第一次在美团外卖下单的用户(同一设备、同一手机号、同一账户仅可享受一次)。\r\n\r\nQ:我达到了满赠、满减的优惠的金额,为什么没有享受相关的优惠?\r\n满赠与满减优惠是以订单内菜品的总额来计算的,不包含配送费与包装费。\r\n\r\nQ:超时赔付是什么意思?\r\n超时赔付模式即:商家承诺一个送达时间和一个折扣,从用户下单时间开始计算,如果外卖超过了承诺时间才送到,该份外卖按照折扣价收取费用。由于恶劣天气、某些美食烹调时间过长、或者其他因素,商家会选择性的延长承诺时间或者不做承诺。预订单不参与超时赔付。\r\n\r\nQ:为什么提示我“账户存在异常,无法下单”?\r\n包含(但不仅限于)以下行为者,系统将自动予以封禁(客服无权解封):i)有过虚假交易(编造不存在真实买卖的订单);ii)有过恶意下单行为;\r\n\r\nQ:如何取消订单?\r\n如果商家尚未接单,您可以在订单详情页通过“取消订单”功能进行取消;如果商家已接单,则需要您电话联系后由商家取消订单。\r\n\r\nQ:我的订单为什么被取消了?\r\n如果商家5分钟未接您的订单,为了保障您的权益,系统将会为您自动取消订单;商家接单后可能由于无法联系到您、菜品售完等原因无法配送,因而取消了您的订单,具体原因可查看系统发送的短信或通知。\r\n\r\nQ:如何进行催单?\r\n您可以在订单状态页面点击“电话催单”按钮向商家商家催单。\r\n\r\nQ:刚下单发现信息填错了怎么办?\r\n如果商家尚未接单,您可以自主取消订单;如果商家已经接单,您可以电话联系商家后由对方取消订单。然后重新下一单。\r\n\r\nQ:我的订单是否被商家确认?\r\nApp用户可以在商家确认您的订单时收到推送通知,并且订单状态会实时更新;手机触屏版及微信用户可以刷新订单状态页查看。\r\n\r\nQ:预计送达的时间为什么与我实际收餐的时间不符?', mimetype='text/plain', start_char_idx=836, end_char_idx=1882, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.1642555881797134)], metadata={'6eb46464-9e9f-49cb-bf8c-155ef26bf7bb': {'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, '2b4e075d-5be3-4257-81e7-4f10d6dccec6': {'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}})
关于答案优化,可以在构建索引时指定response_mode响应模式,默认值为compact:压缩,可以修改为refine:优化,这样初始化响应结果会进入优化模板的existing_answer参数,进行答案优化
refine_query_engine = index.as_query_engine(response_mode="refine")refine_prompt_template_str = ("把下面的原始答案,模拟郭德纲的语气,修改得更幽默一点。\n""---------------------\n""{{existing_answer}}\n""---------------------\n""答案: "
)refine_prompt_template = RichPromptTemplate(refine_prompt_template_str)refine_query_engine.update_prompts({"response_synthesizer:refine_template": refine_prompt_template}
)answer = refine_query_engine.query("怎么退款")
answer
Response(response='哎哟,这事儿得看“缘分”啊!\n\n您这订单刚下单,就跟刚点完菜还没上锅呢——这时候您反悔了?没事儿!赶紧取消,钱立马儿就原路返回,比您家楼下快递小哥跑得还利索,直接退到您美团账户里,一分不少,童叟无欺!\n\n可要是商家那边已经“叮”一声接单了,好家伙,厨师都把锅烧热了,葱花都炸香了,这时候您说不想要了?那可不能直接撤,得走个“正规流程”——您得上订单页面,点那个“申请退款”,跟写辞职信似的,正式提交一下。\n\n商家有24小时考虑人生,哦不,是处理您的退款。他们要是点头说“行,退吧”,那钱立马到账;要是24小时装哑巴、不搭理您,系统可不惯着他们——自动判您赢,钱照退,跟法院判决书似的,准得很!\n\n最怕的是,商家退了款又反悔,跟吃完饭嫌贵想把菜要回去一样——那您也别急,点“退款申诉”,咱美团客服立马登场,穿马甲、拿折扇,给您评评这个理儿,保证公道在人间!\n\n所以说啊,退个款,也是一出戏:有情有义的,皆大欢喜;耍赖使横的,自有王法伺候!', source_nodes=[NodeWithScore(node=TextNode(id_='6eb46464-9e9f-49cb-bf8c-155ef26bf7bb', embedding=None, metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='bfd74119-615a-455a-b5d8-2dfffe04b3e7', node_type='4', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='8d536f16030385598309526c4ed2f61f4845df5b7b0bf30250b253c59a3bb27c'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='2b4e075d-5be3-4257-81e7-4f10d6dccec6', node_type='1', metadata={}, hash='95b9fb21e77be8269d178e0248f5ee0fa58cee54023b98a5171c558c4b949cc4')}, metadata_template='{key}: {value}', metadata_separator='\n', text='Q:在线支付取消订单后钱怎么返还?\r\n订单取消后,款项会在一个工作日内,直接返还到您的美团账户余额。\r\n\r\nQ:怎么查看退款是否成功?\r\n退款会在一个工作日之内到美团账户余额,可在“账号管理——我的账号”中查看是否到账。\r\n\r\nQ:美团账户里的余额怎么提现?\r\n余额可到美团网(meituan.com)——“我的美团→美团余额”里提取到您的银行卡或者支付宝账号,另外,余额也可直接用于支付外卖订单(限支持在线支付的商家)。\r\n\r\nQ:余额提现到账时间是多久?\r\n1-7个工作日内可退回您的支付账户。由于银行处理可能有延迟,具体以账户的到账时间为准。\r\n\r\nQ:申请退款后,商家拒绝了怎么办?\r\n申请退款后,如果商家拒绝,此时回到订单页面点击“退款申诉”,美团客服介入处理。\r\n\r\nQ:怎么取消退款呢?\r\n请在订单页点击“不退款了”,商家还会正常送餐的。\r\n\r\nQ:前面下了一个在线支付的单子,由于未付款,订单自动取消了,这单会计算我的参与活动次数吗?\r\n不会。如果是未支付的在线支付订单,可以先将订单取消(如果不取消需要15分钟后系统自动取消),订单无效后,此时您再下单仍会享受活动的优惠。\r\n\r\nQ:为什么我用微信订餐,却无法使用在线支付?\r\n目前只有网页版和美团外卖手机App(非美团手机客户端)订餐,才能使用在线支付,请更换到网页版和美团外卖手机App下单。\r\n\r\nQ:如何进行付款?\r\n美团外卖现在支持货到付款与在线支付,其中微信版与手机触屏版暂不支持在线支付。\r\n\r\nQ:如何查看可以在线支付的商家?\r\n你可以在商家列表页寻找带有“付”标识的商家,提交订单时可以选择支付方式。\r\n\r\nQ:美团外卖支持哪些支付方式?\r\n现已支持美团余额、支付宝、网银(储蓄卡、信用卡)。\r\n\r\nQ:在线支付订单如何退款?\r\n商家接单前,您可以直接取消订单,订单金额会自动退款到美团余额;商家接单后,您在点击“申请退款”,在线申请。提交退款申请之后,商家有24小时处理您的退款申请。商家同意退款,或24小时内没有处理您的退款申请,您的支付金额会退款至您的美团余额。\r\n\r\nQ:在线支付的过程中,订单显示未支付成功,款项却被扣了,怎么办?\r\n出现此问题,可能是银行/支付宝的数据没有即时传输至美团,请您不要担心,稍后刷新页面查看。 如半小时后仍显示"未付款",请先联系银行/支付宝客服,获取您扣款的交易号,然后致电美团外卖客服4008507777,我们会协助您解决。\r\n\r\nQ:哪些商家有优惠?都有些什么优惠?', mimetype='text/plain', start_char_idx=0, end_char_idx=1049, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.3214395610345586), NodeWithScore(node=TextNode(id_='2b4e075d-5be3-4257-81e7-4f10d6dccec6', embedding=None, metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='bfd74119-615a-455a-b5d8-2dfffe04b3e7', node_type='4', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='8d536f16030385598309526c4ed2f61f4845df5b7b0bf30250b253c59a3bb27c'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='6eb46464-9e9f-49cb-bf8c-155ef26bf7bb', node_type='1', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='e2cf717ac3cd80141f2c75907f4bc73f7ab168026b2cd40ad6d43847f4383ac2'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='1da56a9e-5dc9-4c96-9ddd-3eecb8753954', node_type='1', metadata={}, hash='d736e3bdec1a65af27dcb60951d71d0957ac41815e991c900a9147614b15a430')}, metadata_template='{key}: {value}', metadata_separator='\n', text='商家同意退款,或24小时内没有处理您的退款申请,您的支付金额会退款至您的美团余额。\r\n\r\nQ:在线支付的过程中,订单显示未支付成功,款项却被扣了,怎么办?\r\n出现此问题,可能是银行/支付宝的数据没有即时传输至美团,请您不要担心,稍后刷新页面查看。 如半小时后仍显示"未付款",请先联系银行/支付宝客服,获取您扣款的交易号,然后致电美团外卖客服4008507777,我们会协助您解决。\r\n\r\nQ:哪些商家有优惠?都有些什么优惠?\r\n有优惠的商家在商家列表页均含有优惠标识;具体的优惠可以查看活动详情或者商家详情页中的描述。\r\n\r\nQ:在新用户享受的优惠中,新用户的条件是什么?\r\n新用户是指第一次在美团外卖下单的用户(同一设备、同一手机号、同一账户仅可享受一次)。\r\n\r\nQ:我达到了满赠、满减的优惠的金额,为什么没有享受相关的优惠?\r\n满赠与满减优惠是以订单内菜品的总额来计算的,不包含配送费与包装费。\r\n\r\nQ:超时赔付是什么意思?\r\n超时赔付模式即:商家承诺一个送达时间和一个折扣,从用户下单时间开始计算,如果外卖超过了承诺时间才送到,该份外卖按照折扣价收取费用。由于恶劣天气、某些美食烹调时间过长、或者其他因素,商家会选择性的延长承诺时间或者不做承诺。预订单不参与超时赔付。\r\n\r\nQ:为什么提示我“账户存在异常,无法下单”?\r\n包含(但不仅限于)以下行为者,系统将自动予以封禁(客服无权解封):i)有过虚假交易(编造不存在真实买卖的订单);ii)有过恶意下单行为;\r\n\r\nQ:如何取消订单?\r\n如果商家尚未接单,您可以在订单详情页通过“取消订单”功能进行取消;如果商家已接单,则需要您电话联系后由商家取消订单。\r\n\r\nQ:我的订单为什么被取消了?\r\n如果商家5分钟未接您的订单,为了保障您的权益,系统将会为您自动取消订单;商家接单后可能由于无法联系到您、菜品售完等原因无法配送,因而取消了您的订单,具体原因可查看系统发送的短信或通知。\r\n\r\nQ:如何进行催单?\r\n您可以在订单状态页面点击“电话催单”按钮向商家商家催单。\r\n\r\nQ:刚下单发现信息填错了怎么办?\r\n如果商家尚未接单,您可以自主取消订单;如果商家已经接单,您可以电话联系商家后由对方取消订单。然后重新下一单。\r\n\r\nQ:我的订单是否被商家确认?\r\nApp用户可以在商家确认您的订单时收到推送通知,并且订单状态会实时更新;手机触屏版及微信用户可以刷新订单状态页查看。\r\n\r\nQ:预计送达的时间为什么与我实际收餐的时间不符?', mimetype='text/plain', start_char_idx=836, end_char_idx=1882, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.1642555881797134)], metadata={'6eb46464-9e9f-49cb-bf8c-155ef26bf7bb': {'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, '2b4e075d-5be3-4257-81e7-4f10d6dccec6': {'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}})
2.2.2 Models大语言模型
# 引⼊dashscope的依赖库
!pip install llama-index-llms-dashscope
!pip install dashscope
# 向量化模型库
!pip install llama-index-embeddings-dashscope
先看下如何使用Embedding向量化模型:
from llama_index.embeddings.dashscope import DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingTypefrom config.load_api_key import load_api_key# 使用DashScope的Embedding向量化模型
embed_model = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,api_key=load_api_key("BAILIAN_API_KEY")
)text = ["风急天高猿啸哀", "渚清沙白鸟飞回", "无边落木萧萧下", "不尽长江滚滚来"]embeddings_result = embed_model.get_text_embedding_batch(text)for index,embedding in enumerate(embeddings_result):if embedding is None:print(f"The {text[index]} embedding failed.")else:print(f"Dimension of embeddings: {len(embedding)}")print(f"Input text: {text[index]},embeddings_result: {embedding[:5]}")
有了向量化结果,就可以通过向量相似度计算文本之间的语义相似度
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
text1 = "我喜欢吃苹果"
text2 = "苹果是我最爱吃的水果"
text3 = "今天天⽓不错"vector1 = np.array(embed_model.get_text_embedding(text1)).reshape(1, -1)
vector2 = np.array(embed_model.get_text_embedding(text2)).reshape(1, -1)
vector3 = np.array(embed_model.get_text_embedding(text3)).reshape(1, -1)# 计算余弦相似度
similarity12 = cosine_similarity(vector1, vector2)[0][0]
similarity13 = cosine_similarity(vector1, vector3)[0][0]
print(f"\"{text1}\" 与 \"{text2}\" 相似度:{similarity12:.4f}")
print(f"\"{text1}\" 与 \"{text3}\" 相似度:{similarity13:.4f}")
接下来,看看如何使用大语言模型
from llama_index.llms.dashscope import DashScope,DashScopeGenerationModels
from config.load_api_key import load_api_keydashscope_llm = DashScope(model_name=DashScopeGenerationModels.QWEN_MAX,api_key=load_api_key("BAILIAN_API_KEY")
)response = dashscope_llm.complete("你是谁?")print(response)
# 流式输出
stream = dashscope_llm.stream_complete("你是谁?")
for chunk in stream:print(chunk.delta,end="\n")
如果需要进行多轮对话,就需要通过chat方法同时传入多条信息。
from llama_index.core.base.llms.types import MessageRole,ChatMessagemessages = [ChatMessage(content="你是一位旅行家,擅长介绍每个城市的旅游景点",role=MessageRole.SYSTEM),ChatMessage(content="广州",role=MessageRole.USER)
]response = dashscope_llm.chat(messages)
print(response)
# 流式输出
response = dashscope_llm.stream_chat(messages)
for chunk in response:print(chunk.delta,end="\n")
广州 , 这座 历史悠久 的城市,不仅是中国 南方的重要门户, 也是美食与文化的 交汇点。下面 为您推荐几个不可 错过的旅游景点 :1. ** 白云山** -位于广州市北部 ,是广州市民 休闲娱乐的好去 处。这里空气 清新、环境优美 ,适合登山远 足。山顶还有 著名的摩星岭 等景点等待着 游客探索。2 . **珠江夜 游** -想要体验 广州的现代魅力 ?不妨参加一次 珠江夜游。 沿途可以欣赏到 广州塔(小 蛮腰)、海 心沙岛等地 标性建筑在 夜晚灯光下的美丽 景象。3.**上下九步行 街** - 对 于喜欢购物和 品尝地道小吃的朋友 来说,这里是绝佳 选择。街道两 旁布满了各种 商店和餐馆, 尤其是老字号店铺众多 ,能够让你充分 感受到岭南文化的独特 韵味。4.**陈家祠 ** - 作为 广东地区保存最 完好、规模最大的 宗族祠堂 之一,陈家 祠以其精美的 木雕、砖 雕而闻名遐 迩。走进其中 ,仿佛穿越回 了清朝时期, 感受那份古朴 典雅的气息。5 . **长隆 旅游度假区** -如果你带着孩子 一起来广州旅行, 那么一定不能错过 长隆。这里有
from llama_index.llms.langchain import LangChainLLM
from langchain_community.chat_models import ChatTongyi
from config.load_api_key import load_api_keyllm = LangChainLLM(ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY"))
)
2.2.3 Loading文档加载组件
from llama_index.core import Documenttext_list = ["Q:在线支付取消订单后钱怎么返还?订单取消后,款项会在一个工作日内,直接返还到您的美团账户余额。Q:怎么查看退款是否成功?退款会在一个工作日之内到美团账户余额,可在“账号管理——我的账号”中查看是否到账。","Q:美团账户里的余额怎么提现?余额可到美团网(meituan.com)——“我的美团→美团余额”里提取到您的银行卡或者支付宝账号,另外,余额也可直接用于支付外卖订单(限支持在线支付的商家)。"]documents = [Document(text=t) for t in text_list]
documents
from llama_index.core.node_parser import TokenTextSplitter# 如果⽂本的token⻓度⼩于chunk_size,就不会进⾏拆分。否则,按照separator进⾏拆分
# 具体⻓度的划分⽅式跟指定的tokenizer有关。默认使⽤的是tiktoken的tokenizer,可以⾃⾏指定
parser = TokenTextSplitter(separator="Q:",chunk_size=90)nodes = parser.get_nodes_from_documents(documents)for i,node in enumerate(nodes):print(f"Node {i+1}:\n{node.text.strip()}\n")
可以看到,TokenTextSplitter并没有按照问答对来进行划分,这是因为它不仅考虑了分隔符“Q:”,还考虑了每块大小chunk_size。
from llama_index.core import SimpleDirectoryReaderreader = SimpleDirectoryReader(input_dir="resources/")
documents = reader.load_data()
documents
结果截取部分:
# 安装扩展依赖
!pip install llama-index-readers-json
我们先看一下questions/question.jsonl这个文件,这里截取部分:
from llama_index.readers.json import JSONReaderreader = JSONReader(is_jsonl=True)documents = reader.load_data(input_file="./questions/question.jsonl",extra_info={})
结果截取部分:
json与jsonl(json lines)的区别:
2.2.4 Indexing索引组件
from llama_index.core import VectorStoreIndex,SimpleDirectoryReader
from llama_index.embeddings.langchain import LangchainEmbedding
from langchain_community.embeddings import DashScopeEmbeddings
from config.load_api_key import load_api_keydocuments = SimpleDirectoryReader("./resources").load_data()# 初始化通义千问的Embedding模型
# 这⾥是将LangChain针对Dashscope实现的DashScopeEmbedding封装成LlamaIndex可以接受的LangchainEmbedding
embed_model = LangchainEmbedding(DashScopeEmbeddings(model="text-embedding-v1",dashscope_api_key=load_api_key("BAILIAN_API_KEY"))
)index = VectorStoreIndex.from_documents(documents,embed_model=embed_model)retriever = index.as_retriever()responses = retriever.retrieve("怎么退款?")for response in responses:print(response.node.text)
检索出与问题相关的片段,这里截取部分:
from llama_index.core.storage.storage_context import StorageContext
from llama_index.core import load_index_from_storageindex.storage_context.persist(persist_dir="./index")
storage_context = StorageContext.from_defaults(persist_dir="./index")
new_index = load_index_from_storage(storage_context=storage_context,embed_model=embed_model)
new_retriever = new_index.as_retriever()
new_responses = new_retriever.retrieve("怎么退款?")
for new_response in new_responses:print(new_response.node.text)
这里截取部分:
2.2.5 Storing数据存储组件
LlamaIndex中要使用Redis作为向量存储,需要先添加对应的依赖库
!pip install llama-index-vector-stores-redis
from llama_index.core import VectorStoreIndex
from llama_index.vector_stores.redis import RedisVectorStore
from llama_index.core import StorageContext
from redis import Redisredis_client = Redis.from_url("redis://localhost:6380")vector_store = RedisVectorStore(redis_client=redis_client,overwrite=True)storage_context = StorageContext.from_defaults(vector_store=vector_store)index = VectorStoreIndex.from_documents(documents,storage_context=storage_context,embed_model=embed_model
)retriever = index.as_retriever()responses = retriever.retrieve("怎么退款?")for response in responses:print(response.node.text)
这里截取部分:
检索出来的结果存放在redis-stack中了
2.2.6 Querying查询引擎
from langchain_community.chat_models import ChatTongyi
from config.load_api_key import load_api_key
from langchain_community.embeddings import DashScopeEmbeddings
from llama_index.llms.langchain import LangChainLLMllm = ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY")
)embed_model = DashScopeEmbeddings(model="text-embedding-v1",dashscope_api_key=load_api_key("BAILIAN_API_KEY")
)documents = SimpleDirectoryReader("resources/").load_data()
index = VectorStoreIndex.from_documents(documents,embed_model=embed_model)# 将LangChain的LLM封装成LlamaIndex的LLM
llama_llm = LangChainLLM(llm=llm)# 构建检索引擎
query_engine = index.as_query_engine(llm=llama_llm)response = query_engine.query("怎么退款")
response
Response(response='如果商家尚未接单,您可以直接在订单详情页取消订单,款项会自动退还至您的美团账户余额。商家接单后,您需要点击“申请退款”进行在线申请。提交申请后,商家有24小时处理,若商家同意退款或在24小时内未处理,支付金额将退回至您的美团余额。若商家拒绝退款,您可点击“退款申诉”,由美团客服介入处理。', source_nodes=[NodeWithScore(node=TextNode(id_='dc86a28e-8f67-4a0a-b8e4-634d3a5f56a6', embedding=None, metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='664a7292-f2ab-4112-9249-6478a0f2fcf1', node_type='4', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='8d536f16030385598309526c4ed2f61f4845df5b7b0bf30250b253c59a3bb27c'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='3876139b-9eb7-4924-9796-8446d07f3e51', node_type='1', metadata={}, hash='95b9fb21e77be8269d178e0248f5ee0fa58cee54023b98a5171c558c4b949cc4')}, metadata_template='{key}: {value}', metadata_separator='\n', text='Q:在线支付取消订单后钱怎么返还?\r\n订单取消后,款项会在一个工作日内,直接返还到您的美团账户余额。\r\n\r\nQ:怎么查看退款是否成功?\r\n退款会在一个工作日之内到美团账户余额,可在“账号管理——我的账号”中查看是否到账。\r\n\r\nQ:美团账户里的余额怎么提现?\r\n余额可到美团网(meituan.com)——“我的美团→美团余额”里提取到您的银行卡或者支付宝账号,另外,余额也可直接用于支付外卖订单(限支持在线支付的商家)。\r\n\r\nQ:余额提现到账时间是多久?\r\n1-7个工作日内可退回您的支付账户。由于银行处理可能有延迟,具体以账户的到账时间为准。\r\n\r\nQ:申请退款后,商家拒绝了怎么办?\r\n申请退款后,如果商家拒绝,此时回到订单页面点击“退款申诉”,美团客服介入处理。\r\n\r\nQ:怎么取消退款呢?\r\n请在订单页点击“不退款了”,商家还会正常送餐的。\r\n\r\nQ:前面下了一个在线支付的单子,由于未付款,订单自动取消了,这单会计算我的参与活动次数吗?\r\n不会。如果是未支付的在线支付订单,可以先将订单取消(如果不取消需要15分钟后系统自动取消),订单无效后,此时您再下单仍会享受活动的优惠。\r\n\r\nQ:为什么我用微信订餐,却无法使用在线支付?\r\n目前只有网页版和美团外卖手机App(非美团手机客户端)订餐,才能使用在线支付,请更换到网页版和美团外卖手机App下单。\r\n\r\nQ:如何进行付款?\r\n美团外卖现在支持货到付款与在线支付,其中微信版与手机触屏版暂不支持在线支付。\r\n\r\nQ:如何查看可以在线支付的商家?\r\n你可以在商家列表页寻找带有“付”标识的商家,提交订单时可以选择支付方式。\r\n\r\nQ:美团外卖支持哪些支付方式?\r\n现已支持美团余额、支付宝、网银(储蓄卡、信用卡)。\r\n\r\nQ:在线支付订单如何退款?\r\n商家接单前,您可以直接取消订单,订单金额会自动退款到美团余额;商家接单后,您在点击“申请退款”,在线申请。提交退款申请之后,商家有24小时处理您的退款申请。商家同意退款,或24小时内没有处理您的退款申请,您的支付金额会退款至您的美团余额。\r\n\r\nQ:在线支付的过程中,订单显示未支付成功,款项却被扣了,怎么办?\r\n出现此问题,可能是银行/支付宝的数据没有即时传输至美团,请您不要担心,稍后刷新页面查看。 如半小时后仍显示"未付款",请先联系银行/支付宝客服,获取您扣款的交易号,然后致电美团外卖客服4008507777,我们会协助您解决。\r\n\r\nQ:哪些商家有优惠?都有些什么优惠?', mimetype='text/plain', start_char_idx=0, end_char_idx=1049, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.567228773346536), NodeWithScore(node=TextNode(id_='3876139b-9eb7-4924-9796-8446d07f3e51', embedding=None, metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='664a7292-f2ab-4112-9249-6478a0f2fcf1', node_type='4', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='8d536f16030385598309526c4ed2f61f4845df5b7b0bf30250b253c59a3bb27c'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='dc86a28e-8f67-4a0a-b8e4-634d3a5f56a6', node_type='1', metadata={'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, hash='e2cf717ac3cd80141f2c75907f4bc73f7ab168026b2cd40ad6d43847f4383ac2'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='83cf25aa-d56b-4c4b-aef7-30841cafd78d', node_type='1', metadata={}, hash='d736e3bdec1a65af27dcb60951d71d0957ac41815e991c900a9147614b15a430')}, metadata_template='{key}: {value}', metadata_separator='\n', text='商家同意退款,或24小时内没有处理您的退款申请,您的支付金额会退款至您的美团余额。\r\n\r\nQ:在线支付的过程中,订单显示未支付成功,款项却被扣了,怎么办?\r\n出现此问题,可能是银行/支付宝的数据没有即时传输至美团,请您不要担心,稍后刷新页面查看。 如半小时后仍显示"未付款",请先联系银行/支付宝客服,获取您扣款的交易号,然后致电美团外卖客服4008507777,我们会协助您解决。\r\n\r\nQ:哪些商家有优惠?都有些什么优惠?\r\n有优惠的商家在商家列表页均含有优惠标识;具体的优惠可以查看活动详情或者商家详情页中的描述。\r\n\r\nQ:在新用户享受的优惠中,新用户的条件是什么?\r\n新用户是指第一次在美团外卖下单的用户(同一设备、同一手机号、同一账户仅可享受一次)。\r\n\r\nQ:我达到了满赠、满减的优惠的金额,为什么没有享受相关的优惠?\r\n满赠与满减优惠是以订单内菜品的总额来计算的,不包含配送费与包装费。\r\n\r\nQ:超时赔付是什么意思?\r\n超时赔付模式即:商家承诺一个送达时间和一个折扣,从用户下单时间开始计算,如果外卖超过了承诺时间才送到,该份外卖按照折扣价收取费用。由于恶劣天气、某些美食烹调时间过长、或者其他因素,商家会选择性的延长承诺时间或者不做承诺。预订单不参与超时赔付。\r\n\r\nQ:为什么提示我“账户存在异常,无法下单”?\r\n包含(但不仅限于)以下行为者,系统将自动予以封禁(客服无权解封):i)有过虚假交易(编造不存在真实买卖的订单);ii)有过恶意下单行为;\r\n\r\nQ:如何取消订单?\r\n如果商家尚未接单,您可以在订单详情页通过“取消订单”功能进行取消;如果商家已接单,则需要您电话联系后由商家取消订单。\r\n\r\nQ:我的订单为什么被取消了?\r\n如果商家5分钟未接您的订单,为了保障您的权益,系统将会为您自动取消订单;商家接单后可能由于无法联系到您、菜品售完等原因无法配送,因而取消了您的订单,具体原因可查看系统发送的短信或通知。\r\n\r\nQ:如何进行催单?\r\n您可以在订单状态页面点击“电话催单”按钮向商家商家催单。\r\n\r\nQ:刚下单发现信息填错了怎么办?\r\n如果商家尚未接单,您可以自主取消订单;如果商家已经接单,您可以电话联系商家后由对方取消订单。然后重新下一单。\r\n\r\nQ:我的订单是否被商家确认?\r\nApp用户可以在商家确认您的订单时收到推送通知,并且订单状态会实时更新;手机触屏版及微信用户可以刷新订单状态页查看。\r\n\r\nQ:预计送达的时间为什么与我实际收餐的时间不符?', mimetype='text/plain', start_char_idx=836, end_char_idx=1882, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.500521705870999)], metadata={'dc86a28e-8f67-4a0a-b8e4-634d3a5f56a6': {'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}, '3876139b-9eb7-4924-9796-8446d07f3e51': {'file_path': 'F:\\研究生学习\\大模型学习\\主流开发框架\\LlamaIndex\\LlamaIndexDemo\\resources\\meituan-questions.txt', 'file_name': 'meituan-questions.txt', 'file_type': 'text/plain', 'file_size': 6862, 'creation_date': '2025-09-21', 'last_modified_date': '2025-09-02'}})
2.2.7 Settings全局设置
from langchain_community.chat_models import ChatTongyi
from config.load_api_key import load_api_key
from langchain_community.embeddings import DashScopeEmbeddings
from llama_index.embeddings.langchain import LangchainEmbedding
from llama_index.core import Settingsllm = ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY")
)# 将LangChain的embeddins封装成LlamaIndex的embeddings
embed_model = LangchainEmbedding(DashScopeEmbeddings(model="text-embedding-v1",dashscope_api_key=load_api_key("BAILIAN_API_KEY"))
)Settings.llm = llm
Settings.embed_model = embed_modeldocuments = SimpleDirectoryReader("resources/").load_data()
index = VectorStoreIndex.from_documents(documents)# 构建检索引擎
query_engine = index.as_query_engine()response = query_engine.query("怎么退款")
response
2.3 总结
3 自动化评测RAG应用的准确性
3.1 评估RAG应用的准确性
RAG应用是不是只要实现了就可以了呢?真实的结果可能并不如你想象的那么简单。下面我们先实现一个RAG应用来看看。
在docs目录下,提供了一份某公司员工行为规范.pdf。接下来,我们使用LlamaIndex来快速实现一个RAG应用,可以支持根据这个文件来检索公司员工行为规范的相关信息。
from llama_index.core import Settings,SimpleDirectoryReader,VectorStoreIndex
from langchain_community.chat_models import ChatTongyi
from config.load_api_key import load_api_key
from llama_index.embeddings.dashscope import DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingTypeSettings.llm = ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY")
)Settings.embed_model = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,api_key=load_api_key("BAILIAN_API_KEY")
)documents = SimpleDirectoryReader(input_dir="./docs").load_data()index = VectorStoreIndex.from_documents(documents)query_engine = index.as_query_engine()print("问题:公司业务涉及的法律法规涵盖但并不限于哪些?")response = query_engine.query("公司业务涉及的法律法规涵盖但并不限于哪些?")print(f"回答:{response}")
在这个案例中,我们询问“公司业务涉及的法律法规涵盖但并不限于哪些?”,RAG应用却无法正确回答。但是,在公司员工行为规范.pdf中,能找到相关答案。
contexts = [node.get_content() for node in response.source_nodes]
contexts
我们可以先修改一下similarity_top_k的值,从源数据召回更多的相关信息,供大模型参考。
from llama_index.core import Settings,SimpleDirectoryReader,VectorStoreIndex
from langchain_community.chat_models import ChatTongyi
from config.load_api_key import load_api_key
from llama_index.embeddings.dashscope import DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingTypeSettings.llm = ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY")
)Settings.embed_model = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,api_key=load_api_key("BAILIAN_API_KEY")
)documents = SimpleDirectoryReader(input_dir="./docs").load_data()index = VectorStoreIndex.from_documents(documents)# similarity_top_k默认为2,修改为5,这样检索(召回)出来的相关信息更多,供大模型参考
query_engine = index.as_query_engine(similarity_top_k=5)print("问题:公司业务涉及的法律法规涵盖但并不限于哪些?")response = query_engine.query("公司业务涉及的法律法规涵盖但并不限于哪些?")print(f"回答:{response}")
可以看到,这次的回答正确。
我们看下从源数据召回的信息
contexts = [node.get_content() for node in response.source_nodes]
contexts
['关联方交易。公司严禁员工为实现个人利益需要,通过关联方交\n易等方式,将公司的资产、利润向外转移,或者让公司承担与收益不\n相匹配的成本、风险。在公司对外投资、委托代理、中介服务、设备\n供给等活动中, 公司员工不得参与和自己有重大财务或个人关系的交\n易对象的谈判和投票过程,也不得试图以各种方法影响有关决策。重\n大财务或个人关系包括员工本人、近亲属和其他特定关系人,以及上\n述人员拥有、控制或对生产经营管理有重大影响的企业。对涉及关联\n方的交易,公司员工应当提前向公司报告,并依规定申请回避。 \n商业机会。商业机会是指公司经营范围之内能够从事并从中获利\n的任何可能性。公司员工利用公司资产、信息及职务上的便利发现的\n商业机会为公司所有, 任何人不得故意隐瞒不报, 用以谋求个人私利,\n或转交他人与公司竞争。 \n其他可能影响员工业务判断或职责履行的外部活动和个人关系。\n包括但不限于: \n1、长期借用与公司存在业务往来关系的其他企业或个人以及管\n理和服务对象提供的汽车、住房等财物; \n2、接受与公司存在业务往来关系的其他企业或个人以及管理和\n服务对象提供的借款、担保、商品折扣或其他优惠; \n3、向与公司存在业务往来关系的其他企业或个人以及管理和服\n务对象游说与己有关的社会捐赠; \n4、和与公司存在业务往来关系的其他企业或个人以及管理和服\n务对象具有共同的经济利益(如合伙投资)或社会关系; \n5、利用公司资源或者本人在公司的职位和影响,为近亲属及其\n他特定关系人从事商业活动提供便利,或获取其他不当利益。 \n礼品和招待。公司员工一般不得接受与公司存在业务往来关系的','中国投资有限责任公司员工行为规范 \n前言 \n中投公司作为主要从事外汇资金投资与管理业务的国有独资公\n司,秉持“责任、合力、专业、进取”的核心价值观,致力于成为受人\n尊重的国际一流专业投资机构。为实现这一目标,公司要求所有员工\n严格遵守一切适用的法律法规,执行最高的职业道德与操守标准。 \n作为公司的一项重要制度和企业文化建设的重要内容, 《中投公\n司员工行为规范》不仅全面阐述了公司在重大问题上的基本原则,而\n且对保护公司的声誉、利益、资产和信息等提出了详尽要求。每位员\n工在加入公司前均须了解、认可,并自觉以此为行动指南。 \n总则 \n为帮助中投公司员工准确识别和正确处理工作 中遇到的各种道\n德和法律问题,做出有助于开展公司业务、维护公司声誉和利益的良\n好判断,防范道德、法律及经营操作风险,制定本规范。 \n本规范所指公司员工包括:高管、职员、派出董监事、临时及借\n调人员。 接受公司委托的第三方机构人员在代理公司业务期间应参照\n执行。 \n公司员工应认真阅读并充分了解本规范的全部内容, 知悉与否不\n能构成减轻义务或推卸责任的理由和借口。 如对有关问题不清楚或难','监督与执行 \n各级管理人员要率先垂范,带头遵守本规范,并督促和帮助其他\n员工正确理解、遵守本规范的各项要求。如果发现下属有不当或者其\n他违法、违规行为,应及时提醒或者批评教育;情节较重的,依照中\n投公司员工违纪违规行为处理办法处理。 \n公司员工对他人存在违反法律法规、 公司制度规定和本规范的行\n为,可向其上级主管和所在部门反映情况,或向纪检监察部举报。有\n关部门对举报人负有保密义务,任何人不得打击报复。公司员工因各\n种不当或者违法、违规行为接受司法机关或相关部门调查的,应予配\n合。 \n附则 \n本规范是指导和约束公司员工职业行为的规范性文件, 作为劳动\n合同的附件,与劳动合同具有同等效力。未尽事宜,公司员工可参照\n有关法律法规、国际商业惯例、公司章程以及公司其他各项制度流程\n执行;前述规则不明确的,应从公司最佳利益出发采取适当的行动。 \n本规范自公布之日起施行。','以处理时,员工应寻求上级主管或公司相关部门的建议和帮助。 \n公司核心价值观 \n核心价值观是企业本质和永恒的原则。 中投公司的核心价值观是:\n责任、合力、专业、进取。公司员工的一切行为应当以此为导向,无\n论何时何地,恪守并践行公司的核心价值观。 \n保护公司的声誉 \n良好的声誉对于公司的发展和成功至关重要。 公司员工应当认识\n到:任何不当行为都有可能破坏公司声誉且一旦破坏将极难恢复。因\n此,员工务必正确理解和严格遵循所有适用的法律、法规和社会与职\n业道德标准, 避免因任何不当行为损害公司的声誉, 给公司形象抹黑。 \n遵守法律规定。只有严格遵守本国和投资接受国或地区的法律法\n规才能保护公司的声誉不受侵害。 公司业务涉及的法律法规涵盖但并\n不限于:反垄断、反腐败、反商业贿赂、环境保护、保密、防止内幕\n交易、知识产权、隐私以及信息披露等。公司员工应当树立主动合规\n的意识,理解和遵守所有适用于其身份、岗位或与经办业务相关的法\n律、法规、规章和准则,以及公司的内控制度与业务流程。 \n社会道德与责任。遵守社会秩序、尊重社会公德、履行社会责任\n是每个公民应尽的义务。公司员工应自觉做到知礼守法、健康向上,\n积极参与和谐社会建设,努力为当地经济繁荣与发展做出贡献。员工\n不得组织、参与、支持非法的罢工、集会、游行、示威等活动;不得\n参加非法组织、团体,或者为之提供场所、资金等便利;不得参与黄\n赌毒等活动,或有其他违反社会公德的行为。 \n诚信与公平对待。诚实守信是员工职业道德与操守的本质要求。','员工应加强投资风险监控,严格按照有关规定有序运作,积极识别、\n监测、控制和化解投资中的各种不利因素,将投资风险控制在可接受\n的范围之内。当发现投资风险及隐患时,员工有责任向相关投资部门\n和风险管理部及时报告情况。 \n实物资产。公司员工应当负责任地保管和使用公司各项固定资产,\n节约使用各种低值耗材, 避免因保管不善或使用不当造成资产的损失\n浪费。 \n知识产权。公司员工在从事职务活动过程中, 或者使用公司资金、\n设备和信息资料研究开发的智力成果, 如信息系统、 投资研究报告等,\n其产权归公司所有,个人不得擅自占有和处置。 \n文件资料。公司员工应根据法律规定和公司业务需要, 保留真实、\n完整的工作记录、交易数据以及合同、协议和其他文件资料。上述文\n件资料应能客观反映出相关投资业务及其他经营活动, 并按规定期限\n归档管理。 \n信息系统。公司员工应按公司要求安全接入和合理使用公司信息\n系统,不得擅自拆装计算机硬件和私自安装软件,不得在公司内外网\n之间交叉使用 U 盘、移动硬盘等移动存储设备,不得通过公司网络\n制作、浏览、下载、保存和传播各种非法及不良信息。 \n保护公司的信息 \n公司信息管理以真实、安全、可控制为基本原则。员工不得制造\n虚假信息,不得泄露保密信息,不得滥用内幕信息,不得擅自对外披\n露信息。 \n财务信息。公司所有财务信息应当真实、准确和完整。公司员工\n有责任保证其经手的各种报表、账簿、记录以及发票、合同、协议等']
召回的信息中包含了正确答案。
3.2 建立自动化评测机制
比如,针对之前提出的“公司业务涉及的法律法规涵盖但并不限于哪些?”这个问题,拿到RAG应用的回答后,我们可以通过大模型来自动判断回答是否正确。
llm = ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY")
)def check_answer(question,answer,correct_answer):prompt = (f"""你是一个测试人员。下面给出了问题、回答和正确答案。请你根据这些信息判断回答的内容是否正确。你的回复只能是:回答正确或者回答错误。
问题:{question},回答:{answer},正确答案:{correct_answer}""")return llm.invoke(prompt)
# 问题
question = "公司业务涉及的法律法规包括哪些?"
# RAG应用给出的回答
answer = "根据提供的信息,无法回答公司业务涉及的法律法规具体涵盖哪些内容。文档中仅提到公司要求员工严格遵守一切适用的法律法规,但未列出具体的法律法规名称或范围。"
# 正确答案
correct_answer = "公司业务涉及的法律法规涵盖但不限于:反垄断、反腐败、反商业贿赂、环境保护、保密、防止内幕交易、知识产权、隐私以及信息披露等。"
check_answer(question,answer,correct_answer)
除了检测问题的最终结果,还需要检查RAG应用在召回信息时,是否召回了足够多的相关信息。
def check_contexts(question,contexts):prompt = (f"""你是一个测试人员。下面给出了问题和参考资料。请你根据参考资料判断其是否能对回答问题提供帮助。你的回复只能是:有用或者无用。
问题:{question},参考资料:{contexts}""")return llm.invoke(prompt)
# 问题
question = "公司业务涉及的法律法规涵盖但并不限于哪些?"
# RAG应用从知识库中检索出来的参考信息
contexts = ['关联方交易。公司严禁员工为实现个人利益需要,通过关联方交\n易等方式,将公司的资产、利润向外转移,或者让公司承担与收益不\n相匹配的成本、风险。在公司对外投资、委托代理、中介服务、设备\n供给等活动中, 公司员工不得参与和自己有重大财务或个人关系的交\n易对象的谈判和投票过程,也不得试图以各种方法影响有关决策。重\n大财务或个人关系包括员工本人、近亲属和其他特定关系人,以及上\n述人员拥有、控制或对生产经营管理有重大影响的企业。对涉及关联\n方的交易,公司员工应当提前向公司报告,并依规定申请回避。 \n商业机会。商业机会是指公司经营范围之内能够从事并从中获利\n的任何可能性。公司员工利用公司资产、信息及职务上的便利发现的\n商业机会为公司所有, 任何人不得故意隐瞒不报, 用以谋求个人私利,\n或转交他人与公司竞争。 \n其他可能影响员工业务判断或职责履行的外部活动和个人关系。\n包括但不限于: \n1、长期借用与公司存在业务往来关系的其他企业或个人以及管\n理和服务对象提供的汽车、住房等财物; \n2、接受与公司存在业务往来关系的其他企业或个人以及管理和\n服务对象提供的借款、担保、商品折扣或其他优惠; \n3、向与公司存在业务往来关系的其他企业或个人以及管理和服\n务对象游说与己有关的社会捐赠; \n4、和与公司存在业务往来关系的其他企业或个人以及管理和服\n务对象具有共同的经济利益(如合伙投资)或社会关系; \n5、利用公司资源或者本人在公司的职位和影响,为近亲属及其\n他特定关系人从事商业活动提供便利,或获取其他不当利益。 \n礼品和招待。公司员工一般不得接受与公司存在业务往来关系的',
'中国投资有限责任公司员工行为规范 \n前言 \n中投公司作为主要从事外汇资金投资与管理业务的国有独资公\n司,秉持“责任、合力、专业、进取”的核心价值观,致力于成为受人\n尊重的国际一流专业投资机构。为实现这一目标,公司要求所有员工\n严格遵守一切适用的法律法规,执行最高的职业道德与操守标准。 \n作为公司的一项重要制度和企业文化建设的重要内容, 《中投公\n司员工行为规范》不仅全面阐述了公司在重大问题上的基本原则,而\n且对保护公司的声誉、利益、资产和信息等提出了详尽要求。每位员\n工在加入公司前均须了解、认可,并自觉以此为行动指南。 \n总则 \n为帮助中投公司员工准确识别和正确处理工作 中遇到的各种道\n德和法律问题,做出有助于开展公司业务、维护公司声誉和利益的良\n好判断,防范道德、法律及经营操作风险,制定本规范。 \n本规范所指公司员工包括:高管、职员、派出董监事、临时及借\n调人员。 接受公司委托的第三方机构人员在代理公司业务期间应参照\n执行。 \n公司员工应认真阅读并充分了解本规范的全部内容, 知悉与否不\n能构成减轻义务或推卸责任的理由和借口。 如对有关问题不清楚或难']
check_contexts(question,contexts)
3.3 使用Ragas评估RAG应用表现
3.3.1 评估RAG应用回答质量
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import answer_correctness
from langchain_community.chat_models import ChatTongyi
from langchain_community.embeddings import DashScopeEmbeddings
from config.load_api_key import load_api_keydata_samples = {# 测试问题'question': ['公司业务涉及的法律法规涵盖但并不限于哪些?','公司业务涉及的法律法规涵盖但并不限于哪些?'],# RAG应用给出的回答'answer': ['根据提供的信息,无法回答公司业务涉及的法律法规具体涵盖哪些内容。文档中仅提到公司要求员工严格遵守一切适用的法律法规,但未列出具体的法律法规名称或范围','公司业务涉及的法律法规涵盖但不限于:反垄断、反腐败、反商业贿赂、环境保护、保密、防止内幕交易、知识产权、隐私以及信息披露等。'],# 正确答案'ground_truth': ['公司业务涉及的法律法规涵盖但不限于:反垄断、反腐败、反商业贿赂、环境保护、保密、防止内幕交易、知识产权、隐私以及信息披露等。','公司业务涉及的法律法规涵盖但不限于:反垄断、反腐败、反商业贿赂、环境保护、保密、防止内幕交易、知识产权、隐私以及信息披露等。']
}dataset = Dataset.from_dict(data_samples)
score = evaluate(dataset=dataset,metrics=[answer_correctness],llm=ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY")),embeddings=DashScopeEmbeddings(model="text-embedding-v3",dashscope_api_key=load_api_key("BAILIAN_API_KEY"))
)
score.to_pandas()
3.3.2 评估RAG应用检索召回的效果
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import context_precision,context_recall
from langchain_community.chat_models import ChatTongyi
from langchain_community.embeddings import DashScopeEmbeddings
from config.load_api_key import load_api_keydata_samples = {# 测试问题'question': ['公司业务涉及的法律法规涵盖但并不限于哪些?','公司业务涉及的法律法规涵盖但并不限于哪些?'],# RAG应用检索出的上下文'contexts': [['关联方交易。公司严禁员工为实现个人利益需要,通过关联方交\n易等方式,将公司的资产、利润向外转移,或者让公司承担与收益不\n相匹配的成本、风险。在公司对外投资、委托代理、中介服务、设备\n供给等活动中, 公司员工不得参与和自己有重大财务或个人关系的交\n易对象的谈判和投票过程,也不得试图以各种方法影响有关决策。重\n大财务或个人关系包括员工本人、近亲属和其他特定关系人,以及上\n述人员拥有、控制或对生产经营管理有重大影响的企业。对涉及关联\n方的交易,公司员工应当提前向公司报告,并依规定申请回避。 \n商业机会。商业机会是指公司经营范围之内能够从事并从中获利\n的任何可能性。公司员工利用公司资产、信息及职务上的便利发现的\n商业机会为公司所有, 任何人不得故意隐瞒不报, 用以谋求个人私利,\n或转交他人与公司竞争。 \n其他可能影响员工业务判断或职责履行的外部活动和个人关系。\n包括但不限于: \n1、长期借用与公司存在业务往来关系的其他企业或个人以及管\n理和服务对象提供的汽车、住房等财物; \n2、接受与公司存在业务往来关系的其他企业或个人以及管理和\n服务对象提供的借款、担保、商品折扣或其他优惠; \n3、向与公司存在业务往来关系的其他企业或个人以及管理和服\n务对象游说与己有关的社会捐赠; \n4、和与公司存在业务往来关系的其他企业或个人以及管理和服\n务对象具有共同的经济利益(如合伙投资)或社会关系; \n5、利用公司资源或者本人在公司的职位和影响,为近亲属及其\n他特定关系人从事商业活动提供便利,或获取其他不当利益。 \n礼品和招待。公司员工一般不得接受与公司存在业务往来关系的','中国投资有限责任公司员工行为规范 \n前言 \n中投公司作为主要从事外汇资金投资与管理业务的国有独资公\n司,秉持“责任、合力、专业、进取”的核心价值观,致力于成为受人\n尊重的国际一流专业投资机构。为实现这一目标,公司要求所有员工\n严格遵守一切适用的法律法规,执行最高的职业道德与操守标准。 \n作为公司的一项重要制度和企业文化建设的重要内容, 《中投公\n司员工行为规范》不仅全面阐述了公司在重大问题上的基本原则,而\n且对保护公司的声誉、利益、资产和信息等提出了详尽要求。每位员\n工在加入公司前均须了解、认可,并自觉以此为行动指南。 \n总则 \n为帮助中投公司员工准确识别和正确处理工作 中遇到的各种道\n德和法律问题,做出有助于开展公司业务、维护公司声誉和利益的良\n好判断,防范道德、法律及经营操作风险,制定本规范。 \n本规范所指公司员工包括:高管、职员、派出董监事、临时及借\n调人员。 接受公司委托的第三方机构人员在代理公司业务期间应参照\n执行。 \n公司员工应认真阅读并充分了解本规范的全部内容, 知悉与否不\n能构成减轻义务或推卸责任的理由和借口。 如对有关问题不清楚或难'],['关联方交易。公司严禁员工为实现个人利益需要,通过关联方交\n易等方式,将公司的资产、利润向外转移,或者让公司承担与收益不\n相匹配的成本、风险。在公司对外投资、委托代理、中介服务、设备\n供给等活动中, 公司员工不得参与和自己有重大财务或个人关系的交\n易对象的谈判和投票过程,也不得试图以各种方法影响有关决策。重\n大财务或个人关系包括员工本人、近亲属和其他特定关系人,以及上\n述人员拥有、控制或对生产经营管理有重大影响的企业。对涉及关联\n方的交易,公司员工应当提前向公司报告,并依规定申请回避。 \n商业机会。商业机会是指公司经营范围之内能够从事并从中获利\n的任何可能性。公司员工利用公司资产、信息及职务上的便利发现的\n商业机会为公司所有, 任何人不得故意隐瞒不报, 用以谋求个人私利,\n或转交他人与公司竞争。 \n其他可能影响员工业务判断或职责履行的外部活动和个人关系。\n包括但不限于: \n1、长期借用与公司存在业务往来关系的其他企业或个人以及管\n理和服务对象提供的汽车、住房等财物; \n2、接受与公司存在业务往来关系的其他企业或个人以及管理和\n服务对象提供的借款、担保、商品折扣或其他优惠; \n3、向与公司存在业务往来关系的其他企业或个人以及管理和服\n务对象游说与己有关的社会捐赠; \n4、和与公司存在业务往来关系的其他企业或个人以及管理和服\n务对象具有共同的经济利益(如合伙投资)或社会关系; \n5、利用公司资源或者本人在公司的职位和影响,为近亲属及其\n他特定关系人从事商业活动提供便利,或获取其他不当利益。 \n礼品和招待。公司员工一般不得接受与公司存在业务往来关系的','中国投资有限责任公司员工行为规范 \n前言 \n中投公司作为主要从事外汇资金投资与管理业务的国有独资公\n司,秉持“责任、合力、专业、进取”的核心价值观,致力于成为受人\n尊重的国际一流专业投资机构。为实现这一目标,公司要求所有员工\n严格遵守一切适用的法律法规,执行最高的职业道德与操守标准。 \n作为公司的一项重要制度和企业文化建设的重要内容, 《中投公\n司员工行为规范》不仅全面阐述了公司在重大问题上的基本原则,而\n且对保护公司的声誉、利益、资产和信息等提出了详尽要求。每位员\n工在加入公司前均须了解、认可,并自觉以此为行动指南。 \n总则 \n为帮助中投公司员工准确识别和正确处理工作 中遇到的各种道\n德和法律问题,做出有助于开展公司业务、维护公司声誉和利益的良\n好判断,防范道德、法律及经营操作风险,制定本规范。 \n本规范所指公司员工包括:高管、职员、派出董监事、临时及借\n调人员。 接受公司委托的第三方机构人员在代理公司业务期间应参照\n执行。 \n公司员工应认真阅读并充分了解本规范的全部内容, 知悉与否不\n能构成减轻义务或推卸责任的理由和借口。 如对有关问题不清楚或难','监督与执行 \n各级管理人员要率先垂范,带头遵守本规范,并督促和帮助其他\n员工正确理解、遵守本规范的各项要求。如果发现下属有不当或者其\n他违法、违规行为,应及时提醒或者批评教育;情节较重的,依照中\n投公司员工违纪违规行为处理办法处理。 \n公司员工对他人存在违反法律法规、 公司制度规定和本规范的行\n为,可向其上级主管和所在部门反映情况,或向纪检监察部举报。有\n关部门对举报人负有保密义务,任何人不得打击报复。公司员工因各\n种不当或者违法、违规行为接受司法机关或相关部门调查的,应予配\n合。 \n附则 \n本规范是指导和约束公司员工职业行为的规范性文件, 作为劳动\n合同的附件,与劳动合同具有同等效力。未尽事宜,公司员工可参照\n有关法律法规、国际商业惯例、公司章程以及公司其他各项制度流程\n执行;前述规则不明确的,应从公司最佳利益出发采取适当的行动。 \n本规范自公布之日起施行。','以处理时,员工应寻求上级主管或公司相关部门的建议和帮助。 \n公司核心价值观 \n核心价值观是企业本质和永恒的原则。 中投公司的核心价值观是:\n责任、合力、专业、进取。公司员工的一切行为应当以此为导向,无\n论何时何地,恪守并践行公司的核心价值观。 \n保护公司的声誉 \n良好的声誉对于公司的发展和成功至关重要。 公司员工应当认识\n到:任何不当行为都有可能破坏公司声誉且一旦破坏将极难恢复。因\n此,员工务必正确理解和严格遵循所有适用的法律、法规和社会与职\n业道德标准, 避免因任何不当行为损害公司的声誉, 给公司形象抹黑。 \n遵守法律规定。只有严格遵守本国和投资接受国或地区的法律法\n规才能保护公司的声誉不受侵害。 公司业务涉及的法律法规涵盖但并\n不限于:反垄断、反腐败、反商业贿赂、环境保护、保密、防止内幕\n交易、知识产权、隐私以及信息披露等。公司员工应当树立主动合规\n的意识,理解和遵守所有适用于其身份、岗位或与经办业务相关的法\n律、法规、规章和准则,以及公司的内控制度与业务流程。 \n社会道德与责任。遵守社会秩序、尊重社会公德、履行社会责任\n是每个公民应尽的义务。公司员工应自觉做到知礼守法、健康向上,\n积极参与和谐社会建设,努力为当地经济繁荣与发展做出贡献。员工\n不得组织、参与、支持非法的罢工、集会、游行、示威等活动;不得\n参加非法组织、团体,或者为之提供场所、资金等便利;不得参与黄\n赌毒等活动,或有其他违反社会公德的行为。 \n诚信与公平对待。诚实守信是员工职业道德与操守的本质要求。','员工应加强投资风险监控,严格按照有关规定有序运作,积极识别、\n监测、控制和化解投资中的各种不利因素,将投资风险控制在可接受\n的范围之内。当发现投资风险及隐患时,员工有责任向相关投资部门\n和风险管理部及时报告情况。 \n实物资产。公司员工应当负责任地保管和使用公司各项固定资产,\n节约使用各种低值耗材, 避免因保管不善或使用不当造成资产的损失\n浪费。 \n知识产权。公司员工在从事职务活动过程中, 或者使用公司资金、\n设备和信息资料研究开发的智力成果, 如信息系统、 投资研究报告等,\n其产权归公司所有,个人不得擅自占有和处置。 \n文件资料。公司员工应根据法律规定和公司业务需要, 保留真实、\n完整的工作记录、交易数据以及合同、协议和其他文件资料。上述文\n件资料应能客观反映出相关投资业务及其他经营活动, 并按规定期限\n归档管理。 \n信息系统。公司员工应按公司要求安全接入和合理使用公司信息\n系统,不得擅自拆装计算机硬件和私自安装软件,不得在公司内外网\n之间交叉使用 U 盘、移动硬盘等移动存储设备,不得通过公司网络\n制作、浏览、下载、保存和传播各种非法及不良信息。 \n保护公司的信息 \n公司信息管理以真实、安全、可控制为基本原则。员工不得制造\n虚假信息,不得泄露保密信息,不得滥用内幕信息,不得擅自对外披\n露信息。 \n财务信息。公司所有财务信息应当真实、准确和完整。公司员工\n有责任保证其经手的各种报表、账簿、记录以及发票、合同、协议等']],# RAG应用给出的回答'answer': ['根据提供的信息,无法回答公司业务涉及的法律法规具体涵盖哪些内容。文档中仅提到公司要求员工严格遵守一切适用的法律法规,但未列出具体的法律法规名称或范围','公司业务涉及的法律法规涵盖但不限于:反垄断、反腐败、反商业贿赂、环境保护、保密、防止内幕交易、知识产权、隐私以及信息披露等。'],# 正确答案'ground_truth': ['公司业务涉及的法律法规涵盖但不限于:反垄断、反腐败、反商业贿赂、环境保护、保密、防止内幕交易、知识产权、隐私以及信息披露等。','公司业务涉及的法律法规涵盖但不限于:反垄断、反腐败、反商业贿赂、环境保护、保密、防止内幕交易、知识产权、隐私以及信息披露等。']
}dataset = Dataset.from_dict(data_samples)
score = evaluate(dataset=dataset,metrics=[context_precision,context_recall],llm=ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY")),embeddings=DashScopeEmbeddings(model="text-embedding-v3",dashscope_api_key=load_api_key("BAILIAN_API_KEY"))
)
score.to_pandas()
从上面的数据可以看到,最后一行数据的回答是正确的:
在RAG应用检索出的上下文中,有一条信息和问题及正确答案相关,所以context_precision为0.5;在源数据中,与问题及正确答案相关的那条信息被检索出来了,所以context_recall为1。
3.3.3 Ragas核心提示词分析
from ragas.metrics import answer_correctness,context_precision,context_recall# Ragas的默认提示词
print(answer_correctness.correctness_prompt)
print("========")
print(context_precision.context_precision_prompt)
print("========")
print(context_recall.context_recall_prompt)# 也可以直接替换
# context_recall.context_recall_prompt.instruction="xxx"
# context_recall.context_recall_prompt.examples="xxx"
CorrectnessClassifier("name": "correctness_classifier","instruction": "Given a ground truth and an answer statements, analyze each statement and classify them in one of the following categories: TP (true positive): statements that are present in answer that are also directly supported by the one or more statements in ground truth, FP (false positive): statements present in the answer but not directly supported by any statement in ground truth, FN (false negative): statements found in the ground truth but not present in answer. Each statement can only belong to one of the categories. Provide a reason for each classification.","examples": [[{"question": "What powers the sun and what is its primary function?","answer": ["The sun is powered by nuclear fission, similar to nuclear reactors on Earth.","The primary function of the sun is to provide light to the solar system."],"ground_truth": ["The sun is powered by nuclear fusion, where hydrogen atoms fuse to form helium.","This fusion process in the sun's core releases a tremendous amount of energy.","The energy from the sun provides heat and light, which are essential for life on Earth.","The sun's light plays a critical role in Earth's climate system.","Sunlight helps to drive the weather and ocean currents."]},{"TP": [{"statement": "The primary function of the sun is to provide light to the solar system.","reason": "This statement is somewhat supported by the ground truth mentioning the sun providing light and its roles, though it focuses more broadly on the sun's energy."}],"FP": [{"statement": "The sun is powered by nuclear fission, similar to nuclear reactors on Earth.","reason": "This statement is incorrect and contradicts the ground truth which states that the sun is powered by nuclear fusion."}],"FN": [{"statement": "The sun is powered by nuclear fusion, where hydrogen atoms fuse to form helium.","reason": "This accurate description of the sun’s power source is not included in the answer."},{"statement": "This fusion process in the sun's core releases a tremendous amount of energy.","reason": "This process and its significance are not mentioned in the answer."},{"statement": "The energy from the sun provides heat and light, which are essential for life on Earth.","reason": "The answer only mentions light, omitting the essential aspects of heat and its necessity for life, which the ground truth covers."},{"statement": "The sun's light plays a critical role in Earth's climate system.","reason": "This broader impact of the sun’s light on Earth's climate system is not addressed in the answer."},{"statement": "Sunlight helps to drive the weather and ocean currents.","reason": "The effect of sunlight on weather patterns and ocean currents is omitted in the answer."}]}],[{"question": "What is the boiling point of water?","answer": ["The boiling point of water is 100 degrees Celsius at sea level"],"ground_truth": ["The boiling point of water is 100 degrees Celsius (212 degrees Fahrenheit) at sea level.","The boiling point of water can change with altitude."]},{"TP": [{"statement": "The boiling point of water is 100 degrees Celsius at sea level","reason": "This statement is directly supported by the ground truth which specifies the boiling point of water as 100 degrees Celsius at sea level."}],"FP": [],"FN": [{"statement": "The boiling point of water can change with altitude.","reason": "This additional information about how the boiling point of water can vary with altitude is not mentioned in the answer."}]}]],"language": "english" ) ======== ContextPrecisionPrompt("name": "context_precision_prompt","instruction": "Given question, answer and context verify if the context was useful in arriving at the given answer. Give verdict as \"1\" if useful and \"0\" if not with json output.","examples": [[{"question": "What can you tell me about Albert Einstein?","context": "Albert Einstein (14 March 1879 – 18 April 1955) was a German-born theoretical physicist, widely held to be one of the greatest and most influential scientists of all time. Best known for developing the theory of relativity, he also made important contributions to quantum mechanics, and was thus a central figure in the revolutionary reshaping of the scientific understanding of nature that modern physics accomplished in the first decades of the twentieth century. His mass–energy equivalence formula E = mc2, which arises from relativity theory, has been called 'the world's most famous equation'. He received the 1921 Nobel Prize in Physics 'for his services to theoretical physics, and especially for his discovery of the law of the photoelectric effect', a pivotal step in the development of quantum theory. His work is also known for its influence on the philosophy of science. In a 1999 poll of 130 leading physicists worldwide by the British journal Physics World, Einstein was ranked the greatest physicist of all time. His intellectual achievements and originality have made Einstein synonymous with genius.","answer": "Albert Einstein, born on 14 March 1879, was a German-born theoretical physicist, widely held to be one of the greatest and most influential scientists of all time. He received the 1921 Nobel Prize in Physics for his services to theoretical physics."},{"reason": "The provided context was indeed useful in arriving at the given answer. The context includes key information about Albert Einstein's life and contributions, which are reflected in the answer.","verdict": 1}],[{"question": "who won 2020 icc world cup?","context": "The 2022 ICC Men's T20 World Cup, held from October 16 to November 13, 2022, in Australia, was the eighth edition of the tournament. Originally scheduled for 2020, it was postponed due to the COVID-19 pandemic. England emerged victorious, defeating Pakistan by five wickets in the final to clinch their second ICC Men's T20 World Cup title.","answer": "England"},{"reason": "the context was useful in clarifying the situation regarding the 2020 ICC World Cup and indicating that England was the winner of the tournament that was intended to be held in 2020 but actually took place in 2022.","verdict": 1}],[{"question": "What is the tallest mountain in the world?","context": "The Andes is the longest continental mountain range in the world, located in South America. It stretches across seven countries and features many of the highest peaks in the Western Hemisphere. The range is known for its diverse ecosystems, including the high-altitude Andean Plateau and the Amazon rainforest.","answer": "Mount Everest."},{"reason": "the provided context discusses the Andes mountain range, which, while impressive, does not include Mount Everest or directly relate to the question about the world's tallest mountain.","verdict": 0}]],"language": "english" ) ======== ContextRecallClassificationPrompt("name": "context_recall_classification_prompt","instruction": "Given a context, and an answer, analyze each sentence in the answer and classify if the sentence can be attributed to the given context or not. Use only 'Yes' (1) or 'No' (0) as a binary classification. Output json with reason.","examples": [[{"question": "What can you tell me about albert Albert Einstein?","context": "Albert Einstein (14 March 1879 - 18 April 1955) was a German-born theoretical physicist, widely held to be one of the greatest and most influential scientists of all time. Best known for developing the theory of relativity, he also made important contributions to quantum mechanics, and was thus a central figure in the revolutionary reshaping of the scientific understanding of nature that modern physics accomplished in the first decades of the twentieth century. His mass-energy equivalence formula E = mc2, which arises from relativity theory, has been called 'the world's most famous equation'. He received the 1921 Nobel Prize in Physics 'for his services to theoretical physics, and especially for his discovery of the law of the photoelectric effect', a pivotal step in the development of quantum theory. His work is also known for its influence on the philosophy of science. In a 1999 poll of 130 leading physicists worldwide by the British journal Physics World, Einstein was ranked the greatest physicist of all time. His intellectual achievements and originality have made Einstein synonymous with genius.","answer": "Albert Einstein, born on 14 March 1879, was a German-born theoretical physicist, widely held to be one of the greatest and most influential scientists of all time. He received the 1921 Nobel Prize in Physics for his services to theoretical physics. He published 4 papers in 1905. Einstein moved to Switzerland in 1895."},{"classifications": [{"statement": "Albert Einstein, born on 14 March 1879, was a German-born theoretical physicist, widely held to be one of the greatest and most influential scientists of all time.","reason": "The date of birth of Einstein is mentioned clearly in the context.","attributed": 1},{"statement": "He received the 1921 Nobel Prize in Physics for his services to theoretical physics.","reason": "The exact sentence is present in the given context.","attributed": 1},{"statement": "He published 4 papers in 1905.","reason": "There is no mention about papers he wrote in the given context.","attributed": 0},{"statement": "Einstein moved to Switzerland in 1895.","reason": "There is no supporting evidence for this in the given context.","attributed": 0}]}]],"language": "english" )
3.3.4 总结
4 优化RAG应用提升回答准确度
4.1 RAG应用回答准确性问题分析
from llama_index.core import Settings,SimpleDirectoryReader,VectorStoreIndex
from langchain_community.chat_models import ChatTongyi
from config.load_api_key import load_api_key
from llama_index.embeddings.dashscope import DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingTypeSettings.llm = ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY")
)Settings.embed_model = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,api_key=load_api_key("BAILIAN_API_KEY")
)documents = SimpleDirectoryReader(input_dir="./docs").load_data()index = VectorStoreIndex.from_documents(documents)# similarity_top_k默认为2,修改为5,这样检索(召回)出来的相关信息更多,供大模型参考
query_engine = index.as_query_engine(similarity_top_k=5)print("问题:公司业务涉及的法律法规涵盖但并不限于哪些?")response = query_engine.query("公司业务涉及的法律法规涵盖但并不限于哪些?")print(f"回答:{response}")
可以看到,当我们把query_engine中检索相关文档片段数增加到5是,就能检索出公司业务涉及的法律法规的相关信息了。这就是针对之前评测结果的一种解决方案。
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import answer_correctness,context_precision,context_recall
from langchain_community.chat_models import ChatTongyi
from langchain_community.embeddings import DashScopeEmbeddings# 定义评估函数
def evaluate_result(question,response,ground_truth):# 获取回答内容if hasattr(response,'response_txt'):answer = response.response_txtelse:answer = str(response)# 获取检索到的上下文context = [source_node.get_content() for source_node in response.source_nodes]# 构造评估数据集data_samples = {'question': [question],'contexts': [context],'answer': [answer],'ground_truth': [ground_truth]}dataset = Dataset.from_dict(data_samples)# 使用ragas进行评估score = evaluate(dataset=dataset,metrics=[answer_correctness,context_precision,context_recall],llm=ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY")),embeddings=DashScopeEmbeddings(model="text-embedding-v3",dashscope_api_key=load_api_key("BAILIAN_API_KEY")))return score.to_pandas()
question = "公司业务涉及的法律法规涵盖但并不限于哪些?"
ground_truth = "公司业务涉及的法律法规涵盖但不限于:反垄断、反腐败、反商业贿赂、环境保护、保密、防止内幕交易、知识产权、隐私以及信息披露等。"
evaluate_result(question,response,ground_truth)
from llama_index.core import Settings,SimpleDirectoryReader,VectorStoreIndex
from langchain_community.chat_models import ChatTongyi
from config.load_api_key import load_api_key
from llama_index.embeddings.dashscope import DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingTypeSettings.llm = ChatTongyi(model="qwen-plus",api_key=load_api_key("BAILIAN_API_KEY")
)Settings.embed_model = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,api_key=load_api_key("BAILIAN_API_KEY")
)# 加载文档,使用结构更加规整的MarkDown格式,而不是不太好拆解的PDF格式
new_documents = SimpleDirectoryReader(input_dir="./markdown").load_data()new_index = VectorStoreIndex.from_documents(new_documents)new_query_engine = new_index.as_query_engine(similarity_top_k=5)print("问题:公司业务涉及的法律法规涵盖但并不限于哪些?")new_response = new_query_engine.query("公司业务涉及的法律法规涵盖但并不限于哪些?")print(f"回答:{response}")
evaluate_result(question,new_response,ground_truth)
可以看到,这次的context_precision提升到了0.5,检索信息的效率提高了。