大模型结合知识库问答应用第一次实践(下)

2024-09-11 09:37:59 浏览数 (1)

记录一次用大模型LLM和向量数据库,搭建垂直领域的知识库问答实践。上文已经介绍了文本如何转换成向量,存储到向量数据库中。本文将介绍大语言模型LLM 提示工程 向量数据库作为背景知识,回答用户的提问。

1、LangChain框架的介绍

LangChain 是一个用于开发由语言模型驱动的应用程序的框架。我们相信,和不同的应用程序结合,不仅通过 API 调用语言模型,还应结合:

  • 数据感知:将语言模型与其他数据源连接在一起。
  • 主动性:允许语言模型与其环境进行交互。

LangChain 框架的设计目标就是为了实现这些类型的应用程序。它提供了两个主要的价值主张:

  • 组件:LangChain 为处理语言模型所需的组件提供模块化的抽象。LangChain 还为所有这些抽象提供了实现的集合。
  • 用例特定链:链可以被看作是以特定方式组装这些组件,以便最好地完成特定用例。

2、LangChain框架有哪些模块

  1. 索引(Indexs):创建检索的索引,包含加载文档、文档分片、向量存储
  2. 模型(Models):模型的调用,包含LLMs、聊天模型 Chat Models、文本嵌入模型 Text Embedding Models
  3. 提示(Prompt):Prompt Templates提示模板、Prompt Value用户输入的值、示例选择器 Example Selectors、输出解析器 Output Parsers结构化的信息
  4. 内存(Memory):内存(Memory)是在对话过程中存储和检索数据的概念。内存主要分为两种类型:短期内存和长期内存。短期内存通常指的是如何在单个对话的上下文中传递数据(通常是先前的聊天消息或其摘要)。长期内存处理的是如何在对话之间获取和更新信息的问题。
  5. 链(Chains):链( Chains )是一个非常通用的概念,它指的是将一系列组件(或其他链)以特定方式组合起来,以实现共同的用例。最常用的链类型是LLMChain(LLM链),它结合了PromptTemplate(提示模板)、Model(模型)
  6. 代理(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

0 人点赞