如何配置Lambda实现Bedrock知识库与普通大模型按需调用?
无需单独创建Lambda函数,在现有函数内扩展逻辑即可
不需要单独新建Lambda函数,直接在现有函数里加判断逻辑就能实现需求:
- 先调用Bedrock的检索接口,判断用户问题是否和知识库内容相关
- 有相关内容就用你当前的
retrieve_and_generate逻辑调用带知识库的模型 - 没相关内容就直接调用普通大模型对话
修改后的代码示例
import boto3 import json def lambda_handler(event, context): bedrock_agent_client = boto3.client('bedrock-agent-runtime', region_name='us-east-1') bedrock_client = boto3.client('bedrock-runtime', region_name='us-east-1') session_id = event.get('sessionId', None) user_query = event['query'] # 先执行检索,获取知识库匹配结果 retrieve_response = bedrock_agent_client.retrieve( knowledgeBaseId='WID0XRPRUS', retrievalConfiguration={ 'vectorSearchConfiguration': { 'numberOfResults': 3, 'filter': {} } }, input={'text': user_query} ) # 判断是否有有效匹配结果(可根据实际调整,比如加分数阈值) has_relevant_content = len(retrieve_response['retrievalResults']) > 0 if has_relevant_content: # 调用带知识库的生成接口 input_data = { 'input': {'text': user_query}, 'retrieveAndGenerateConfiguration': { 'knowledgeBaseConfiguration': { 'knowledgeBaseId': 'WID0XRPRUS', 'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0' }, 'type': 'KNOWLEDGE_BASE' } } if session_id: input_data['sessionId'] = session_id response = bedrock_agent_client.retrieve_and_generate(**input_data) else: # 调用普通大模型对话 invoke_response = bedrock_client.invoke( modelId='anthropic.claude-3-sonnet-20240229-v1:0', contentType='application/json', accept='application/json', body=json.dumps({ "anthropic_version": "bedrock-2023-05-31", "max_tokens": 1024, "messages": [ {"role": "user", "content": user_query} ] }) ) # 解析结果并对齐返回格式 response_body = json.loads(invoke_response['body'].read()) response = { 'output': { 'text': response_body['content'][0]['text'] }, 'sessionId': session_id if session_id else None } return response
额外说明
- 可以根据实际需求调整检索结果的判断规则,比如给
retrievalResults里的score设阈值,过滤低匹配度的结果 - 要确保Lambda的IAM角色拥有
bedrock-agent-runtime:Retrieve、bedrock-runtime:InvokeModel这两个权限 - 普通模型调用的参数(比如
max_tokens)可以根据业务场景调整
内容的提问来源于stack exchange,提问作者douglas_min
相关产品推荐
相关产品推荐

