LLM + KG + 向量检索

核心问题:解决 LLM 的 plain text 处理和 KG 的 structured data 不匹配

LlamaIndex

  • 自定义 LLM(OpenAI API、Huggingface)
  • 自定义 Embedding(目前仅有 text embedding)

自定义 LLM

model_name = "facebook/opt-iml-max-30b"
pipeline = pipeline("text-generation", model=model_name, device="cuda:0", model_kwargs={"torch_dtype":torch.bfloat16})

llm = OurLLM()
service_context = ServiceContext.from_defaults(
llm=llm,
context_window=context_window,
num_output=num_output
)
class OurLLM(CustomLLM):
@property
def metadata(self) -> LLMMetadata:
"""Get LLM metadata."""
return LLMMetadata(
context_window=context_window,
num_output=num_output,
model_name=model_name
)
@llm_completion_callback()
def complete(self, prompt: str, **kwargs: Any) -> CompletionResponse:
prompt_length = len(prompt)
response = pipeline(prompt, max_new_tokens=num_output)[0]["generated_text"]
# only return newly generated tokens
text = response[prompt_length:]
return CompletionResponse(text=text)
@llm_completion_callback()
def stream_complete(self, prompt: str, **kwargs: Any) -> CompletionResponseGen:
raise NotImplementedError()

自定义 Embedding

embed_model = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-base-en")
service_context = ServiceContext.from_defaults(embed_model=embed_model)

向量检索的核心问题

  • "Embedding models take text as input ..."
    而我们没有 text 只有 triplets
    triplets 和 text query 怎么算相似度
  • 现有检索 triplets KG 的工作是把 text query 翻译成 structured query 去做 structured 检索,没有使用向量数据库

多跳检索的核心问题

  • 若每一个子 query 的返回结果是 plain text,下一步 query 会存在歧义,导致拼接子 query 时出错
graph LR X--T-->A X--F-->A' A--T-->Y A--F-->Y' A'--F-->Y' A'--F-->Y'' Y---->Truth
  • 现有工作的解决方法是子 query 后剪枝,有潜在的低召回风险