大模型知识补充二
LangChain的认识
向量数据库
分类
小例子:简单客服机器人代码示例
提供一个基于LangChain的简单客服机器人代码示例,结合了 Retrieval(检索)、Chains(流程) 和 Memory(记忆) 模块。代码会用到 OpenAI 的 GPT-3.5 模型和 FAQ 文档,并支持对话历史记忆。
结合 MySQL 数据库查询 和 GPT-3.5 模型。当用户询问 订单相关问题 时,系统会直接查询 MySQL 数据库;其他问题则使用 FAQ 检索和模型生成回答。
# 安装必要的库(如果未安装)
# pip install langchain openai faiss-cpu mysql-connector-python
import os
import re
from langchain.llms import OpenAI
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.agents import initialize_agent, Tool
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
import mysql.connector
# 设置你的 OpenAI API 密钥
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
# MySQL 配置(替换为你的数据库信息)
DB_CONFIG = {
"host": "localhost",
"user": "root",
"password": "your_password",
"database": "your_database"
}
# 1. 加载并处理 FAQ 文档
def load_faq():
loader = TextLoader("faq.txt", encoding="utf-8")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
return docs
# 2. 创建向量数据库
def create_vector_db(docs):
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(docs, embeddings)
return db
# 3. 创建 MySQL 查询工具
def create_order_tool():
def query_order(order_id):
try:
conn = mysql.connector.connect(**DB_CONFIG)
cursor = conn.cursor()
query = "SELECT status, estimated_delivery FROM orders WHERE order_id = %s"
cursor.execute(query, (order_id,))
result = cursor.fetchone()
cursor.close()
conn.close()
if result:
return f"订单 {order_id} 的状态是:{result[0]},预计送达时间:{result[1]}"
else:
return "未找到该订单。"
except Exception as e:
return f"查询失败:{str(e)}"
return Tool(
name="订单查询",
func=query_order,
description="当用户提供订单号时,调用此工具查询订单状态"
)
# 4. 创建对话 Agent
def create_agent(db, order_tool):
llm = OpenAI(model_name="gpt-3.5-turbo", temperature=0)
# FAQ 检索工具
def faq_retriever(query):
docs = db.similarity_search(query, k=3)
return "\n".join([doc.page_content for doc in docs])
faq_tool = Tool(
name="FAQ 检索",
func=faq_retriever,
description="当用户的问题属于常见问题时,调用此工具检索 FAQ"
)
tools = [order_tool, faq_tool]
agent = initialize_agent(
tools,
llm,
agent="zero-shot-react-description",
verbose=True
)
return agent
# 5. 主对话循环
def main():
# 加载 FAQ 文档
docs = load_faq()
db = create_vector_db(docs)
# 创建订单查询工具
order_tool = create_order_tool()
# 初始化 Agent
agent = create_agent(db, order_tool)
print("欢迎使用客服机器人!输入 '退出' 结束对话。")
while True:
user_input = input("你: ")
if user_input.lower() == "退出":
break
# 检测是否需要查询订单
order_id = re.search(r'\b\d{5,10}\b', user_input) # 假设订单号是5-10位数字
if order_id:
# 直接调用订单工具
response = agent.run(f"订单号 {order_id.group()} 的状态是什么?")
else:
# 使用 Agent 自主决策
response = agent.run(user_input)
print(f"客服机器人: {response}")
if __name__ == "__main__":
main()