在overview中,使用了KeyBERT来fine-tune representation。BERTopic还支持使用大语言模型来fine-tune。BERTopic支持openai、llama.cpp和langchain。本文使用openai和ollama进行本地部署。
ollama参考https://ollama.com/
import openai
import bertopic.representation
client = openai.OpenAI(
base_url = 'http://localhost:11434/v1',
api_key='ollama', # required, but unused
)
representation_model = bertopic.representation.OpenAI(client, model="yi", chat=True)
默认prompt
DEFAULT_CHAT_PROMPT = """
I have a topic that contains the following documents:
[DOCUMENTS]
The topic is described by the following keywords: [KEYWORDS]
Based on the information above, extract a short topic label in the following format:
topic: <topic label>
"""
简单看看源码的流程,从fit_transform开始,433行self._extract_topics(documents, embeddings=embeddings, verbose=self.verbose)。来到_openai.py,方法extract_topics调用了_extract_representative_docs。对每个有代表性的doc,调用self.client.chat.completions.create,大模型生成一个response,然后用response.choices[0].message.content.strip().replace("topic: ", "")获得label。
下面介绍bertopic.representation.OpenAI的主要参数。默认情况下,四个最有代表性的文档传给[DOCUMENTS]。
可以用nr_docs改变传入的文档数。用参数diversity改善文档过于相似的问题,这个参数在0到1之间,推荐设为0.1。
可以用doc_length截断文档。
tokenizer决定了doc_length的计算方式,例如是按char还是whitespace切分文档。