如何基于EC2上LLM的URL接口构建LangChain ConversationalRetrievalChain?
如何基于EC2部署的LLM接口构建LangChain的ConversationalRetrievalChain?
假设我有一个部署在AWS EC2实例上的LLM模型,可通过指定URL,以如下方式发送请求:
payload = { "model": "mistralai/Mistral-7B-v0.1", "prompt": "My favourite condiment is", "max_tokens": 25 } data = json.dumps(payload, ensure_ascii=False) response = requests.post(url=url, data=data)我能否基于此构建LangChain的ConversationalRetrievalChain?使用SageMaker端点时,我可通过以下代码实现:
llm = SagemakerEndpoint(ENDPOINT_INFOS_GO_HERE) chain = ConversationalRetrievalChain.from_llm(llm=llm, retriever=db.as_retriever()) # <-- 我已经连接了数据库但目前我仅拥有该LLM的URL接口,该如何操作?
可以通过自定义LangChain的LLM子类对接EC2上的LLM接口,具体步骤如下:
- 自定义LLM类
继承LangChain的LLM基类,实现核心的请求调用和参数标识方法:
from langchain.llms.base import LLM from typing import Optional, List, Mapping, Any import requests import json class EC2LLM(LLM): url: str model_name: str max_tokens: int = 25 @property def _identifying_params(self) -> Mapping[str, Any]: return { "url": self.url, "model_name": self.model_name, "max_tokens": self.max_tokens } @property def _llm_type(self) -> str: return "ec2_custom_llm" def _call( self, prompt: str, stop: Optional[List[str]] = None, run_manager: Optional[Any] = None, ) -> str: # 构造请求体 payload = { "model": self.model_name, "prompt": prompt, "max_tokens": self.max_tokens } data = json.dumps(payload, ensure_ascii=False) # 发送POST请求 response = requests.post(url=self.url, data=data) response.raise_for_status() # 抛出请求异常 # 解析响应(需根据实际接口返回格式调整字段名) result = response.json() return result.get("response", "")
- 初始化自定义LLM实例
llm = EC2LLM( url="你的EC2 LLM接口URL", model_name="mistralai/Mistral-7B-v0.1", max_tokens=50 # 可按需调整 )
- 构建ConversationalRetrievalChain
和使用SageMaker端点的逻辑完全一致,直接传入自定义LLM实例即可:
chain = ConversationalRetrievalChain.from_llm(llm=llm, retriever=db.as_retriever())
注意事项:
- 需根据EC2上LLM接口的实际响应格式,调整
_call方法中的解析逻辑,比如有些接口可能用"generated_text"或"output"字段返回结果。 - 可根据需求添加请求超时、重试机制,或在payload中加入温度、top_p等接口支持的参数。
内容的提问来源于stack exchange,提问作者MaxS.
相关产品推荐
相关产品推荐

