如果您熟悉AWS Well-Architected Framework,您会知道它提供了一套最佳实践,旨在帮助您实现安全,高性能,弹性和高效的基础架构。但是,有了大量的信息,导航框架可能是一项艰巨的任务。
这就是为什么我决定开发一个聊天机器人来回答与框架相关的问题,从而通过支持文档链接为开发人员提供快速,准确的答复。如果您对这个项目的启动感兴趣,我鼓励您查看我的previous post。
现在,在这篇后续文章中,我将指导您使用开源库LangChain构建聊天机器人的增强版本。
Langchain增强了大语言模型(LLM)应用程序的功能,提供诸如及时管理,呼叫序列的链条以及数据增强生成之类的功能。本分步指南将涵盖:
数据收集
•文本嵌入创建
•提示工程
•聊天接口开发
您可以尝试聊天机器人here。
并使用代码here。
查看GitHub回购数据收集:网络报废
为了从良好的框架中获取所有必要的链接,我从站点地图中提取了所有URL。站点地图提供了页面上所有链接的列表,这使我能够有效地创建一个脚本来获取每个页面的所有文本。这是我使用的python函数:
def extract_urls_from_sitemap(sitemap_url):
response = requests.get(sitemap_url)
if response.status_code != 200:
print(f"Failed to fetch sitemap: {response.status_code}")
return []
sitemap_content = response.content
root = ET.fromstring(sitemap_content)
# Extract the URLs from the sitemap
urls = [
elem.text
for elem in root.iter("{http://www.sitemaps.org/schemas/sitemap/0.9}loc")
]
return urls
# Site maps for the AWS Well-Architected Framework
sitemap_url_list = [
"https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/sitemap.xml",
"https://docs.aws.amazon.com/wellarchitected/latest/framework/sitemap.xml",
"https://docs.aws.amazon.com/wellarchitected/latest/operational-excellence-pillar/sitemap.xml",
"https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/sitemap.xml",
"https://docs.aws.amazon.com/wellarchitected/latest/performance-efficiency-pillar/sitemap.xml",
"https://docs.aws.amazon.com/wellarchitected/latest/cost-optimization-pillar/sitemap.xml",
"https://docs.aws.amazon.com/wellarchitected/latest/sustainability-pillar/sitemap.xml",
]
# Get all links from the sitemaps
full_sitemap_list = []
for sitemap in sitemap_url_list:
full_sitemap_list.extend(extract_urls_from_sitemap(sitemap))
汇编列表后,我使用兰班硒文档加载程序从每个页面中提取所有文本,将文本分为1000个字符的块。将文本分解为1000个字符的块简化了处理大量数据的处理,并确保文本具有有用的消化段,以便该模型进行处理。
def load_html_text(sitemap_urls):
loader = SeleniumURLLoader(urls=sitemap_urls)
data = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=20)
texts = text_splitter.split_documents(data)
return texts
创建文本嵌入
接下来,我使用OpenAI's embeddings API生成了每个页面的文本嵌入。文本嵌入是用于测量文本字符串相关性的浮点数的向量(列表)。它们通常用于各种任务,例如搜索,聚类,建议,异常检测,多样性测量和分类。生成嵌入后,我使用矢量搜索库Faiss创建索引,从而可以快速搜索每个用户查询。
def embed_text(texts, save_loc):
embeddings = OpenAIEmbeddings(openai_api_key=os.environ["OPENAI_API_KEY"])
docsearch = FAISS.from_documents(texts, embeddings)
docsearch.save_local(save_loc)
查看完整的摄入管道here。
构建LLM链:及时工程
准备好数据后,是时候构建LLM链来响应用户查询了。第一步涉及创建提示板的第一步,该提示程序是代表可以传递给LLM的提示的架构。该模板由系统提示和两个变量组成:用户的问题和与问题相关的良好框架框架的上下文。
TEMPLATE = """You are an AWS Certified Solutions Architect. Your role is to help customers understand best practices on building on AWS. Return your response in markdown, so you can bold and highlight important steps for customers. If the answer cannot be found within the context, write 'I could not find an answer'
Use the following context from the AWS Well-Architected Framework to answer the user's query. Make sure to read all the context before providing an answer.\nContext:\n{context}\nQuestion: {question}
"""
QA_PROMPT = PromptTemplate(template=TEMPLATE, input_variables=["question", "context"])
接下来,我设置了使用LLM来响应用户查询的过程。我使用ChatOpenAI
类实例化了OpenAI model并设置参数(注意:您需要自己的OpenAI API key)。然后,我从刮擦数据中建立了用户查询的嵌入式端点和本地矢量存储。最后,我设置了ConversationalRetrievalChain
,该ConversationalRetrievalChain
通过利用文档进行响应来促进聊天机器人的创建。
def setup_chain():
llm = ChatOpenAI(
temperature=0.7,
openai_api_key=os.environ["OPENAI_API_KEY"],
model_name="gpt-3.5-turbo",
)
embeddings = OpenAIEmbeddings(openai_api_key=os.environ["OPENAI_API_KEY"])
vectorstore = FAISS.load_local("local_index", embeddings)
chain = ConversationalRetrievalChain.from_llm(
llm, vectorstore.as_retriever(), return_source_documents=True
)
return chain
完整代码是here
创建聊天界面
使用Streamlit开发了聊天接口,Streamlit是一种用于构建Interactive Python Web应用程序的多功能工具。此代码创建一个简单的接口,其中包含用于用户查询的文本输入和一个“提交”按钮以提交查询。单击“提交”按钮时,查询以及聊天历史记录将发送到LLM链,该链条链条返回响应以及引用的文档。
def app() -> None:
"""
Purpose:
Controls the app flow
Args:
N/A
Returns:
N/A
"""
# Spin up the sidebar
sidebar()
with st.container():
# Load chat history
for index, chat in enumerate(st.session_state["chat_history"]):
message_func(chat[0], True)
message_func(chat[1], False)
# st.write(chat[0])
# st.write(chat[1])
with st.expander("Resources"):
for doc in st.session_state["docs"][index]:
st.write(doc.metadata["source"])
st.write(doc.page_content)
with st.form(key="my_form", clear_on_submit=True):
query = st.text_input(
"Query: ",
key="input",
value="",
placeholder="Type your query here...",
label_visibility="hidden",
)
submit_button = st.form_submit_button(label="Submit")
col1, col2 = st.columns([1, 3.2])
reset_button = col1.button("Reset Chat History")
if submit_button:
with st.spinner("Generating..."):
result = chain(
{"question": query, "chat_history": st.session_state["chat_history"]}
)
st.session_state["chat_history"].append(
(result["question"], result["answer"])
)
st.session_state["docs"].append(result["source_documents"])
st.experimental_rerun() # Add Chat to UI
if reset_button:
st.session_state["chat_history"] = []
st.session_state["docs"] = []
st.experimental_rerun()
您可以找到完整的代码here。
结论
在本指南中,我已经完成了构建AWS良好的聊天机器人的过程,该聊天机器人利用Langchain,OpenAI GPT模型和简化。我们首先从AWS良好的框架中收集数据开始,开始创建文本嵌入,最后使用Langchain调用OpenAI LLM来生成对用户查询的响应。
您可以与聊天机器人here互动。
如果您有兴趣创建由Langchain提供支持的应用程序,我希望本指南提供有用的见解和指南。享受编码和探索语言模型的可能性!
请记住,聊天机器人是简化复杂过程并使信息更容易访问的强大工具。它们可以量身定制以满足各种需求,并有了正确的工具,例如Langchain和Openai,创建一个聪明的,上下文感知的聊天机器人比您想象的要容易。快乐的机器人建造!
关于作者
Banjo是AWS的高级开发人员倡导者,他帮助建筑商对使用AWS感到兴奋。班卓(Banjo)热衷于操作数据,并围绕使用数据开始了播客,聚会和开源项目。当不构建下一件大事时,班卓琴喜欢通过玩视频游戏,尤其是JRPG来放松身心,并探索周围发生的事件。