一个结合 LangChain 与 OpenAI 的智能问答系统,支持对 .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日**:根据煤炭部的批复,学校启用了“中国矿业学院”新印章,“四川矿业学院”的校名不再使用。
| chatgpt 输出 | 本系统输出 |
|---|---|
|
![]() |
相关资料来源:

