LangChain简介

LangChain The largest community building the future of LLM apps

问答文档

  • data.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import bs4
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

loader = WebBaseLoader(
web_path="https://www.gov.cn/jrzg/2013-10/25/content_2515601.htm",
bs_kwargs=dict(parse_only=bs4.SoupStrainer(
class_=("p1")
))
)

docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
db = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings(), persist_directory="./chroma_db")
  • bot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_community.vectorstores import Chroma
from langchain_openai import ChatOpenAI,OpenAIEmbeddings
from langchain.prompts.prompt import PromptTemplate
from fastapi import FastAPI
from langserve import add_routes

vectorstore = Chroma(persist_directory="./chroma_db", embedding_function=OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 4})
prompt_template_str = """
You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.

Question: {question}

Context: {context}

Answer:
"""
prompt_template = PromptTemplate.from_template(prompt_template_str)

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)

rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt_template
| llm
| StrOutputParser()
)
app = FastAPI(
title="消费者权益智能助手",
version="1.0",
)
add_routes(
app,
rag_chain,
path="/consumer_ai",
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="localhost", port=8000)
1
2
conda create -n py312 --clone base
conda activate py312
1
2
3
4
5
pip install langchain==0.1.13 langchain-openai bs4 chromadb

export OPENAI_API_KEY="hello-openai"

python data.py
1
2
3
4
5
6
pip install langserve sse_starlette

export OPENAI_API_KEY="hello-openai"

python bot.py
# 浏览器访问http://localhost:8000/consumer_ai/playground/

langchain-01.png

问答数据库

  • lc.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
USE lc;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `machine_drivers`;
CREATE TABLE `machine_drivers` (
`id` bigint(20) NOT NULL,
`machine_id` bigint(20) DEFAULT NULL,
`driver_name` varchar(255) DEFAULT NULL,
`phone` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

BEGIN;
INSERT INTO `machine_drivers` VALUES (1, 1, '赛文', '110');
INSERT INTO `machine_drivers` VALUES (2, 2, '艾斯', '119');
INSERT INTO `machine_drivers` VALUES (3, 3, '迪迦', '120');
INSERT INTO `machine_drivers` VALUES (4, 4, '泰罗', '122');
COMMIT;

DROP TABLE IF EXISTS `machines`;
CREATE TABLE `machines` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`machine_name` varchar(255) DEFAULT NULL,
`work_time` bigint(20) DEFAULT NULL,
`date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;

BEGIN;
INSERT INTO `machines` VALUES (1, '挖掘机A', 1202, '2024-04-19');
INSERT INTO `machines` VALUES (2, '挖掘机B', 0, '2024-04-19');
INSERT INTO `machines` VALUES (3, '挖掘机C', 7200, '2024-04-19');
INSERT INTO `machines` VALUES (4, '推土机A', 5206, '2024-04-19');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;
1
2
3
4
5
docker run --name langchain -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0

docker exec -i langchain mysql -uroot -p123456 <<< "CREATE DATABASE IF NOT EXISTS lc DEFAULT CHARSET utf8 COLLATE utf8_general_ci;"

mycli -uroot < ./lc.sql
  • query.py
1
2
3
4
5
6
7
8
9
10
11
12
from langchain_community.utilities.sql_database import SQLDatabase
from langchain_community.agent_toolkits import create_sql_agent
from langchain_openai import ChatOpenAI

db = SQLDatabase.from_uri("mysql+pymysql://root:123456@127.0.0.1:3306/lc")
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
agent_executor = create_sql_agent(llm, db=db, agent_type="openai-tools", verbose=True)
agent_executor.invoke("一共有多少台机械?")
# agent_executor.invoke("它们的平均工时是多少?") # 3402
# agent_executor.invoke("它们去0之后的平均工时是多少?") # 4536
# agent_executor.invoke("哪台机械今天没有工作,它的驾驶员是谁?") # 挖掘机B
# agent_executor.invoke("艾斯的手机号码是多少?")
1
2
3
pip install pymysql

python query.py

参考