Skip to main content

矿大历史智能问答助手:一个自建知识库 + 网络搜索的混合型 AI 助理

·1910 words·4 mins
赵一鸣
Author
赵一鸣
感谢所有成为自己✨
Table of Contents

一个结合 LangChainOpenAI 的智能问答系统,支持对 .docx 本地文档内容进行分析,同时集成 SerpAPI 实现互联网搜索补充,可构建适用于多场景的问答助手。


一、总体功能概述
#

  • 加载本地 Word 文档(.docx 格式)
  • 生成向量并存储至本地向量数据库(Chroma)
  • 基于本地知识库进行智能问答
  • 本地找不到答案时,调用 SerpAPI 进行搜索,并由 ChatGPT 润色整理
  • 支持持续对话,直到用户主动退出

二、程序逻辑
#

1. 启动对话循环
2. 用户输入问题
   ├─ 优先从本地知识库中检索答案
   │   └─ 若能回答,则由 GPT 润色为“适合人类阅读的回答”
   └─ 若本地无结果,则使用网络搜索:
       ├─ 通过 SerpAPI 查询
       ├─ GPT 提炼整合搜索结果
       └─ 若 SerpAPI 无结果,交由 ChatGPT 直接回答

代码中抽取出的核心函数调用代码与主要功能逻辑,保留最重要的模块和关键步骤

# 初始化:加载本地文档或向量数据库
if not os.path.exists(vectorstore_dir):
    documents = load_documents(data_folder)
    vectorstore = build_vectorstore(documents)
else:
    vectorstore = load_vectorstore()

# 构建问答链:基于向量数据库的检索增强生成(RAG)
retriever = vectorstore.as_retriever()
qa_chain = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(model_name='gemini-2.0-flash-thinking-exp-01-21', temperature=0),
    chain_type="stuff",
    retriever=retriever
)

# 配置 SerpAPI 网络搜索工具
search = SerpAPIWrapper()
tools = [
    Tool(
        name="Search",
        func=search.run,
        description="Use this tool to search the internet when the answer is not in the local knowledge base."
    )
]

# 初始化代理智能体(Agent),具备调用外部工具与语言模型的能力
agent = initialize_agent(
    tools,
    OpenAI(temperature=0.7),
    agent="chat-zero-shot-react-description",
    verbose=True
)

# 对话主循环
while True:
    query = input("请您提问:(输入quit退出程序) ")
    if query.lower() in ['exit', 'quit']:
        break

    # 优先使用本地知识库
    result = qa_chain.run(query)
    if result.strip() and "我不知道" not in result.lower():
        print(f"矿大历史智能助手: (知识库){result}")
        refined_result = agent.run(f"请将以下搜索结果润色为适合人类阅读的答案:\n{result}")
        print(refined_result)
    else:
        print("矿大历史智能助手:我将会从互联网上搜索答案。")
        search_result = search.run(query)
        if search_result.strip():
            refined_result = agent.run(
                f"请将以下搜索结果润色为适合人类阅读的答案:\n{search_result}"
            )
            print(f"矿大历史智能助手: (网络搜索并润色){refined_result}")
        else:
            print("矿大历史智能助手:在网络上未能找到相关信息。我将使用chatgpt模型提供一个答案。")
            chatgpt_answer = agent.run(query)
            print(f"矿大历史智能助手: {chatgpt_answer}")
功能模块 核心代码 描述
文档导入 load_documents(data_folder) 加载本地 .docx 文件并提取文本
构建向量数据库 build_vectorstore(documents) 使用 OpenAIEmbeddings 和 Chroma
加载向量数据库 load_vectorstore() 若数据库已存在则加载
问答链构建 RetrievalQA.from_chain_type(…) 基于 LangChain RAG
网络搜索工具 SerpAPIWrapper() 使用 SerpAPI 进行在线查询
智能代理 Agent initialize_agent(…) 整合搜索工具和 OpenAI 生成模型
交互逻辑 while True: … 用户问答循环逻辑

三、应用场景
#

1、游戏npc对话助手/数字博物馆/历史问答系统
#

  • 利用资料(.docx, .pdf, .txt)构建知识库
  • 结合 RAG 模型(Retrieval-Augmented Generation)实现高质量问答,降低大模型幻觉风险

案例:

  • “解谜游戏中的npc提示对话助手”
  • “矿大历史智能助手”
  • “博物馆 AI 导览系统”

2、教育场景应用示例
#

智能答疑机器人

  • 将教材、讲义、题解等导入知识库,学生可随时提问
  • 提供有针对性的、类教师风格的回答
  • 提高教学效率,减轻教师答疑压力

四、 系统效果对比展示
#

对比 ChatGPT 原生回答,本系统的输出更贴近原始资料,准确性更高:

Loading existing vectorstore...

请您提问:(输入quit退出程序)  1998年中国矿业大学获批建设6个部级重点实验室的详细细节
矿大历史智能助手: (知识库)根据提供的文本,1998年中国矿业大学获批建设6个部级重点实验室的详细细节如下:

*   **批准时间:** 1998年12月
*   **批准机构:** 国家煤炭工业局
*   **获批数量:** 6个部级重点实验室
*   **实验室名称:**
    1.  国家煤炭工业电力传动与控制实验室
    2.  国家煤炭工业矿业机械与工程材料重点实验室
    3.  国家煤炭工业矿业安全工程重点实验室
    4.  国家煤炭工业地下工程重点实验室
    5.  国家煤炭工业矿物加工工程重点实验室
    6.  国家煤炭工业岩石力学与岩层控制重点实验室
*   **建设要求:** 国家煤炭工业局要求将这6个实验室建设成为依托博士点学科并为博士点服务的开放性实验室,为煤炭工业的重大科研项目提供技术支持。

请您提问:(输入quit退出程序) 1978年中国矿业学院发生了什么事情?
矿大历史智能助手: (知识库)1978年中国矿业学院发生了以下事情:

*   **3月10日**:四川矿业学院向煤炭部提交了迁校报告,并提出学校搬到徐州后,取名“中国煤炭工业学院”。
*   **3月14日**:煤炭部发文,同意学校改名“中国煤炭工业学院”。
*   **3月16日**:煤炭部在批复中明确回复,四川矿业学院将迁往江苏省徐州市,校名改为“中国矿业学院”。
*   **6月23日**:煤炭部发文通知学校,同意四川矿业学院正式恢复启用“中国矿业学院”的校名。
*   **8月10日**:根据煤炭部的批复,学校启用了“中国矿业学院”新印章,“四川矿业学院”的校名不再使用。

alt text

chatgpt 输出 本系统输出
chatgpt 输出

相关资料来源: