既然是检索增强生成,我们主要是让大模型根据现有的知识图谱回答用户的问题,所以开发逻辑分3部分
1,是将用户问题embedding后,与向量数据库内的内容,进行相似度检索,代码如下
embedding_function = SentenceTransformerEmbeddings(model_name="shibing624/text2vec-base-chinese")
db = Chroma(persist_directory="/", embedding_function=embedding_function) #改成实际的本地向量库地址
doc = db.similarity_search(self.q)
context = doc[0].page_content
2,prompt提示词的编写,让大模型根据检索内容回答,不让瞎说,并将问题和检索内容一起放到提示模板里面去,代码如下
prompt_template = """请用以下片段去回答问题. 如果不知道答案, 就说不知道. 不要编造答案.
{context}
Question: {question}
Answer:"""
prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
3,调用第三集的本地大模型类CustomLLM(),回传大模型的回答,代码如下
llm = CustomLLM()
query_llm = LLMChain(llm=llm, prompt=prompt)
response = query_llm.run({"context": context, "question": self.q})
return response
这个项目代码我已经开源到GitHub上了,可以点这个链接,直接下载整个项目代码:"github.com/davidhandso…"
此时,我们已经完成了大模型的构建,主体功能已经实现,在命令行或者jupyter运行,可以输入问题和得到答案。但是有一点问题,交互不友好,没有页面,用户不太可能安装以上的软件,下一集,我们将使用streamlit开发一个类chatgpt的交互界面,完成可交付的整个项目的开发。请看RAG项目第五集:前端页面的开发和展示