OpenAI’s GPT已成为全球最重要的AI工具,并且熟练根据其培训数据来解决查询。但是,它无法回答有关未知主题的问题,例如2021年9月之后的最近事件,您的非公共文档或过去对话中的信息。当您处理经常更改的实时数据时,此任务变得更加复杂。此外,您不能将广泛的内容馈送给GPT,也不能在长时间内保留您的数据。
在这种情况下,您需要有效地构建一个自定义LLM(语言学习模型)应用程序来为答案过程提供背景。您在Internet上找到的一种有希望的方法是利用 vector数据库的LLM ,其成本包括增加的准备工作,基础架构和复杂性。保持源和向量保持同步是痛苦的。取而代之的是,您可以在Python中使用开源的Abiaoqian -1图库来实现实时内存数据索引 直接从任何兼容存储中读取数据,并在简化UI上显示此数据。
这件作品将带您完成使用这些工具开发实时交易跟踪器的步骤。源代码在GitHub上。
学习目标
您将在整篇文章中学习以下内容:
- 您需要将自定义数据添加到chatgpt的原因。
- 如何使用嵌入,及时的工程和chatgpt进行更好的问答。
- 使用LLM应用程序与自定义数据建立自己的chatgpt。
- 创建一个用于查找实时折扣价格的Chatgpt Python API。
示例应用程序目标
受到本文围绕enterprise search的启发,我们的示例应用程序应揭示Python中的HTTP REST API端点,以通过检索各种来源(CSV,JSONLINE,API,MESSAGE BROKERS或DATABASE)的最新交易来回答有关当前销售的用户查询。 ,过滤器并根据用户查询或选择的数据源提供交易,利用OpenAi api Embeddings和Chat Completion端点来生成AI助手响应,并使用Streamlit。
提供用户友好的UI。当前,该项目支持两种类型的数据源,并且可以通过添加自定义输入连接器来扩展源:
- jsonlines-数据源期望每行具有一个
doc
对象。确保首先将输入数据转换为JSONLINE。在discounts.jsonl中查看样本数据 - Rainforest Product API-向我们提供Amazon products的所有可用每日折扣数据。
折扣跟踪器LLM应用程序建筑图
我们使用简化的UI(应用数据源)将此知识授予GPT后,请查看其回复:
该应用程序都考虑了Rainforest API和discounts.csv
文件文档(立即将数据合并到这些源的数据。),实时索引它们,并在处理查询时使用此数据。
为什么为ChatGpt提供自定义知识库?
在进行增强Chatgpt的方式之前,让我们首先探索这样做的手动方法并确定其挑战。通常,通过提示工程进行扩展。假设您想从各种在线市场找到实时折扣/交易/优惠券。
例如,当您问Chatgpt 时,您可以在本周为Adidas Men鞋子找到折扣吗?具有自定义知识是:
很明显,gptâ提供了一般建议 找到折扣,但缺乏特殊性 在何处或哪种类型的折扣等等。现在,为了帮助模型,我们将其从可信赖的数据源中补充折扣信息。您必须在发布实际问题之前添加初始文档内容来与ChatGpt互动。我们将从Amazon products deal数据集中收集此示例数据,并仅插入一个我们的JSON项目:
:您可以看到,您将获得预期的输出,这很容易实现,因为Chatgpt现在是上下文感知的。但是,这种方法的问题在于,模型上下文受到限制 - ( gpt-4最大文本长度为8,192个令牌)。当您可能期望成千上万的项目 时,此策略将很快成为问题,并且您无法提供此大量数据作为输入消息。另外,一旦收集了数据,您可能需要清洁,格式化和预处理数据以确保数据质量和相关性。如果您使用Openai Chat Completion endpoint或构建custom plugins for ChatGPT,它将引入其他问题,如下所示:
- 成本通过提供更详细的信息和示例,模型的性能可能会有所改善,尽管成本较高(对于GPT-4,输入为10K代币,输出为200令牌,每个预测的成本为0.624美元)。一再发送相同的请求可以升级成本,除非使用本地缓存系统。
- 延迟 - 将Chatgpt API(例如Openai的生产)挑战是它们的不可预测性。提供一致的服务没有保证。
- 安全性 - 在集成自定义插件时,必须在OpenAPI spec中指定每个API端点以进行功能。这意味着您可以向Chatgpt揭示内部API设置,许多企业对 的风险。
- 离线评估 对代码和数据输出进行离线测试或在本地复制数据流对开发人员而言是一项挑战。这是因为对系统的每个请求可能会产生不同的响应。
教程
您可以按照以下步骤了解如何构建A 折扣Finder应用。 project source code可以在Github上找到。如果您想快速开始使用该应用程序,则可以跳过此部分克隆存储库,并通过按照README.md文件中的说明来运行代码示例。该教程由两个部分组成:
第1部分:开发API
要添加用于chatgpt的自定义数据,首先,您需要按照LLM应用程序实时摄入,处理和实时摄入,处理和揭示数据的步骤。
步骤1.数据收集(自定义数据摄入)
为简单起见,我们可以将任何Jsonlines用作数据源。该应用程序采用jsonlines文件,例如discounts.jsonl,并在处理用户查询时使用此数据。数据源期望每行具有一个doc
对象。确保首先将输入数据转换为JSONLINE。这是带有单个RAW的JSONLINE文件的示例:
{"doc": "{'position': 1, 'link': 'https://www.amazon.com/deal/6123cc9f', 'asin': 'B00QVKOT0U', 'is_lightning_deal': False, 'deal_type': 'DEAL_OF_THE_DAY', 'is_prime_exclusive': False, 'starts_at': '2023-08-15T00:00:01.665Z', 'ends_at': '2023-08-17T14:55:01.665Z', 'type': 'multi_item', 'title': 'Deal on Crocs, DUNLOP REFINED(\u30c0\u30f3\u30ed\u30c3\u30d7\u30ea\u30d5\u30a1\u30a4\u30f3\u30c9)', 'image': 'https://m.media-amazon.com/images/I/41yFkNSlMcL.jpg', 'deal_price_lower': {'value': 35.48, 'currency': 'USD', 'symbol': '$', 'raw': '35.48'}, 'deal_price_upper': {'value': 52.14, 'currency': 'USD', 'symbol': '$', 'raw': '52.14'}, 'deal_price': 35.48, 'list_price_lower': {'value': 49.99, 'currency': 'USD', 'symbol': '$', 'raw': '49.99'}, 'list_price_upper': {'value': 59.99, 'currency': 'USD', 'symbol': '$', 'raw': '59.99'}, 'list_price': {'value': 49.99, 'currency': 'USD', 'symbol': '$', 'raw': '49.99 - 59.99', 'name': 'List Price'}, 'current_price_lower': {'value': 35.48, 'currency': 'USD', 'symbol': '$', 'raw': '35.48'}, 'current_price_upper': {'value': 52.14, 'currency': 'USD', 'symbol': '$', 'raw': '52.14'}, 'current_price': {'value': 35.48, 'currency': 'USD', 'symbol': '$', 'raw': '35.48 - 52.14', 'name': 'Current Price'}, 'merchant_name': 'Amazon Japan', 'free_shipping': False, 'is_prime': False, 'is_map': False, 'deal_id': '6123cc9f', 'seller_id': 'A3GZEOQINOCL0Y', 'description': 'Deal on Crocs, DUNLOP REFINED(\u30c0\u30f3\u30ed\u30c3\u30d7\u30ea\u30d5\u30a1\u30a4\u30f3\u30c9)', 'rating': 4.72, 'ratings_total': 6766, 'page': 1, 'old_price': 49.99, 'currency': 'USD'}"}
很酷的部分是,该应用程序始终意识到data文件夹的变化。如果添加了另一个JSONLINES文件,LLM应用程序确实会魔术并自动更新AI模型的响应。
步骤2:数据加载和映射
使用途径sâJSONlines input connector,我们将读取本地jsonlines文件,将数据输入映射到schema并创建途径Table。请参阅app.py中的完整源代码:
...
sales_data = pw.io.jsonlines.read(
"./examples/data",
schema=DataInputSchema,
mode="streaming"
)
将每个数据行映射到结构化文档架构中。请参阅app.py中的完整源代码:
class DataInputSchema(pw.Schema):
doc: str
步骤3:数据嵌入
每个文档是embedded,带有OpenAI API,并检索嵌入式结果。请参阅embedder.py中的完整源代码:
...
embedded_data = embeddings(context=sales_data, data_to_embed=sales_data.doc)
步骤4:数据索引
然后,我们在生成的嵌入式上构造一个即时索引:
index = index_embeddings(embedded_data)
步骤5:用户查询处理和索引
我们创建一个休息端,从API请求有效载荷中获取用户查询,并使用OpenAI API嵌入用户查询。
...
query, response_writer = pw.io.http.rest_connector(
host=host,
port=port,
schema=QueryInputSchema,
autocommit_duration_ms=50,
)
embedded_query = embeddings(context=query, data_to_embed=pw.this.query)
步骤6:相似性搜索和提示工程
我们通过使用索引来确定查询嵌入的最相关匹配项来执行相似性搜索。然后,我们构建一个提示,将用户查询与获取的相关数据结果合并,并将消息发送到Chatgpt完成端点以产生适当详细的响应。
responses = prompt(index, embedded_query, pw.this.query)
当我们制作提示并在prompt.py中添加了内部知识时,我们遵循了同样的文章学习方法。
prompt = f"Given the following discounts data: \\n {docs_str} \\nanswer this query: {query}"
步骤7:返回响应
最后一步只是将API响应返回给用户
# Build prompt using indexed data
responses = prompt(index, embedded_query, pw.this.query)
步骤9:将所有东西放在一起
现在,如果我们将上述所有步骤放在一起,则您可以在app.py python脚本中看到实现的自定义折扣数据的python api。
import pathway as pw
from common.embedder import embeddings, index_embeddings
from common.prompt import prompt
def run(host, port):
# Given a user question as a query from your API
query, response_writer = pw.io.http.rest_connector(
host=host,
port=port,
schema=QueryInputSchema,
autocommit_duration_ms=50,
)
# Real-time data coming from external data sources such as jsonlines file
sales_data = pw.io.jsonlines.read(
"./examples/data",
schema=DataInputSchema,
mode="streaming"
)
# Compute embeddings for each document using the OpenAI Embeddings API
embedded_data = embeddings(context=sales_data, data_to_embed=sales_data.doc)
# Construct an index on the generated embeddings in real-time
index = index_embeddings(embedded_data)
# Generate embeddings for the query from the OpenAI Embeddings API
embedded_query = embeddings(context=query, data_to_embed=pw.this.query)
# Build prompt using indexed data
responses = prompt(index, embedded_query, pw.this.query)
# Feed the prompt to ChatGPT and obtain the generated answer.
response_writer(responses)
# Run the pipeline
pw.run()
class DataInputSchema(pw.Schema):
doc: str
class QueryInputSchema(pw.Schema):
query: str
第2部分:添加一个交互式UI
要使您的应用程序更具互动性和用户友好,您可以使用Streamlitâ构建前端应用程序。请参阅此app.py文件中的实现。如您在下面的简化实施中提取的代码所示,它处理折扣API请求(我们在第1部分中暴露)如果选择了数据源并提供了问题:
if data_sources and question:
if not os.path.exists(csv_path) and not os.path.exists(rainforest_path):
st.error("Failed to process discounts file")
url = f'http://{api_host}:{api_port}/'
data = {"query": question}
response = requests.post(url, json=data)
if response.status_code == 200:
st.write("### Answer")
st.write(response.json())
else:
st.error(f"Failed to send data to Discounts API. Status code: {response.status_code}")
运行该应用程序
按照README.md文件中的说明如何运行项目部分运行应用程序。请注意,您需要将API和UI单独运行作为两个不同的过程。简化将自动连接到折扣后端API,您将看到UI前端在浏览器上运行。
流式UI用于折扣跟踪器。
从技术上讲,还有其他方法可以将路径的LLM应用与简化:
集成- 您可以作为子过程与子进程通信(插座或tcp/ip,可能具有随机端口,也许带有信号,例如触发一个可以拾取的状态转储) /腌制)。
- 也可以使用单个
docker compose up
命令运行该应用程序。请参阅readme.md文件中的run with the Docker部分。
包起来
我们只通过向chatgpt添加诸如折扣之类的领域知识来发现LLM App的一些功能。您可以实现更多的目标:
- 将来自外部API的其他数据以及各种文件(例如JSONLINE,PDF,DOC,HTML或文本格式),PostgreSQL或MySQL等数据库,以及来自Kafka,Redpanda或Debedizum等平台的数据库。 /li>
- 改进简化的UI以接受除雨林API以外的任何交易API。
- 保持数据快照以观察随着时间的推移销售价格的变化,因为Pathway提供了一个内置功能,以计算两个改动之间的差异。
- 除了通过API访问数据之外,LLM应用程序还可以使您可以将处理的数据传递到其他下游连接器,例如BI和分析工具。例如,将其设置为在检测价格转移时接收警报。
如果您有任何疑问,请在下面的评论中发布它们,或在LinkedIn和Twitter上与我联系。加入Discord channelâ,查看 AI聊天机器人助手使用LLM应用程序工作。
关于作者
请访问我的博客:âwww.iambobur.com