记录一次用大模型LLM和向量数据库,搭建垂直领域的知识库问答实践。上文已经介绍了文本如何转换成向量,存储到向量数据库中。本文将介绍大语言模型LLM 提示工程 向量数据库作为背景知识,回答用户的提问。
1、LangChain框架的介绍
LangChain 是一个用于开发由语言模型驱动的应用程序的框架。我们相信,和不同的应用程序结合,不仅通过 API 调用语言模型,还应结合:
- 数据感知:将语言模型与其他数据源连接在一起。
- 主动性:允许语言模型与其环境进行交互。
LangChain 框架的设计目标就是为了实现这些类型的应用程序。它提供了两个主要的价值主张:
- 组件:LangChain 为处理语言模型所需的组件提供模块化的抽象。LangChain 还为所有这些抽象提供了实现的集合。
- 用例特定链:链可以被看作是以特定方式组装这些组件,以便最好地完成特定用例。
2、LangChain框架有哪些模块
- 索引(Indexs):创建检索的索引,包含加载文档、文档分片、向量存储
- 模型(Models):模型的调用,包含LLMs、聊天模型 Chat Models、文本嵌入模型 Text Embedding Models
- 提示(Prompt):Prompt Templates提示模板、Prompt Value用户输入的值、示例选择器 Example Selectors、输出解析器 Output Parsers结构化的信息
- 内存(Memory):内存(Memory)是在对话过程中存储和检索数据的概念。内存主要分为两种类型:短期内存和长期内存。短期内存通常指的是如何在单个对话的上下文中传递数据(通常是先前的聊天消息或其摘要)。长期内存处理的是如何在对话之间获取和更新信息的问题。
- 链(Chains):链( Chains )是一个非常通用的概念,它指的是将一系列组件(或其他链)以特定方式组合起来,以实现共同的用例。最常用的链类型是LLMChain(LLM链),它结合了PromptTemplate(提示模板)、Model(模型)
- 代理(Agents):有些应用程序不仅需要预定的LLM/其他工具的调用链,还可能需要根据用户的输入构建未知的链条。在这些类型的链条中,有一个"代理"(agent)可以访问一套工具。根据用户的输入,代理可以决定是否调用这些工具中的任何一个
3、python调用LangChain框架实践
环境:python3.9
3.1 pip安装依赖
代码语言:txt复制langchain
unstructured
markdown
qdrant-client
lark
modelscope
torch
transformers
dashscope
3.2 从向量数据库中匹配近似文本
代码语言:python代码运行次数:0复制embedding = ModelScopeEmbeddings(
model_id="./ai_model/nlp_corom_sentence-embedding_chinese-base-ecom") # 加载模型 不需要外网
def search_from_vector_stores(collection, question):
query_db_docs = []
print(f"""原始的向量数据库查询相关文档""")
client = qdrant_client.QdrantClient(
url=qdrant_url,
port=qdrant_port,
api_key=qdrant_api_key
)
qdrant = Qdrant(
client=client,
collection_name="自己定义的向量数据库中的集合名称",
embeddings=embedding,
)
found_docs = qdrant.similarity_search_with_score(question)
for doc in found_docs:
print(doc)
query_db_docs.append(doc[0].page_content)
return query_db_docs
3.3 调用通义千问模型
基于上一步检索出的相似文本为背景知识,加上提示工程,向大语言模型提问。
代码语言:python代码运行次数:0复制def get_knowledge_based_answer(question, base_docs):
llm = Tongyi(model_name="qwen-7b-chat")
prompt_template = """基于以下已知信息,简洁和专业的来回答用户的问题。如果有相关链接,请同时输出链接。如果无法从中得到答案,请说 "根据已知信息无法回答该问题" 或 "没有提供足够的相关信息",不允许在答案中添加编造成分,答案请使用中文。已知内容:{context},问题:{question}"""
prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
chain = prompt | llm
print("通义千问基于本地知识库的回答:")
answer = chain.invoke({"context": base_docs, "question": question})
print(answer)
return answer